c#主要支援下面所示的運算子:Code
算術運算子 + - * / %
邏輯運算子 & | ^ ~ && || !
字串串連運算子 +
增量和遞減運算子 ++ --
移位元運算符 << >>
比較子 == != < > <= >=
賦值運算子 = += -= *= /= %= |= ^= <<= >>=
成員訪問運算子(用於對象和結構) .
索引運算子(用於數組和索引器) []
資料類型轉換運算子 ()
條件運算子(三元運算子) ?:
委託串連和刪除運算子 + -
對象建立運算子 new
類型資訊運算子 sizeof(只用於不安全的代碼) is as typeof
溢出異常控制運算子 checked unchecked
間接定址運算子 * -> &(只用於不安全的代碼) []
命名空間別名限定符 ::
空接合運算子 ??
比較不常用卻又很重要的運算子:
1、is運算子和as運算子
is運算子可以檢查對象是否與特定的類型相容。比如下例中要檢查變數是否與object類型相容:int i=0;
if(i is object)
{
Console.WriteLine("i is an object.");
}
as運算子用於執行參考型別的顯式類型轉換。如果要轉換的類型和指定的類型相容,轉換就會成功進行;如果類型不相容,as運算子就會傳回值null。舉例如下:object obj1="a string";
object obj2=5;
string str1= obj1 as string;// str1="a string";
string str2= obj2 as string;//str2=null;
註:as運算子允許在一步中進行安全的類型轉換,不需要先使用is運算子測試類型,再執行轉換。
2、checked和unchecked運算子
有如下的代碼:byte b=255;
b++;
Console.WriteLine(b.ToString());
byte資料類型只能包含0~255的數,所以b值的增量會溢出。CLR如何處理溢出?C#提供了checked和unchecked運算子。如果把一塊程式碼片段標誌為checked,CLR就會執行溢出檢查,如果發生異常,就拋出異常。byte b=255;
checked
{
b++; //拋出OverflowException
}
Console.WriteLine(b.ToString());
如果要禁止溢出檢查,可以把代碼標記為unchecked:byte b=255;
unchecked
{
b++;
}
Console.WriteLine(b.ToString());
在上述代碼中,不會拋出異常,但會遺失資料,因為byte資料類型不能包含256位,溢出的位會丟失,b變數得到的值是0.
註:unchecked是預設值。只有在需要把幾個未檢查的程式碼放在一個明確標記為checked的大代碼塊中,才需要顯式使用unchecked關鍵字。
3、sizeof運算子
學過c的都知道,sizeof可以用來確定堆棧中實值型別需要的長度(單位是位元組):unsafe
{
Console.WriteLine(sizeof(int));//結果為4,因為int有四個位元組,32位
}
4、可空類型和運算子
如果在程式中使用可空類型,就必須考慮null值在與各種運算子一起使用時的影響。通常可空類型與一元或二元運算子一起使用時,如果其中一個運算元或兩個運算元都是null,其結果就是null。int?a = null;
int?b = a+4; //b=null;
int?c = a*2; //c=null;
注意,在比較可空類型時,只有有一個運算元是null,比較的結果就是false。即不能認為因為一個條件是false,那麼它的對立面就是true。int?a=null;
int?b=10;
if(a>=b) //空值a顯然不能和b比較
Console.WriteLine("a>=b");
else
Console.WriteLine("a<b");
5、空接合運算子(??)
空接合運算子為處理可空類型和參考型別時表示Null值的可能性提供了一種捷徑。這個運算子放在兩個運算元之間,第一個運算元必須是一個可空類型或參考型別,第二個運算元必須與第一個運算元的類型不同,或者可以隱含地轉換為第一個運算元的類型。空接合運算子的計算如下:如果第一個運算元不是null,則整個運算式就等於第一個運算元的值。但如果第一個運算元是null,則整個運算式就等於第二個運算元的值。例如:int?a=null;
int b;
b=a??10; // b的值為10;
a=15;
b=a??10;// b的值為15;
注意:如果第二個運算元不能隱含地轉換為第一個運算元的類型,就產生一個編譯錯誤。