科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件针对 Java 开发人员的 C# 编程语言(8)

针对 Java 开发人员的 C# 编程语言(8)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

针对 Java 开发人员的 C# 编程语言运算符

来源:MSDN 2007年11月7日

关键字: 编程语言 C# java Linux

  • 评论
  • 分享微博
  • 分享邮件

运算符

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

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 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领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章