is和as之间的区别

Ama*_*man 114 c# casting

请告诉C#中的isas关键字有什么区别?

Guf*_*ffa 144

is操作者检查是否一个对象可以被转换为特定的类型.

例:

if (someObject is StringBuilder) ...
Run Code Online (Sandbox Code Playgroud)

as运营商试图将对象强制转换为特定类型,如果失败则返回null.

例:

StringBuilder b = someObject as StringBuilder;
if (b != null) ...
Run Code Online (Sandbox Code Playgroud)

还有关系:

铸件

铸造操作者试图将对象强制转换到特定的类型,并且如果失败抛出exeption.

例:

StringBuilder b = (StringBuilder)someObject.
Run Code Online (Sandbox Code Playgroud)

  • @MartinSmith:你仍然在混淆铸造与转换.您没有将整数转换为long,而是将整数转换为long.虽然它们使用相同的语法,但是会引用引用并转换值. (12认同)
  • @MartinSmith:你正在将类型转换与强制转换混合在一起.一个整数可以转换为long,但它不能很长,因为它不长. (9认同)
  • 这是不正确的.`is`不检查对象是否可以转换为特定类型.一个整数转换成一个长的罚款但"10很长"是假的. (4认同)
  • 你告诉我一个整数不能投长?那个'(long)some_integer`会失败?我很确定我们都知道如果不运行就不行,所以请解释一下你的意思. (2认同)
  • 注意**关于`is`**:"_注意**是**运算符只考虑引用转换,装箱转换和拆箱转换.其他转换,例如用户定义的转换,不被视为._"(msdn .microsoft.com/EN-US /库/ scekt9xw.aspx).**关于`as`**:"_注意****运算符仅执行引用转换,可空转换和装箱转换.as运算符不能执行其他转换,例如用户定义的转换,而是通过使用强制转换表达式来执行._"(https://msdn.microsoft.com/en-us/library/cscsdfbt.aspx) (2认同)

小智 30

ISAs的区别在于......

IS - Is运算符用于检查具有给定类型的对象的兼容性,并将结果返回为布尔值(True或False).

AS - As运算符用于将对象转换为给定类型或类.

防爆.

Student s = obj as Student;
Run Code Online (Sandbox Code Playgroud)

相当于:

Student s = obj is Student ? (Student)obj : (Student)null;
Run Code Online (Sandbox Code Playgroud)

  • @MusaAl-hassy 实际上这并没有显示哪个更原始。`is`可以用`as`表示,`as`可以用`is`表示。以下是如何使用 `as` 关键字创建 `is`。`Bool b = obj is Student;` 等价于:`Bool b = (obj as Student) != null;` 更多关于这个 [here](https://blogs.msdn.microsoft.com/ericlippert/2010/ 09/16/is-is-as-or-is-as-is/) (2认同)

Shd*_*dNx 6

is关键字检查左侧的值是否是右侧类型的实例.例如:

if(obj is string)
{
     ...
}
Run Code Online (Sandbox Code Playgroud)

请注意,在这种情况下,您必须使用额外的显式强制转换来将obj作为字符串.

as关键字用于转换可空类型.如果指定的值不是指定类型的实例,则返回null.例如:

string str = obj as string;
if(str != null)
{
     ...
}
Run Code Online (Sandbox Code Playgroud)


小智 6

"是"和"as"关键字都用于C#中的类型转换.

当您查看两个关键字的IL代码使用时,您将轻松获得差异.

C#代码:

BaseClass baseclassInstance= new DerivedClass();
DerivedClass derivedclassInstance;

if (baseclassInstance is DerivedClass)
{
   derivedclassInstance= (DerivedClass)baseclassInstance;
   // do something on derivedclassInstance
}


derivedclassInstance= baseclassInstance as DerivedClass;

if (derivedclassInstance!= null)
{
   // do something on derivedclassInstance
}
Run Code Online (Sandbox Code Playgroud)

以上C#代码的IL代码在附图中 输入图像描述

关键字用法的IL代码包含IL指令,包括isinstacastclass.但是作为关键字使用的IL代码只有isinsta.

在上面提到的用法中,将使用两次类型转换,其中使用关键字,并且仅使用关键字一次.

注意:如果您使用'is'关键字检查某些条件,对类型结果没有任何兴趣,那么此处也只会出现类型种姓.即

if (baseclassInstance is DerivedClass)
{
   // do something based on the condition check.
}
Run Code Online (Sandbox Code Playgroud)

'is'和'as'将根据需要使用关键字.


Pat*_*ers 3

我会说:在线阅读 MSDN,但这里是:

is 运算符检查对象是否与给定类型兼容,评估结果是布尔值:true 或 false。

as 运算符永远不会抛出异常。