運算符
C# 提供了 Java 支持的所有可用運算符,如下表所示。在表的末尾,您將看到一些新的運算符,它們可以在 C# 中使用而不可以在 Java 中使用:
運算符 類別 符號 [Text] [Text] 一元 ++ -- + - ! ~ () 乘法 * / % 加法 + - 移位 << >> 關系 < > <= >= instanceof 相等 == != 邏輯與 & 邏輯異或 ^ 邏輯或 | 條件與 && 條件或 || 條件 ? : 賦值 = *= /= %= += -= <<= >>= &= ^= |= 操作數的類型 typeof 操作數的大小 sizeof 執行溢出檢查 checked 取消溢出檢查 unchecked唯一不可以在 C# 中使用的 Java 運算符是 >>> 移位運算符。之所以在 Java 中存在此運算符,是因為該語言中缺乏無符號變量,例如在需要右移位以在最高有效比特位插入 1 時。
然而,C# 支持無符號變量,因而 C# 只需要標准 >> 運算符。取決於操作數是否帶有符號,此運算符產生不同的結果。右移一個無符號數會在最高有效比特位插入 0,而右移一個有符號數則會復制前面的最高有效比特位。
checked 和 unchecked 運算符
如果對於分配給正在使用的數據類型的比特數來說結果太大,則算術運算會產生溢出。對於特定的整數算術運算,通過使用 checked 和 unchecked 關鍵字,可以檢查或忽略這樣的溢出。如果表達式是一個使用 checked 的常量表達式,則會在編譯時產生錯誤。
下面這個簡單的示例說明了這兩個運算符的用法
using System;
public class Class1
{
public static void Main(string[] args)
{
short a = 10000, b = 10000;
short d = unchecked((short)(10000*10000));
Console.WriteLine(d= + d);
short c = (short)(a*b);
Console.WriteLine(c= + c);
short e = checked((short)(a*b));
Console.WriteLine(e= + e);
}
}
在這段代碼中,unchecked 運算符避免了發生編譯時錯誤,否則,下面的語句會產生錯誤:
short d = unchecked((short)(10000*10000));
下一個表達式在默認情況下是不檢查的,因此值會悄悄溢出:
short c = (short)(a*b);
我們可以使用 checked 運算符來強制檢查該表達式是否會在運行時溢出:
short e = checked((short)(a*b));
當運行時,賦第一個值給 d & c 會以值 -7936 悄悄溢出,但是當試圖使用 checked() 以獲得 e 的乘積值時,程序會引發 System.OverflowException 異常。
注意:另外,通過使用命令行編譯器開關 (/checked) 或者直接在Visual Studio 中基於每個項目使用此開關,您還可以控制是否檢查代碼塊中的算術溢出。
is 運算符
此運算符確定左邊對象的類型是否與右邊指定的類型相匹配:
if (objReference is SomeClass) ...
在下面的示例中,CheckType() 方法打印一條消息,描述傳遞給它的參數的類型:
using System;
public class ShowTypes
{
public static void Main(string[] args)
{
CheckType (5);
CheckType (10f);
CheckType ("Hello");
}
private static void CheckType (object obj)
{
if (obj is int)
{
Console.WriteLine("Integer parameter");
}
else if (obj is float)
{
Console.WriteLine("Float parameter");
}
else if (obj is string)
{
Console.WriteLine("String parameter");
}
}
}
運行此程序,輸出如下:
Integer parameter
Float parameter
String parameter
sizeof 運算符
sizeof 運算符以指定值類型的字節數返回其大小,如下面的代碼所示:
using System;
public class Size
{
public static void Main()
{
unsafe
{
Console.WriteLine("The size of short is {0}.", sizeof(short));
Console.WriteLine("The size of int is {0}.", sizeof(int));
Console.WriteLine("The size of double is {0}.",sizeof(double));
}
}
}
注意,包含 sizeof 運算符的代碼放在一個不安全的塊中。這是因為 sizeof 運算符被認為是一個不安全的運算符(由於它直接訪問內存)。