陋室铭
永远也不要停下学习的脚步(大道至简至易)

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 parameterFloat parameterString 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 运算符被认为是一个不安全的运算符(由于它直接访问内存)。有关不安全代码的更多信息,请参见安全代码和不安全代码

typeof 和 GetType

typeof 运算符返回作为 System.Type 对象传递给它的类的类型。GetType() 方法是相关的,并且返回类或异常的运行时类型。typeof 和 GetType() 都可以与反射一起使用,以动态地查找关于对象的信息,如下面的示例所示:

using System;using System.Reflection;public class Customer{ string name; public string Name { set { name = value; } get { return name; } }}public class TypeTest{ public static void Main() { Type typeObj = typeof(Customer); Console.WriteLine("The Class name is {0}", typeObj.FullName); // Or use the GetType() method: //Customer obj = new Customer(); //Type typeObj = obj.GetType(); Console.WriteLine("\nThe Class Members\n=================\n "); MemberInfo[] class_members = typeObj.GetMembers(); foreach (MemberInfo members in class_members) { Console.WriteLine(members.ToString()); } Console.WriteLine("\nThe Class Methods\n=================\n"); MethodInfo[] class_methods = typeObj.GetMethods(); foreach (MethodInfo methods in class_methods) { Console.WriteLine(methods.ToString()); } }}

运行此程序,输出如下:

The Class name is CustomerThe Class Members=================Int32 GetHashCode()Boolean Equals(System.Object)System.String ToString()Void set_Name(System.String)System.String get_Name()System.Type GetType()Void .ctor()System.String NameThe Class Methods=================Int32 GetHashCode()Boolean Equals(System.Object)System.String ToString()Void set_Name(System.String)System.String get_Name()System.Type GetType()

这为我们显示了从 System.Object 继承的所有类的成员,并且还展示了一种方法,C# 在内部将 get 和 set 属性 accessors 表示为 get_xxx() 和 set_xxx() 方法。

在下一个示例中,我们使用 GetType() 在运行时查找表达式的类型:

using System;public class TypeTest{ public static void Main() { int radius = 8; Console.WriteLine("Calculated area is = {0}", radius * radius * System.Math.PI); Console.WriteLine("The result is of type {0}", (radius * radius * System.Math.PI).GetType()); }}

此程序的输出告诉我们,结果是 System.Double 类型,选择它是因为System.Math.PI 是这种类型。

Calculated area is = 201.061929829747The result is of type System.Double

posted on 2008-05-16 15:22  宏宇  阅读(725)  评论(0编辑  收藏  举报