扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
C# 提供了 Java 支持的所有可用运算符,如下表所示。在表的末尾,您将看到一些新的运算符,它们可以在 C# 中使用而不可以在 Java 中使用:
类别 |
符号 |
---|---|
[Text] |
[Text] |
一元 |
++ -- + - ! ~ () |
乘法 |
* / % |
加法 |
+ - |
移位 |
<< >> |
关系 |
< > <= >= instanceof |
相等 |
== != |
逻辑与 |
& |
逻辑异或 |
^ |
逻辑或 |
| |
条件与 |
&& |
条件或 |
|| |
条件 |
? : |
赋值 |
= *= /= %= += -= <<= >>= &= ^= |= |
操作数的类型 |
typeof |
操作数的大小 |
sizeof |
执行溢出检查 |
checked |
取消溢出检查 |
unchecked |
唯一不可以在 C# 中使用的 Java 运算符是 >>> 移位运算符。之所以在 Java 中存在此运算符,是因为该语言中缺乏无符号变量,例如在需要右移位以在最高有效比特位插入 1 时。
然而,C# 支持无符号变量,因而 C# 只需要标准 >> 运算符。取决于操作数是否带有符号,此运算符产生不同的结果。右移一个无符号数会在最高有效比特位插入 0,而右移一个有符号数则会复制前面的最高有效比特位。
如果对于分配给正在使用的数据类型的比特数来说结果太大,则算术运算会产生溢出。对于特定的整数算术运算,通过使用 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 中基于每个项目使用此开关,您还可以控制是否检查代码块中的算术溢出。
此运算符确定左边对象的类型是否与右边指定的类型相匹配:
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 运算符以指定值类型的字节数返回其大小,如下面的代码所示:
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 运算符返回作为 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 Customer The 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 Name The 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.061929829747 The result is of type System.Double查看本文来源
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者