2010-02-25 75 views
2

可能重复:今天
Casting: (NewType) vs. Object as NewType
Why is the C# “as” operator so popular?不同的角色类型在C#

嘿,

我知道这可能是一个愚蠢的问题,但这个疑问来找我。

是做什么

String text = (String) variable; 

String text = variable as String; 

之间的区别?

+0

见http://stackoverflow.com/questions/2483/ – 2010-02-25 18:42:38

+0

http://stackoverflow.com/questions/2139798/why-is-the-c -as-operator-so-popular – 2010-02-25 18:43:16

回答

7

的铸造可以做三两件事:

  • 执行用户定义的转换
  • 执行取消装箱转换
  • 执行引用转换

as操作几乎总是一个参考转换,唯一的例外是拆箱到可空类型:

object x = "hello"; 
int? y = x as int?; // y is null afterwards 

然后出现在执行时失败的转换行为。所以区别在于:

  • 执行参考转换或拆箱的演员将抛出InvalidCastException失败; as将导致目标类型的空值而不是
  • 强制转换可以执行用户定义的转换; as不能
  • 强制转换可以解除非空值的类型; as只能用于拆箱如果目标类型是可以为空的值类型
4

as将返回空,如果variable实际上不是那种类型(String在这种情况下)。演员阵容会抛出异常。

+1

如果变量实际上不是该类型**或派生类型**(在这种情况下为String),将返回null。演员阵容会抛出异常。 – 2010-02-25 18:44:16

+1

打败我吧。请记住'as'不适用于值类型。 'int i = obj as int;'不会编译。 as'关键字必须与@Mehrdad Afshari说的引用类型或可为空的类型一起使用。 – 2010-02-25 18:44:33

+0

@Matt:它的工作原理。你需要使用一个可为空的类型:'int?我= obj作为int?;' – 2010-02-25 18:45:18

0

有很多不同的方式在C#中投。

这将尝试将引用强制转换为String引用。如果转换失败,它抛出一个异常:

string text = (String) variable; 

这将尝试将参照转换为一个字符串参考。如果转换失败,它会返回一个空引用被赋给变量:

string text = varible as String; 

这会施放一个字符串的对象引用的参考,这是一个安全的铸件作为字符串从Object继承:

object text = (object)"1337"; 

铸造父类,也可以隐式进行:

object text = "1337"; 

这将框的值对象内,然后重新拆箱到普通值:

int value = 42; 
object boxed = (object)value; 
int valueAgain = (int)boxed; 

拳击也可以隐式进行:

int value = 42; 
object boxed = value; 
int valueAgain = (int)boxed; 

这将使从字节扩大转换为int:

byte a = 42; 
int b = (int)a; 

同作品的隐式转换:

byte a = 42; 
int b = a; 

这会缩小转化次数版为从int到字节,丢掉溢出:

int a = 512; 
byte b = (byte)a; // b now contains 0