C#文法中比較特別之處–卷一

來源:互聯網
上載者:User

由於c#是由設計.net本身的人設計出來的,所以c#才是.net上最一流的語言。
實際上,已經有一百多萬行c#代碼用於實現.Net class framework。
要發揮出.net平台全部的效能,只有c#才是首選。

1,switch語句可以用來測試string型的對象
這在c,c++,java等其他各主流語言中都是不可以的,唯獨c#可以。
例如string a="haha";
switch(a)
{
    case "dfj":
     ...
    break;
    case "djkfdjkf":
    ....
    break;
    case "haha":
     .....
    break;
    default:
    ....
}
2,多維陣列
這也是c#的特色,像java也沒有多維陣列,只有數組的數組。
c#中不但有數組的數組,也有多維陣列。
數組的數組的特點是(拿二維為例),每一行的元素個數可以不同。
比如int [][] c=new int[2][];
c[0]={3,4,5,6};
c[1]={1};
c#中的多維陣列的形式是這樣定義
int [,] c=new int[3,4];
這樣的c就是一個三行四列的二維數組。

3,as與is
java中也有類似於is的文法,用於在運行時判斷一個對象的類型,叫做instanceof。
c#中就是一個is,判斷o是不是一個string:   o is string
as則是一個很窩心的功能,它首先對這個對象進行判斷是否是某種類型,如果是就進行類
型轉換,如果不是,就返回null。
  如:   o as string

4,foreach語句
java5以後for語句就多了foreach功能,這也許就是因為之前沒有,而c#有,使得自己非常
嫉妒,所以馬上給添上了。
c#中的foreach功能是非常方便的。
例如遍曆一個數組
string[] sentences=...;
foreach(string st in sentences)
{
  ....
}
5,索引器和Property
不得不承認,我的偶像Anders實現出來的c#確實非常優秀。
我把索引器和Property歸為一類。
都是從Class中讀取某種屬性,如果知道java的POJO的人肯定知道,java bean的標準形式
就是一堆private屬性,然後一個getter,一個setter,這是標準,但實現確實使用的普通
成員方法。
c#則更絕,它直接在Class中聲明一個單獨的field,然後在文法中直接設計了getter和set
ter的簡化寫法,這就是我們熟知的Property。
如:
public class WordCount
{
  private string m_string;
  public string OutFile
  {
     get{...}
     set{...value...}
  }
}
這樣真正做到了封閉改動,開放擴充。
然後就是索引器,我覺得java中只有EL才有點做出了類似索引器的功能,這也只是方便了
寫jsp的人,而且很多廠商居然不在自己的容器中包含EL解析,這不得不讓sun很無奈。
索引器就是給幾個參數,返回一個屬性。
如:
public int this[string index]
{
  get{...}
  set{..value}
}
public int this[int x,int y]
{
  get{}
  set{..value}
}

6,const和readonly
這點c#讓我有點失望,對於非Ref型就是const,對於Ref型就是readonly。
而在java中,一個final就行了。當然對於不可繼承的類,c#又有一個關鍵字sealed,
雖然這讓程式的含義更明確,但確實也多記了好幾個關鍵字。

7,delegate型別
說實話,這種奇怪的文法還是第一次見到,說跟C++中重載operator()的功能像吧,又不是
太像。
總而言之,覺得它實現可能就是記下一堆同類型的函數指標,然後可以依次調用而已。
首先需要聲明一個delegate型別,注意是型別而不是對象。
如public delegate void Action();
注意既然是型別,那就跟enum,class是同等的,注意型別能夠出現的位置。
然後我們就可以定義這種型別的對象來使用了。
Action aaa=new Action(...);
這個...代表的是符合這種函數原形的函數名字,注意使用delegate機制來調用,和直接調
用函數本質上沒有什麼不同,就是說,當你調用成員函數的時候,當然你需要有一個對象
,而調用靜態函數的時候,你可以直接使用類名了。
這種delegate型別對象還有點特殊,它可以使用運算子+=和-=來增加或者減少本對象所代
理的函數集,當然還有更多的方法用來看當前我代理了多少個函數之類的。
aaa+=new Action(xxx);
aaa+=new Action(ooo);
然後aaa(),意味著順序調用xxx和ooo。
aaa.GetInvocationList().length可以看到當前代理了多少個函數。
你不用擔心代理的普通成員函數的所屬對象會被記憶體回收行程回收,直到此代理對象不再引
用這個函數,當然這個也是壞訊息,說不定你都忘了還有某個代理對象代理著要死的對象
的函數,讓這個對象老不死。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.