请告诉我们C#中的is
和as
关键字有什么区别
请告诉我们C#中的is
和as
关键字有什么区别
Answers:
的is
操作者检查是否一个对象可以被转换为特定的类型。
例:
if (someObject is StringBuilder) ...
该as
运营商试图将对象强制转换为特定类型,如果失败则返回null。
例:
StringBuilder b = someObject as StringBuilder;
if (b != null) ...
也相关:
在铸造操作者试图将对象强制转换到特定的类型,并且如果失败抛出exeption。
例:
StringBuilder b = (StringBuilder)someObject.
is
不会检查对象是否可以转换为特定类型。整数强制转换为长期罚款,但10 is long
为假。
(long)some_integer
会失败吗?我很确定我们都知道,即使不运行它也不是真的,所以请解释一下您的意思。
is
注释:“ 请注意,is运算符仅考虑引用转换,装箱转换和装箱转换。不考虑其他转换,例如用户定义的转换。 ”(msdn.microsoft.com/zh-cn/library/scekt9xw .aspx)。关于as
:“ 请注意,as运算符仅执行引用转换,可为空的转换和装箱转换。as运算符不能执行其他转换,例如用户定义的转换,而应使用强制转换表达式来执行。 ”(msdn .microsoft.com / en-us / library / cscsdfbt.aspx)
IS和As之间的区别是..
IS-是运算符,用于检查具有给定类型的对象的兼容性,并且它以布尔值(真或假)返回结果。
AS -As运算符用于将对象转换为给定的类型或类。
例如
Student s = obj as Student;
等效于:
Student s = obj is Student ? (Student)obj : (Student)null;
is
可以用as
和as
表示is
。这是如何is
使用as
关键字做一个。 Bool b = obj is Student;
等效于: Bool b = (obj as Student) != null;
更多有关此信息
这两个is
和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
}
IL代码(以上C#代码在附件中):
对于IL代码is
关键字的使用包含IL指令都isinsta
和castclass
。
但是用于as
关键字用法的IL代码只有isinsta
。
在上述用法中,使用is
关键字的地方将进行两种类型转换,as
而使用关键字的地方仅进行一种类型转换。
注意:如果您正在使用is
关键字检查某些条件,并且对类型转换结果没有任何兴趣,那么将只有一个类型转换,即
if (baseclassInstance is DerivedClass)
{
// do something based on the condition check.
}
is
并as
根据需要使用关键字。
is关键字检查其左侧的值是否是右侧类型的实例。例如:
if(obj is string)
{
...
}
请注意,在这种情况下,您必须使用额外的显式强制转换才能将obj作为字符串获取。
as关键字用于强制转换可为null的类型。如果指定的值不是指定类型的实例,则返回null。例如:
string str = obj as string;
if(str != null)
{
...
}
我会说:在线阅读MSDN,但这是:
is运算符检查对象是否与给定类型兼容,并且评估结果为布尔值:true或false。
as运算符永远不会引发异常。
是operator,是否为强制类型转换,如果成功,则返回true。如果强制转换失败,则返回false。使用它,您无法捕获转换后的变量。该操作符在检查if语句和表达式中的类型时最有用。is-cast仅在不需要进一步使用结果变量的情况下才是理想的
作为演员。有了它,我们可以提高性能并避免强制类型转换无效的异常。如果无法进行强制转换,则返回Null。对于参考类型,建议采用铸态。它既快速又安全。我们可以针对空变量测试结果变量,然后使用它。这消除了额外的强制转换
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 it’s true then Type cast
实际上,这会影响性能,因为每次CLR都会遍历继承层次结构,并根据指定的类型检查每种基本类型。
为避免这种情况,请使用as,它将一步完成。仅在检查类型时,才应使用is运算符。
观看下面的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;
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`
两个操作员都用于安全类型铸造。
AS操作员:
AS操作员还检查给定对象的类型是否与新对象类型兼容。此关键字将检查给定对象的类型是否与新对象类型兼容。如果与新版本不兼容,则它将返回NULL。
IS操作员:
该操作员检查对象的类型是否与新对象兼容。如果兼容,则返回true,否则返回false。