is和as关键字之间的区别


121

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



3
如果你对这个问题感兴趣,你可能也想知道其中的差别是什么之间“是”和“演员”运营商:blogs.msdn.com/b/ericlippert/archive/2009/10/08/...
埃里克利珀

7
您要标记接受的答案吗?这将有助于其他人寻找类似的答案。
KMån

Answers:


151

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

例:

if (someObject is StringBuilder) ...

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

例:

StringBuilder b = someObject as StringBuilder;
if (b != null) ...

也相关:

铸件

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

例:

StringBuilder b = (StringBuilder)someObject.

4
这是不对的。is不会检查对象是否可以转换为特定类型。整数强制转换为长期罚款,但10 is long为假。
马丁·史密斯

9
@MartinSmith:您正在将类型转换与强制转换混合在一起。整数可以转换为long,但是不能将其强制转换为long,因为它不是long。
加法

2
您是在告诉我整数不能转换为长整数吗?那(long)some_integer会失败吗?我很确定我们都知道,即​​使不运行它也不是真的,所以请解释一下您的意思。
马丁·史密斯,

12
@MartinSmith:您仍然使转换与转换混淆。您不是将整数强制转换为整数,而是将整数转换为整数。尽管它们使用相同的语法,但强制转换引用并转换值。
加法

2
关于以下内容的is注释:“ 请注意,is运算符仅考虑引用转换,装箱转换和装箱转换。不考虑其他转换,例如用户定义的转换。 ”(msdn.microsoft.com/zh-cn/library/scekt9xw .aspx)。关于as:“ 请注意,as运算符仅执行引用转换,可为空的转换和装箱转换。as运算符不能执行其他转换,例如用户定义的转换,而应使用强制转换表达式来执行。 ”(msdn .microsoft.com / en-us / library / cscsdfbt.aspx
user1234567 2016年

33

ISAs之间的区别是..

IS-是运算符,用于检查具有给定类型的对象的兼容性,并且它以布尔值(真或假)返回结果。

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

例如

Student s = obj as Student;

等效于:

Student s = obj is Student ? (Student)obj : (Student)null;

1
等价关系清楚地表明了两者中哪个更原始,并且优雅地支撑了它们之间的关系!感谢您的等效!
Musa Al-hassy 2015年

1
@ MusaAl-hassy实际上,这没有显示哪个更原始。is可以用asas表示is。这是如何is使用as关键字做一个。 Bool b = obj is Student; 等效于: Bool b = (obj as Student) != null; 更多有关此信息
Alex Telon

8

这两个isas关键字用于在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
}

IL代码(以上C#代码在附件中):

以上C#代码的IL代码 对于IL代码is关键字的使用包含IL指令都isinstacastclass
但是用于as关键字用法的IL代码只有isinsta

在上述用法中,使用is关键字的地方将进行两种类型转换,as而使用关键字的地方仅进行一种类型转换。

注意:如果您正在使用is关键字检查某些条件,并且对类型转换结果没有任何兴趣,那么将只有一个类型转换,即

if (baseclassInstance is DerivedClass)
{
   // do something based on the condition check.
}

isas根据需要使用关键字。


6

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

if(obj is string)
{
     ...
}

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

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

string str = obj as string;
if(str != null)
{
     ...
}

+1为“ as关键字用于转换可为null的类型。”
user2330678 2014年

3

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

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

as运算符永远不会引发异常。


“ as”运算符也不会引发异常,它只会返回null。
Pinte Dani

修正了有关“是”和“为”的错字
Patrick Peters

2

是operator,是否为强制类型转换,如果成功,则返回true。如果强制转换失败,则返回false。使用它,您无法捕获转换后的变量。该操作符在检查if语句和表达式中的类型时最有用。is-cast仅在不需要进一步使用结果变量的情况下才是理想的

作为演员。有了它,我们可以提高性能并避免强制类型转换无效的异常。如果无法进行强制转换,则返回Null。对于参考类型,建议采用铸态。它既快速又安全。我们可以针对空变量测试结果变量,然后使用它。这消除了额外的强制转换



2

is运算 符C#中的is运算符用于检查对象类型,它返回布尔值:如果对象是相同类型,则返回true,否则返回false。或者“ is”运算符用于检查对象的运行时类型是否与给定类型兼容。对于空对象,它返回false,例如

if(obj is AnimalObject)
{
 //Then Work
}

作为操作员

as运算符执行与is运算符相同的工作,但不同之处在于,而不是bool,如果它们与该类型兼容,则返回对象,否则返回null。换句话说,'as'运算符用于在兼容对象之间执行转换类型。

例如

Type obj = Object as Type;

as over is的优点 在is运算符的情况下,要进行类型转换,我们需要执行两个步骤:

Check the Type using is
If its true then Type cast

实际上,这会影响性能,因为每次CLR都会遍历继承层次结构,并根据指定的类型检查每种基本类型。

为避免这种情况,请使用as,它将一步完成。仅在检查类型时,才应使用is运算符。


回答已经有很多有效答案的8年历史问题并不是使用Stack Overflow的最佳方法。
克劳斯·约根森

1

As运算符类似于强制类型转换,但是如果失败,则返回null而不是异常。

Is运算符用于检查一个对象是否与某种类型兼容。通常在If语句中使用。


1

is:is运算符用于检查对象的运行时类型是否与给定类型兼容

as:as运算符用于在兼容类型之间执行转换。

object s = "this is a test";
string str=string.Empty;
if( s is string)
    str = s as string;

2
您的答案是正确的,但示例代码是反模式。这是做昂贵的isas:它unboxes两次。对于引用类型,您只需执行as,然后检查null以查看它是否有效。
史蒂文·苏迪特

1

观看下面的youtube视频,以更直观和直观的方式说明差异:-

https://www.youtube.com/watch?v=IKmRtJcRX_I

下面是带有代码说明的详细答案。

“ IS”关键字对于检查对象是否与类型兼容很有用。例如,在下面的代码中,我们正在检查“ ocust”对象是否为“ Customer”类的类型。

object ocust = new Customer();

if (ocust is Customer)
{ 

“ AS”关键字有助于完成从一种类型到另一种类型的转换。例如,在下面的代码中,我们将对象转换为字符串数据类型。如果“ AS”关键字无法键入强制类型转换,则返回NULL。

object o = "somestring";
string str = o as string;

1
MyClass myObject = (MyClass) obj;

MyClass myObject = obj as MyClass;

如果obj不是MyClass,则第二个将返回null,而不是引发类强制转换异常。

是只会返回true或false


1

IS和AS均用于安全类型转换

IS关键字->检查给定对象的类型是否与新对象类型兼容。它永远不会引发异常。这是一个布尔类型。返回true或false

`student stud = new student(){}
if(stud is student){} // It returns true // let say boys as derived class
if(stud is boys){}// It returns false since stud is not boys type
 //this returns true when,
student stud = new boys() // this return true for both if conditions.`

AS关键字:检查给定对象的类型是否与新对象类型兼容。如果给定对象与新对象兼容,则返回非null,否则返回null。这将引发异常。

`student stud = new student(){}
 // let say boys as derived class
boys boy = stud as boys;//this returns null since we cant convert stud type from base class to derived class
student stud = new boys()
boys boy = stud as boys;// this returns not null since the obj is pointing to derived class`

1

两个操作员都用于安全类型铸造。

AS操作员:

AS操作员还检查给定对象的类型是否与新对象类型兼容。此关键字将检查给定对象的类型是否与新对象类型兼容。如果与新版本不兼容,则它将返回NULL。

IS操作员:

该操作员检查对象的类型是否与新对象兼容。如果兼容,则返回true,否则返回false。


您不觉得这比4年还晚吗?
SonerGönül2015年

喔是...对不起....我是新来的StackOverflow,以致几乎退出......没注意到的发布时间...
塔卡勒姆

贡献就是贡献!感谢您指出关键字“安全类型转换”!:-)
Musa Al-hassy 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.