亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#語法相比其它語言比較獨特的地方(三)

2020-01-24 02:00:32
字體:
來源:轉載
供稿:網友

1.在C++中允許從一個case貫穿到另一個case標簽
比如:

復制代碼 代碼如下:

int a =1;
switch(a)
{
  case 1:
     some statements;
  case 2;
     other statements;
     break;
}

第一個case和第二個case之間可以沒有break
而在C#中這個break不能省略.
3.as和is只會檢測待轉化類型的類型,而不會進行其它操作,所以只有當轉化類型是目標類型或者目標類型的子類(當然如果目標類型是接口,并且待轉化類型實現了該接口也可以)才能轉換成功.
強制轉化,會調用系統定義(比如float轉化為int類型)或自己定義的轉化函數(通過implicit operator定義).

從常規的需求來看,大部分情況下,推薦使用as轉換.

但要注意as不能用于value type.因為在轉換不成功的時候返回null,而value type不能為
null.這時可以考慮用is.

復制代碼 代碼如下:

object o = 1;
int i = 0;
if(o is int)
i = (int)o;

6.const是編譯時常量
readonly是運行時常量
推薦使用static readonly代替const
const變量被硬編碼進assembly,有版本問題.
C#只是用sealed替代了fianl,另外C#的派生類在默認情況下不會override基類方法,只有當基類方法用關鍵字virtual標志,并且子類顯式用override標志方法時才會override.這樣也有效地解決了版本問題.
7.delegate在本質上就是函數指針.

因為委托還引發了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#中有幾種判等方式,是否重寫可參照如下規則:

復制代碼 代碼如下:

public static bool ReferenceEquals( object left, object right );
public static bool Equals ( object left, object right );
public virtual bool Equals( object right);
public static bool operator==( MyClass left, MyClass right );

上述四個方法override應該遵循如下規則:

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方法,上述方法的實現大概如下所述:

復制代碼 代碼如下:

public static bool Equals( object left, object right )
{
  // Check object identity
  if (left == right )
    return true;
  // both null references handled above
  if ((left == null) || (right == null))
    return false;
  return left.Equals (right);
}

之所以不要重寫上述兩個方法,是因為兩者都很好的實現了各自的語意.

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

復制代碼 代碼如下:

public class Foo
{
  public override bool Equals( object right )
  {
    //1.判斷待比較變量引用是否為空
    if (right == null)
      return false;
 //2.是否指向同一實例,如果是同一實例則必然相等.
    if (object.ReferenceEquals( this, right ))
      return true;

    //3. 判斷類型是否相同
    if (this.GetType() != right.GetType())
      return false;

    // 4.比較內容
    return CompareFooMembers(
      this, right as Foo );
  }
}


第三步如果可以轉化成this引用的對象不行嗎?

答案是不行,必須是類型相同的.舉例如下:

復制代碼 代碼如下:

public class B
{
  public override bool Equals( object right )
  {
    // check null:
    if (right == null)
      return false;

    // 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" );


留意一下加粗的部分就知道,如果B的CompareBMembers和D的CompareDMembers比較的元素相等的話,Comparison 1將輸出Equals,而Comparison 2將永遠輸出Not Equal.所以在這種情況下將違反相等語意中的對稱性.
所以還是老老實實在第三步Check類型哈.
上面例子中D比B多了一句:
復制代碼 代碼如下:

if (base.Equals( rightAsD ) == false)
      return false;

很明顯,基類的元素肯定要讓基類去判斷是否相等.但是如果某個類的直接基類是object千萬必要調用base.Equals了,要不然跟沒有重寫實例Equals是一樣的效果

4.跟C++的引用不一樣,ref和out其實就是指針,在函數之間傳遞用的是拷貝傳值.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国精产品一区一区三区有限在线| 日韩av片电影专区| 日韩欧美一区二区三区| 国产精品激情av电影在线观看| 国产在线视频2019最新视频| 91国产在线精品| 午夜精品蜜臀一区二区三区免费| 尤物九九久久国产精品的特点| 国产精品a久久久久久| 一级做a爰片久久毛片美女图片| 国产成人精品最新| 久久中文字幕视频| 91在线观看免费网站| 欧美激情欧美狂野欧美精品| 91欧美精品成人综合在线观看| 久久久精品一区二区三区| 欧美精品免费在线观看| 国产香蕉精品视频一区二区三区| 国产精品久久77777| 中文字幕无线精品亚洲乱码一区| 91九色视频导航| 欧美电影在线观看网站| 久久噜噜噜精品国产亚洲综合| 国产精品99久久久久久白浆小说| 亚洲精品按摩视频| 姬川优奈aav一区二区| 日韩欧美一区二区在线| 日韩一区二区av| 伊人久久精品视频| 97婷婷大伊香蕉精品视频| 日韩一级黄色av| 国产精品99久久久久久www| 国产精品高精视频免费| 亚洲国产精品专区久久| 国产精品久久久久久久久免费| 国产精品视频免费在线观看| 中文字幕日韩综合av| 91精品在线一区| 97av在线播放| 正在播放国产一区| 久久夜色精品国产欧美乱| 中文字幕日韩av电影| 亚洲精品美女免费| 黑人精品xxx一区一二区| 精品无人国产偷自产在线| 亚洲精品久久久久久下一站| 欧美乱大交xxxxx| 成人国产在线激情| 亚洲三级 欧美三级| 国产一区二区三区在线视频| 奇米四色中文综合久久| 亚洲黄色av女优在线观看| 黑人极品videos精品欧美裸| 中文字幕亚洲综合久久| 久久久视频精品| 亚洲精品福利免费在线观看| 91社影院在线观看| 欧美国产日韩二区| 国产精品视频大全| 亚洲香蕉在线观看| 正在播放国产一区| 性欧美xxxx视频在线观看| 亚洲wwwav| 国产va免费精品高清在线| 亚洲国产成人在线播放| 国产精品视频自在线| 欧美日本啪啪无遮挡网站| 国产午夜精品全部视频在线播放| 欧洲美女免费图片一区| 国产精品永久免费在线| 琪琪亚洲精品午夜在线| 国产精品久久久久一区二区| 国产精品999999| 久久这里有精品视频| 色噜噜久久综合伊人一本| 亚洲一区二区三区四区在线播放| 国产激情999| 丝袜亚洲欧美日韩综合| 亚洲精选在线观看| 欧美高清视频免费观看| 97国产suv精品一区二区62| 日韩在线观看电影| 精品久久久久久久久久| 俺去啦;欧美日韩| 欧美精品在线极品| 久久精品视频导航| 青青草原成人在线视频| 久久手机免费视频| 最新91在线视频| 国内精品久久久久伊人av| 色噜噜狠狠狠综合曰曰曰88av| 岛国av一区二区| 日韩视频免费在线| 一本色道久久88综合亚洲精品ⅰ| 成人午夜一级二级三级| 日本一区二区三区四区视频| 97在线视频免费| 一本色道久久88精品综合| 九九热r在线视频精品| 久久久久国产精品一区| 欧美日韩裸体免费视频| 不卡在线观看电视剧完整版| 两个人的视频www国产精品| 欧美精品aaa| 亚洲最大的av网站| 亚洲性线免费观看视频成熟| 国产精品日本精品| 精品性高朝久久久久久久| 久久久久久亚洲精品不卡| 91精品国产91久久久久| 久久久久久久久久国产精品| 亚洲a∨日韩av高清在线观看| 精品国产鲁一鲁一区二区张丽| 亚洲全黄一级网站| 亚洲电影在线观看| 国产亚洲成精品久久| 奇米四色中文综合久久| 伊人久久久久久久久久久久久| 欧美性猛交xxxx富婆弯腰| 欧美亚洲在线播放| 欧美激情视频一区| 亚洲国产女人aaa毛片在线| 成人xxxx视频| 国产精品国产亚洲伊人久久| 精品视频—区二区三区免费| 国产精品精品视频| 欧美孕妇毛茸茸xxxx| 欧美性videos高清精品| 欧美性视频精品| 亚洲精品福利资源站| 久久精品国产一区二区电影| 亚洲性猛交xxxxwww| 色婷婷**av毛片一区| 欧美大尺度电影在线观看| 亚洲国产欧美自拍| 久久久之久亚州精品露出| 亚洲少妇中文在线| 69av视频在线播放| 亚洲欧美一区二区精品久久久| 国产成人亚洲综合青青| 国产精品久久久久久久一区探花| 欧美午夜精品久久久久久人妖| 欧美激情国产日韩精品一区18| 亚洲精品乱码久久久久久金桔影视| 国产精品久久久久久久久久三级| 精品综合久久久久久97| 欧美日韩国内自拍| 日韩hd视频在线观看| 欧美尤物巨大精品爽| 一本色道久久88精品综合| 亚洲成人xxx| 日韩中文字幕av| 久久久av电影| 欧美第一黄网免费网站| 美女扒开尿口让男人操亚洲视频网站| 日韩美女视频免费在线观看| 日韩精品在线观看网站| 91视频国产精品| 不卡av电影院| 日本乱人伦a精品| 亚洲跨种族黑人xxx| 欧美最猛性xxxxx亚洲精品| 69av视频在线播放| 亚洲a成v人在线观看|