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其實就是指針,在函數之間傳遞用的是拷貝傳值.
新聞熱點
疑難解答