
图 2:引用类型的内存位置
装箱 (Boxing) 和拆箱 (Unboxing)
这种将值类型转换为引用类型的过程称为装箱。而相反的将引用类型转换为值类型的过程就称为拆箱。如下面的代码所示:
int valueVariable = 10; // boxing object obj = refVariable; // unboxing int valueVariable = (int) refVariable;
Java 需要我们手动执行这样的转换。通过构造这样的对象,可以将基本数据类型转换成包装类的对象(装箱)。同样,通过调用这种对象中的适当方法,也可以从包装类的对象中提取基本数据类型的值(拆箱)。有关装箱的更多信息,请参见 装箱转换;有关拆箱的更多信息,请参见 拆箱转换。
运算符
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");
}
}
}
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




