從鍵盤佈局開始說C#中的符號

前言:年關將至,因此到處都出現了各種各樣的總結和歸類文章。因此,這裏我也帶各位讀者對.NET中出現的符號總結一下,溫故知新,希望能將你可能對有些符號的模糊的記憶重新理清,對你有所啓示。

    程序員們,花5秒鐘將你的眼神從屏幕上挪開,看下你的鍵盤(e.g.圖1),找找鍵盤上那些熟悉的符號,作爲一個C#開發人員,你有沒有突然發現它們大部分都是那麼的親切呢?是的,看看鍵盤上的這些符號,大部分都已經被微軟用掉了,剩下的幾個雖然目前沒被用上,但我相信微軟內部應該也有人盯着他們,指不定哪天你就會發現一個新的符號用法會加入到C#中來。因爲符號在一門語言中往往比字母更能形象的傳文達意,同時給開發人員留下深刻的印象,最常見的例子就是+/-/*//這些數學操作符了,而且相對java來講,.net還支持用戶重載常用操作符。言歸正傳,下面我將按鍵盤佈局從左往右一一講解這些符號,順便也帶大家複習下這些符號。

x200-keyboard

                                              圖1,鍵盤符號圖

單個符號

   由於在C#中這些符號不僅單用,還有各種組合使用情況,因此這裏首先介紹它們但用的情況。

1. ~

    首先是按位求補符。這個符號可能有些同學見得比較少,不過它確實很有用。e.g. 1的32位表示爲0000 0000 0000 0000 0000 0000 0000 0001,那麼int a=~1實際爲-2,即1111 1111 1111 1111 1111 1111 1111 1110。另外,~在List的BinarySearch中將會使你的操作方便很多。在這個二分查找的實現中,如果查找的元素不在集合中,它會返回一個負值,技巧就在這裏,這個數的求補結果是下一個比查找元素大的元素的位置,如果沒有更大的元素,那麼它表示元素總數。這個技巧使得我們在插入新的元素的時候方便很多。e.g.

代碼
static void main()
{
List
<string> list = new List<string>();
int search;

list.Add(
"public");
list.Add(
"protected");
list.Add(
"private");
list.Sort();
search
= list.BinarySearch("protected internal");
if (search < 0)
{
list.Insert(
~search, "protected internal");
}
foreach (string accessModifier in list)
{
Console.WriteLine(accessModifier);
}
}

輸出結果爲:

private 
protected
protected internal
public

另外一個我們現在用得越來越少的就是析構函數中了,在構造函數前面添加~即可,它相當於告訴CLR你在對象註銷時需要釋放的操作。關於析構函數有下面需要注意的幾點:

  • 不能在結構中定義析構函數。只能對類使用析構函數。

  • 一個類只能有一個析構函數。

  • 無法繼承或重載析構函數。

  • 無法調用析構函數。它們是被自動調用的。

  • 析構函數既沒有修飾符,也沒有參數。

下面給出一個簡單的使用例子:
class Car
{
~ Car() // destructor
{
// 添加資源釋放操作代碼
}
}

不過通常建議是儘量少用析構函數,而以IDispose接口實現來釋放資源。

2. !,@,#和$

   !相信地球人都知道,非邏輯運算符,這裏不多講。@常用在字符串開頭,它可以告訴編譯器忽略轉義符,從而可以很方便的將一些特殊字符按用戶表達意願輸出,另外在Aspx.Net中這個字符常和其他字符混合使用。#和$微軟暫時沒盯上(表述錯誤,後面有補充)。不過$符號相信很多人都熟悉,大名鼎鼎的JQuery使得這個符號處處可見,不過不保證以後微軟也插上一腳。

4.%,^,&,*,(),-,+,=,{},|和\

     這些符號基本都是常見符號符號,因此這裏也只做簡單解釋。%是求餘運算符,^是異或位運算符,&則是且位運算符,另外|是或位運算符。*既可以用作乘法符號,還可以表示爲指針。()和{}用於對象中,前者一方面表示函數參數區域,另一方面在強制類型轉換時表示把一種類型強制轉換爲括號中的類型,除此,它還用來包裹運算部分從而制定運算優先級,後者則長表示代碼片段作用域,它既可以用於指代命名空間中的有哪些類或類中包括哪些屬性方法等,還可以用於在協助C#中某些特殊操作時指定其作用塊,如fixed,using等等,另外在字符串格式化中,{}和數字組合表示目標字符串中待替換子串位置, e.g. String.Format(“{0} + {1}={3}”, 1,2,3)。+通常表示相加數學運算符,=則長用來表示賦值操作。另外,這些操作符可以組合來表示不同含義,後面將會詳細說明這一部分。\用於轉義符的開始,如\n表示換行。

5.[]

   這個符號同樣常見,它通常有三種使用方式,一個是用於數組中表示索引位置,一種爲添加類型的特性時使用,另外它也常常和this關鍵字在類中配合使用來形成類索引。e.g.

class Some
{
int this[string item]
{
get
{
if(item==”a”)return 1;
return 0;
}
}
}

6. :,;',”,’,<,,,>,.,/,?

  :目前沒有單獨使用情況,後面會講到它的組合使用,;處處可見,C#不像VB,它用;表示語句的結束。”包裹字符串,’則包裹單個字符。<和>分別爲大和小的邏輯運算符,,用於分隔參數,.用於表示對象成員選擇器或小數點。/則表示除以的數學運算符。?單個常用於表示可空的值類型,e.g. int? a=null,它也可以與很多字符組合使用來表示不同意義。

符號組合

  好了,鍵盤上的符號鍵基本介紹完畢,在C#中,符號更爲強大的一面是它們之間不同組合產生不同的意義,這裏將會對此作出一些簡單介紹。

1. 單個字符重複組合

   這裏有?和+,-,&,|,<,>以及=。??同樣用於泛型中,它在值類型數據操作時非常有用,它可以在值類型爲空時指定默認值,e.g. int a=someNullable??100;它表示如果someNullable不爲空時則將其值賦給a,否則將100賦值給a,另外你也可以參考這篇文章。++和--表示自加或減1。&&,||和==則表示邏輯關係的且,或和相等。<<和>>則分別表示左右移位操作。最後//表示單行註釋,O(∩_∩)O~。

1. 數學運算符,位運算符,邏輯運算符和=的組合使用。

    和C/C++中類似,C#通過這兩種符號的組合簡化了程序員在常見數學運算時的輸入。如+=,-=,*=,/=,%=,還有&=,~=,|=等,它是一個數自身與某個數做相應數學操作的結果。如a+=10完整形式爲:a=a+10。邏輯運算符和=則表示或的關係,如>=表示大於或等於。

2. ?和:組合

  這個組合的符號不是緊挨着的,不過他們必須組合使用。這裏?和:組成條件表達式,e.g. int c= a==b?a:b; 它的存在同樣簡化程序員代碼。

3. =>組合以及<>配對

   =>組合是3.0以後加入的,它也是構成Lamda表達使得部分,它使得匿名函數的書寫更加簡潔。通常它前面會包含有表達式參數部分,後面則是表達式的主體部分。<>則在泛型中大量使用,它用來包裹類型參數。

4. ASPX頁面中的符號組合

    在ASPX中組合符號很多,一般基本都是左右尖括號和其他符號組合來表示服務器端腳本代碼,從而達到插入服務器代碼的目的。這裏僅列出一些常見符號組合。

      首先<%@ 和%>用來表示ASPX 2.0的Page指令,它一般出現在頁面頂部。在ASPX.NET頁面或用戶控件中有11個指令(注1),指令格式爲:<%@ [Directive] [Attribute=Value] %>。

      <%=%>用於在HTML代碼中插入.NET代碼片段。在Aspx.Net MVC中這個字符組合非常常見,這點類似以前的ASP,這也是有些程序員認爲MVC退回到ASP時代的一個原因。

總結

     符號在很多時候不僅比字符更加簡潔的表達意思,而且它還更形象和直觀,這也是符號在.net中出現的一個原因。不過符號並不是越多越好,所謂過猶不及,太多太複雜的符號有時候反而會讓程序員產生混淆和誤解。所以目前.NET中出現的符號數量並不是太多,並且未來.NET中符號應該是基本固定的。不過這並不妨礙微軟在適當的時候添加一些新的,有用的符號。比如有人在展望.NET 5.0的時候曾提到目前微軟推出的Vedea語言的一個很不錯的特性:綁定,它的符號爲:textbox.Text := slider.Value; 這意味着當Value改變的時候,Text也會相應改變。而雙向綁定的語法則有所不同:textbox.Text :=: slider.Value; 相信這個新的符號如果加入到.NET中來一定會讓我們的代碼比以前更加方便的!同時也期待類似的能簡化我們程序員並且形象,直觀的新特性符號能在未來出現。對了,你又期待有怎樣的新符號加入呢?

附:

    非常謝謝Arthas-Cui補充的總結的更多關於C#的符號用法,這裏我把它們補充上來吧。

    1,@

        有些時候我們可能需要用到一些.net裏面的關鍵字同名的變量來更準確的表達變量的含義,但關鍵字做變量在C#中是不被允許的,這個時候@就可以派上用場了。e.g.

public static void SomeMethod(this Form @this)
{
string a=@this.Text;
}

       這裏@this變量你用Reflector查看IL變量的話會發現它變成了this了,不過它在編譯器中還是被認作@this。如果有時候我們確實需要這種場景的話它會對你的代碼有所幫助。

    2,#

        有時候我們在處理了常見的異常之後最後可能會經常補充一個catch來捕獲所有其他未處理的異常信息,但這個catch可能並沒有寫上exception變量,e.g.catch{// 異常處理程序}。那麼如何獲取exception信息呢。這時候只要在即時窗口或者監視窗口輸入:$exception就可以了。

        關於#一個很常見並且很常用的場景Arthas-Cui也補充了,劃分代碼塊和條件編譯。e.g. 

#if
#else
#define
#region
#endregion
   3,$

       $符號在匿名方法時候編譯器會偷偷用到,這個我們可以通過查看IL代碼瞭解它的命名。不過這個方法對程序員是不可見的。機器產生的私有方法並不顯示在 IntelliSense 中,也不能顯式地調用它。

  

注1:Asp.Net中的11頁面或用戶控件指令爲:Assembly, Control, Implements, Import, Master, MasterType, OutputCache, Page, PreviousPageType, Reference, Register.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章