【问题标题】:Difference between is and as keywordis 和 as 关键字的区别
【发布时间】:2010-09-24 10:59:49
【问题描述】:

请说出C#中isas关键字的区别

【问题讨论】:

标签: c# casting


【解决方案1】:

is operator 检查对象是否可以转换为特定类型。

例子:

if (someObject is StringBuilder) ...

作为

as operator 尝试将对象转换为特定类型,如果失败则返回 null。

例子:

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

还有相关的:

铸造

cast operator 尝试将对象强制转换为特定类型,如果失败则抛出异常。

例子:

StringBuilder b = (StringBuilder)someObject.

【讨论】:

  • 这是不正确的。 is 不检查对象是否可以转换为特定类型。整数转换为 long 罚款,但 10 is long 为假。
  • @MartinSmith:您将类型转换与强制转换混为一谈。整数可以转换为 long,但不能转换为 long,因为它不是 long。
  • 你是在告诉我不能将整数转换为长整数? (long)some_integer 会失败吗?我很确定我们都知道即使没有运行它也不是真的,所以请解释一下你的意思。
  • @MartinSmith:你还在混淆转换和转换。您不是将整数转换为长整数,而是将整数转换为长整数。尽管它们使用相同的语法,但引用被转换并且值被转换。
  • 注意关于is:“请注意,is 运算符仅考虑引用转换、装箱转换和拆箱转换。其他不考虑转换,例如用户定义的转换。"(msdn.microsoft.com/en-us/library/scekt9xw.aspx)。 关于as:“请注意,as 运算符只执行引用转换、可空转换和装箱转换。as 运算符不能执行其他转换,例如用户定义的转换,应该使用强制转换表达式来执行。" (msdn.microsoft.com/en-us/library/cscsdfbt.aspx)
【解决方案2】:

ISAs 的区别在于..

IS - Is 运算符用于检查对象与给定类型的兼容性,并将结果作为布尔值(真或假)返回。

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

例如。

Student s = obj as Student;

相当于:

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

【讨论】:

  • 这种等价性清楚地表明了两者中的哪一个更原始并且优雅地奠定了他们之间的关系!感谢您的等效!
  • @MusaAl-hassy 实际上这并没有显示哪个更原始。 is 可以用as 表示,as 可以用is 表示。以下是使用 as 关键字创建 is 的方法。 Bool b = obj is Student; 相当于:Bool b = (obj as Student) != null; 更多关于此here
【解决方案3】:

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# 代码在附图中):

is 关键字用法的 IL 代码包含 IL 指令 isinstacastclass
但是as关键字用法的IL代码只有isinsta

在上面提到的用法中,使用is关键字的地方会发生两次类型转换,而使用as关键字的地方只会发生一次类型转换。

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

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

isas 关键字将根据需要使用。

【讨论】:

    【解决方案4】:

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

    if(obj is string)
    {
         ...
    }
    

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

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

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

    【讨论】:

    • +1 表示“as 关键字用于转换可为空的类型。”
    【解决方案5】:

    是操作员 C# 中的 is 运算符用于检查对象类型,它返回一个 bool 值:如果对象类型相同,则返回 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 运算符。

    【讨论】:

    • 回答已经有大量有效答案的 8 年老问题并不是使用 Stack Overflow 的最佳方式。
    【解决方案6】:

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

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

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

    【讨论】:

      【解决方案7】:

      Is operator 是一个强制转换,如果成功则返回 true。如果强制转换失败,则返回 false。有了它,您将无法捕获转换后的变量。在检查 if 语句和表达式中的类型时,此运算符最有用。is-cast 仅在不需要进一步使用生成的变量时才是理想的

      就像演员一样。有了它,我们可以在强制转换无效时获得性能并避免异常。当强制转换不可能时返回 Null。对于引用类型,推荐使用 as-cast。它既快速又安全。我们可以针对 null 测试结果变量,然后使用它。这消除了额外的演员表

      【讨论】:

        【解决方案8】:
        1. is 运算符检查对象是否与给定的兼容 根据真假输入结果。
        2. as 用于将一种类型转换为另一种类型并进行转换 失败结果为空,但随后引发异常。 请参阅链接以更好地理解示例https://blogs.msdn.microsoft.com/prakasht/2013/04/23/difference-between-direct-casting-is-and-as-operator-in-c/

        【讨论】:

          【解决方案9】:

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

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

          【讨论】:

            【解决方案10】:

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

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

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

            【讨论】:

            • 您的答案是正确的,但您的示例代码是反模式。做is 然后as 很昂贵:它拆箱两次。对于引用类型,您应该只使用as,然后检查 null 以查看它是否有效。
            【解决方案11】:

            看看下面的 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;
            

            【讨论】:

              【解决方案12】:
              MyClass myObject = (MyClass) obj;
              

              MyClass myObject = obj as MyClass;
              

              如果 obj 不是 MyClass,第二个将返回 null,而不是抛出类转换异常。

              is 只会返回 true 或 false

              【讨论】:

                【解决方案13】:

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

                IS 关键字--> 检查给定对象的类型是否与新对象类型兼容。它从不抛出异常。这是一个布尔类型..返回真或假

                `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 关键字: 检查给定对象的类型是否与新对象类型兼容。如果给定对象与新对象兼容,则返回非空值,否则返回空值。这将引发异常。

                `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`
                

                【讨论】:

                  【解决方案14】:

                  这两个运算符都用于安全类型转换。

                  AS 运算符:

                  AS 运算符还检查给定对象的类型是否与新对象类型兼容。此关键字将检查给定对象的类型是否与新对象类型兼容。如果它与新的不兼容,那么它将返回 NULL。

                  IS 运算符:

                  该运算符检查对象的类型是否与新对象兼容。如果兼容,则返回 true,否则返回 false。

                  【讨论】:

                  • 你不觉得4年有点晚了吗?
                  • 哦,是的......对不起......我是stackoverflow的新手,所以很少退出......没有注意到发布日期......
                  • 贡献就是贡献!感谢您指出关键字“安全类型转换”! :-)
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-02-20
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-01-22
                  • 2010-09-18
                  相关资源
                  最近更新 更多