亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2015年04月10日 10:46:10   投稿:junjie  
這篇文章主要介紹了C#語法相比其它語言比較獨(dú)特的地方(三),本文講解了在C++中允許從一個(gè)case貫穿到另一個(gè)case標(biāo)簽、as和is只會(huì)檢測(cè)待轉(zhuǎn)化類型的類型,而不會(huì)進(jìn)行其它操作等內(nèi)容,需要的朋友可以參考下

1.在C++中允許從一個(gè)case貫穿到另一個(gè)case標(biāo)簽
比如:

復(fù)制代碼 代碼如下:

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

第一個(gè)case和第二個(gè)case之間可以沒有break
而在C#中這個(gè)break不能省略.
3.as和is只會(huì)檢測(cè)待轉(zhuǎn)化類型的類型,而不會(huì)進(jìn)行其它操作,所以只有當(dāng)轉(zhuǎn)化類型是目標(biāo)類型或者目標(biāo)類型的子類(當(dāng)然如果目標(biāo)類型是接口,并且待轉(zhuǎn)化類型實(shí)現(xiàn)了該接口也可以)才能轉(zhuǎn)換成功.
強(qiáng)制轉(zhuǎn)化,會(huì)調(diào)用系統(tǒng)定義(比如float轉(zhuǎn)化為int類型)或自己定義的轉(zhuǎn)化函數(shù)(通過implicit operator定義).

從常規(guī)的需求來看,大部分情況下,推薦使用as轉(zhuǎn)換.

但要注意as不能用于value type.因?yàn)樵谵D(zhuǎn)換不成功的時(shí)候返回null,而value type不能為
null.這時(shí)可以考慮用is.

復(fù)制代碼 代碼如下:

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

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

因?yàn)槲羞€引發(fā)了sun和MS的論戰(zhàn).
Anders早在Borland的時(shí)候就在Delphi中引入了delegate,后來跑到MS,弄J#的時(shí)候又添加進(jìn)了delegate,Sun很不滿意,說他們破壞了Java語言的特性.
到了C#,Anders終于可以名正言順地添加delegate了.


-------------------------------

狗尾續(xù)貂(二)

1.internal protected取的是internal和protected的并集,即在同一個(gè)Assembly或者不同
的Assembly內(nèi)但是繼承自該類都可以訪問.

3..NET FrameWork采用了字符串緩沖池技術(shù).
比如 string a = "test";和string b = "test";a和b指向內(nèi)存中的同一塊區(qū)域.
另外C#中有幾種判等方式,是否重寫可參照如下規(guī)則:

復(fù)制代碼 代碼如下:

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

上述四個(gè)方法override應(yīng)該遵循如下規(guī)則:

1.前兩個(gè)無論如何不要override
2.第三個(gè)和第四個(gè)在自定義類型是ValueType的時(shí)候要改寫
3.當(dāng)自定義類型是ReferenceType的時(shí)候,如果想改變RefrenceType默認(rèn)的用對(duì)象標(biāo)志判等的方式,可以改寫第三個(gè)

4.當(dāng)自定義類型是RefrenceType的時(shí)候,最好不要改寫operator==.

下面分別給出上述規(guī)則的原因:

1.

A.ReferenceEquals()這個(gè)方法當(dāng)且僅當(dāng)兩個(gè)變量指向同一對(duì)象的時(shí)候才相等,它的實(shí)現(xiàn)是比較對(duì)象標(biāo)志(Object Identity,任何對(duì)象在創(chuàng)建的時(shí)候都會(huì)生成一個(gè)OI),所以任何值類型用ReferenceEquals()比較所得到的結(jié)果都是false,即使跟自己比較也是,因?yàn)橐b箱,裝箱的結(jié)果肯定不是同一個(gè)對(duì)象.所以這個(gè)方法也就沒有改寫的必要.object的ReferenceEquals()是實(shí)現(xiàn)這種比較最好的方式.

B.Equals (object left, object right )這個(gè)方法用于在不知道待比較的參數(shù)是何種類型的時(shí)候.那如何比較兩個(gè)變量是否相等那?很簡(jiǎn)單,把比較相等的職責(zé)交給其中一個(gè)待比較變量的Equals方法,上述方法的實(shí)現(xiàn)大概如下所述:

復(fù)制代碼 代碼如下:

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);
}

之所以不要重寫上述兩個(gè)方法,是因?yàn)閮烧叨己芎玫膶?shí)現(xiàn)了各自的語意.

2.為什么是值的時(shí)候要重寫第三個(gè)方法?

ValueType是所有值類型的基類,由于要實(shí)現(xiàn)值相等的語意,它重寫了object的Equals方法,但是在不知道派生類變量和其類型的情況下,ValueType的Equals在實(shí)現(xiàn)的時(shí)候只能用反射來比較,這樣的效率是很低的,所以任何自定義的值類型都要重寫Equals,以避免用ValueType的默認(rèn)實(shí)現(xiàn)帶來的反射的效率損失.

3.object的實(shí)例Equals方法的默認(rèn)實(shí)現(xiàn)跟ReferenceEqual一樣,是通過比較對(duì)象標(biāo)志來實(shí)現(xiàn)的,有些ReferenceType需要值相等的語意,比如string,這是就要改寫實(shí)例Equals.

4..Net FrameWork期望所有的ReferenceType的operator==保留引用語意.

相等在語意上必須滿足三點(diǎn)

1.自反       a=a必須永遠(yuǎn)成立;
2.對(duì)稱       a=b則b=a;
3.傳遞       a=b;b=c則a=c

復(fù)制代碼 代碼如下:

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

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

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


第三步如果可以轉(zhuǎn)化成this引用的對(duì)象不行嗎?

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

復(fù)制代碼 代碼如下:

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將永遠(yuǎn)輸出Not Equal.所以在這種情況下將違反相等語意中的對(duì)稱性.
所以還是老老實(shí)實(shí)在第三步Check類型哈.
上面例子中D比B多了一句:
復(fù)制代碼 代碼如下:

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

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

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

相關(guān)文章

  • 淺析C#中StringBuilder類的高效及與String的對(duì)比

    淺析C#中StringBuilder類的高效及與String的對(duì)比

    StringBuilder類所創(chuàng)造出來的字符串對(duì)象在拼接操作等方面比普通的string類往往要高效很多,這是它們?cè)趦?nèi)存劃分方式上的不同所決定的,下面就來淺析C#中StringBuilder類的高效及與String的對(duì)比
    2016-05-05
  • C# 多線程編程技術(shù)基礎(chǔ)知識(shí)入門

    C# 多線程編程技術(shù)基礎(chǔ)知識(shí)入門

    這篇文章主要介紹了C# 多線程編程技術(shù)基礎(chǔ)知識(shí),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2020-02-02
  • C#中迭代器和分部類的使用

    C#中迭代器和分部類的使用

    迭代器和分部類是C#語言的兩種重要特性,本文主要介紹了C#中迭代器和分部類的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • C#制作網(wǎng)站掛機(jī)程序的實(shí)現(xiàn)示例

    C#制作網(wǎng)站掛機(jī)程序的實(shí)現(xiàn)示例

    本文主要介紹了C#制作網(wǎng)站掛機(jī)程序,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • String.Format大全(C# Java)

    String.Format大全(C# Java)

    String.format無論是在C#中還是在java中應(yīng)用都非常廣泛,今天小編抽個(gè)時(shí)間把有關(guān)string.format知識(shí)總結(jié)分享給大家,需要的朋友可以參考下
    2015-09-09
  • Unity幸運(yùn)轉(zhuǎn)盤實(shí)戰(zhàn)項(xiàng)目

    Unity幸運(yùn)轉(zhuǎn)盤實(shí)戰(zhàn)項(xiàng)目

    這篇文章主要為大家詳細(xì)介紹了Unity幸運(yùn)轉(zhuǎn)盤實(shí)戰(zhàn)項(xiàng)目,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • c#之事件用法

    c#之事件用法

    這篇文章介紹了c#中事件的用法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • C# winform點(diǎn)擊生成二維碼實(shí)例代碼

    C# winform點(diǎn)擊生成二維碼實(shí)例代碼

    這篇文章主要介紹了 C# winform點(diǎn)擊生成二維碼實(shí)例代碼,需要的朋友可以參考下
    2017-04-04
  • C#中哈希表(Hashtable)的介紹及簡(jiǎn)單用法

    C#中哈希表(Hashtable)的介紹及簡(jiǎn)單用法

    在.NET Framework中,Hashtable是System.Collections命名空間提供的一個(gè)容器,用于處理和表現(xiàn)類似key/value的鍵值對(duì)
    2013-03-03
  • C#給Word不同頁面設(shè)置不同背景

    C#給Word不同頁面設(shè)置不同背景

    這篇文章主要介紹了C#給Word不同頁面設(shè)置不同背景,文章圖文講解的很清晰,有對(duì)于這方面不懂得同學(xué)可以學(xué)習(xí)下
    2021-02-02

最新評(píng)論