zoukankan      html  css  js  c++  java
  • C#运算符

    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

  • 相关阅读:
    [野狐行网游研究][二期][8.21更新]
    Movidius的深度学习入门
    Linux下深度学习常用工具的安装
    Intel AI Cloud 使用
    【Effective Java读书笔记】创建和销毁对象(一):考虑使用静态工厂方法代替构造器
    策略模式
    Java 8 中常用的函数式接口
    MySQL权限管理(五)
    kickstart无人值守安装
    pymysql模块使用
  • 原文地址:https://www.cnblogs.com/cuihongyu3503319/p/1200721.html
Copyright © 2011-2022 走看看