C#“as”关键字还有比简单投射更多的东西吗?

时间:2009-04-21 08:34:27

标签: c# casting

我正在通过Josh Smith's CommandSink code显然对C#中的“as”关键字一无所知。

我不明白他为什么写这句话:

IsValid = _fe != null || _fce != null;

因为他只需要写:

IsValid = depObj != null;

既然永远不会出现这种情况,_fe将为null而_fce不为null,反之亦然,对吧?或者我错过了关于“as”如何投射变量的内容?

class CommonElement
{
    readonly FrameworkElement _fe;
    readonly FrameworkContentElement _fce;

    public readonly bool IsValid;

    public CommonElement(DependencyObject depObj)
    {
        _fe = depObj as FrameworkElement;
        _fce = depObj as FrameworkContentElement;

        IsValid = _fe != null || _fce != null;
    }
    ...

解答:

答案是Marc在他的评论中所说的“这是”作为“的全部内容 - 它不会抛出异常 - 它只报告null 。 “

以下是证据:

using System;

namespace TestAs234
{
    class Program
    {
        static void Main(string[] args)
        {
            Customer customer = new Customer();
            Employee employee = new Employee();

            Person.Test(customer);
            Person.Test(employee);
            Console.ReadLine();
        }

    }

    class Person
    {
        public static void Test(object obj)
        {
            Person person = obj as Customer;

            if (person == null)
            {
                Console.WriteLine("person is null");
            }
            else
            {
                Console.WriteLine("person is of type {0}", obj.GetType());
            }
        }
    }

    class Customer : Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

    class Employee : Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

}

6 个答案:

答案 0 :(得分:26)

如果操作数兼容,

as将返回您请求的类型的对象。如果不是,则返回null。如果使用as并且演员表可能会失败,则需要检查以确保引用有效。

例如,如果depObj的类型为String,则它不会是null,但它也无法转换为任何一种请求的类型,并且这两个变量都将变为null

答案 1 :(得分:5)

和“施放,如果是”,等同于:

(X is TYPE) ? (TYPE) X : null

但是,它比is + cast更有效。

depObj可以实现interface,none或两者。

答案 2 :(得分:3)

IsValid = _fe != null || _fce != null;

IsValid = depObj != null;

不是相同的测试,因为如果depObj不是FrameworkElement类型,也不是FrameworkContentElement类型但不是null,则第二个测试将返回true,而第一个测试将返回false。

答案 3 :(得分:2)

如果depObj既不是FrameworkElement也不是FrameworkContentElement怎么办?我不知道完整的场景(即类型可能是什么),但这似乎是一种合理的防御策略。

答案 4 :(得分:2)

首先,as关键字包含is支票。

if( o is A)
   a = (A) o;

相同
a = o as A;

其次,即使定义了从类型asA的转换运算符,B也不会像强制转换那样转换类型。

答案 5 :(得分:1)

如果DependencyObject depObj实际上是FrameworkOtherTypeOfElement

,该怎么办?

然后depObj不会为空

但尝试的as广告会被评估为空,_fe& _fce都将为空

as相当于做

if(I Can Cast This Object)
   //Then cast it
else
   //Return null