1.在c++中允许从一个case贯穿到另一个case标签
比如:
从常规的需求来看,大部分情况下,推荐使用as转换.
但要注意as不能用于value type.因为在转换不成功的时候返回null,而value type不能为
null.这时可以考虑用is.
因为委托还引发了sun和ms的论战.
anders早在borland的时候就在delphi中引入了delegate,后来跑到ms,弄j#的时候又添加进了delegate,sun很不满意,说他们破坏了java语言的特性.
到了c#,anders终于可以名正言顺地添加delegate了.
-------------------------------
狗尾续貂(二)
1.internal protected取的是internal和protected的并集,即在同一个assembly或者不同
的assembly内但是继承自该类都可以访问.
3..net framework采用了字符串缓冲池技术.
比如 string a = "test";和string b = "test";a和b指向内存中的同一块区域.
另外c#中有几种判等方式,是否重写可参照如下规则:
1.前两个无论如何不要override
2.第三个和第四个在自定义类型是valuetype的时候要改写
3.当自定义类型是referencetype的时候,如果想改变refrencetype默认的用对象标志判等的方式,可以改写第三个
4.当自定义类型是refrencetype的时候,最好不要改写operator==.
下面分别给出上述规则的原因:
1.
a.referenceequals()这个方法当且仅当两个变量指向同一对象的时候才相等,它的实现是比较对象标志(object identity,任何对象在创建的时候都会生成一个oi),所以任何值类型用referenceequals()比较所得到的结果都是false,即使跟自己比较也是,因为要装箱,装箱的结果肯定不是同一个对象.所以这个方法也就没有改写的必要.object的referenceequals()是实现这种比较最好的方式.
b.equals (object left, object right )这个方法用于在不知道待比较的参数是何种类型的时候.那如何比较两个变量是否相等那?很简单,把比较相等的职责交给其中一个待比较变量的equals方法,上述方法的实现大概如下所述:
2.为什么是值的时候要重写第三个方法?
valuetype是所有值类型的基类,由于要实现值相等的语意,它重写了object的equals方法,但是在不知道派生类变量和其类型的情况下,valuetype的equals在实现的时候只能用反射来比较,这样的效率是很低的,所以任何自定义的值类型都要重写equals,以避免用valuetype的默认实现带来的反射的效率损失.
3.object的实例equals方法的默认实现跟referenceequal一样,是通过比较对象标志来实现的,有些referencetype需要值相等的语意,比如string,这是就要改写实例equals.
4..net framework期望所有的referencetype的operator==保留引用语意.
相等在语意上必须满足三点
1.自反 a=a必须永远成立;
2.对称 a=b则b=a;
3.传递 a=b;b=c则a=c
//3. 判断类型是否相同
if (this.gettype() != right.gettype())
return false;
// 4.比较内容
return comparefoomembers(
this, right as foo );
}
}
答案是不行,必须是类型相同的.举例如下:
// check reference equality:
if (object.referenceequals( this, right ))
return true;
// problems here, discussed below.
b rightasb = right as b;
if (rightasb == null)
return false;
return comparebmembers( this, rightasb );
}
}
public class d : b
{
// etc.
public override bool equals( object right )
{
// check null:
if (right == null)
return false;
if (object.referenceequals( this, right ))
return true;
// problems here.
d rightasd = right as d;
if (rightasd == null)
return false;
if (base.equals( rightasd ) == false)
return false;
return comparedmembers( this, rightasd );
}
}
//test:
b baseobject = new b();
d derivedobject = new d();
// comparison 1.
if (baseobject.equals(derivedobject))
console.writeline( "equals" );
else
console.writeline( "not equal" );
// comparison 2.
if (derivedobject.equals(baseobject))
console.writeline( "equals" );
else
console.writeline( "not equal" );
4.跟c++的引用不一样,ref和out其实就是指针,在函数之间传递用的是拷贝传值.
如对本文有疑问, 点击进行留言回复!!
C# 对PDF文档加密、解密(基于Spire.Cloud.SDK for .NET)
Unity通用泛型单例设计模式(普通型和继承自MonoBehaviour)
网友评论