是和作为关键字之间的区别
请告诉C#中is
和as
关键字有何区别
是
is
运算符检查对象是否可以转换为特定的types。
例:
if (someObject is StringBuilder) ...
如
as
运算符试图将对象转换为特定的types,如果失败则返回null。
例:
StringBuilder b = someObject as StringBuilder; if (b != null) ...
还相关:
铸件
转换运算符试图将对象转换为特定的types,如果失败则抛出一个exception。
例:
StringBuilder b = (StringBuilder)someObject.
IS与As的区别是..
IS – 操作符用于检查某个对象与给定types的兼容性,并将结果作为布尔值(True或False)返回。
AS – 作为运算符用于将对象投射到给定的types或类。
防爆。
Student s = obj as Student; is equivalent to: Student s = obj is Student ? (Student)obj : (Student)null;
is关键字检查其左侧的值是否是右侧的types的实例。 例如:
if(obj is string) { ... }
请注意,在这种情况下,您将不得不使用额外的显式强制转换来获取obj作为string。
as关键字用于投射可空types。 如果指定的值不是指定types的实例,则返回null。 例如:
string str = obj as string; if(str != null) { ... }
“是”和“as”关键字用于C#中的types转换。
当你看看这两个关键字的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 }
上面的C#代码的IL代码是在附加的图像enter image description here
用于关键字使用的IL代码包含isinsta和castclass的 IL指令。 但IL代码为关键字使用只有isinsta 。
在上述用法中,在使用关键字的地方会发生两次types转换,而在使用as关键字的地方只会发生一次types转换。
注意:如果使用“is”关键字来检查某个条件,对type种类结果没有任何兴趣,那么这里也只有一次types种姓会发生。 即
if (baseclassInstance is DerivedClass) { // do something based on the condition check. }
根据需要使用“是”和“as”关键字。
我会说:在线阅读MSDN,但这里是:
is运算符检查对象是否与给定types兼容,并且评估的结果是布尔值:true或false。
is运算符永远不会抛出exception。
As运算符类似于强制转换,但如果失败,则返回null而不是exception。
Is运算符用于检查一个对象是否与某种types兼容。 它通常用于If语句。
is
:is运算符用于检查对象的运行时types是否与给定types兼容
as
:as运算符用于执行兼容types之间的转换。
object s = "this is a test"; string str=string.Empty; if( s is string) str = s as string;
看看下面的YouTubevideo,以更具说明性和视觉化的方式解释差异:
https://www.youtube.com/watch?v=IKmRtJcRX_I
下面用代码说明去长答案。
“IS”关键字对于检查对象是否与types兼容很有用。 例如在下面的代码中,我们正在检查“ocust”对象是否是一种“Customer”类。
object ocust = new Customer(); if (ocust is Customer) {
“AS”关键字有助于从一种types转换为其他types。 例如在下面的代码中,我们将对象转换为string数据types。 如果“AS”关键字不能input,则返回NULL。
object o = "somestring"; string str = o as string;
两个操作员都用于安全types铸造。
AS运营商:
AS运算符还检查给定对象的types是否与新的对象types兼容。 此关键字将检查给定对象的types是否与新对象types兼容。 如果它与新的不兼容,那么它将返回NULL。
IS运营商:
该操作员将检查对象的天气types是否与新对象兼容。 如果兼容,则返回true,否则返回false。
如果运算符成功,则返回true。 如果转换失败,则返回false。 有了它,你不能捕获转换的variables。 这个操作符在检查if语句和expression式中的types时是非常有用的。只有当结果variables不需要进一步使用时,is-cast才是理想的
作为一个演员。 有了它,我们获得了表演,并避免了剧组失效时的例外情况。 无法投射时返回空值。 对于参考types,推荐使用铸态。 它既快速又安全。我们可以根据null来testing结果variables,然后使用它。 这消除了额外的演员
- 是运算符检查对象是否与给定types兼容的结果是基于true还是false。
- 用于将一种types转换为另一种types,并且转换失败结果为null,除非引发exception。 以及更好的理解链接的例子https://blogs.msdn.microsoft.com/prakasht/2013/04/23/difference-between-direct-casting-is-and-as-operator-in-c/
MyClass myObject = (MyClass) obj;
VS
MyClass myObject = obj as MyClass;
如果obj不是MyClass,则第二个将返回null,而不是抛出类转换exception。
是只会返回真或假
IS和AS都用于安全型铸造
IS关键字 – >检查给定对象的types是否与新的对象types兼容。 永远不会抛出exception。 这是一个布尔types..返回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关键字:检查给定对象的types是否与新的对象types兼容。 如果给定对象与新对象兼容,则返回非null,否则返回null。这将引发exception。
`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`
“is”是用于types之间的平等检查,返回一个bool值,而“as”用于types转换,如果转换无效而不是exception,则返回null