我正在研究Josh Smith的CommandSink代码,显然不了解C#中的"as"关键字.
我不明白他为什么写这条线:
IsValid = _fe != null || _fce != null;
Run Code Online (Sandbox Code Playgroud)
因为他只需要写:
IsValid = depObj != null;
Run Code Online (Sandbox Code Playgroud)
既然永远不会出现这种情况,_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;
}
...
Run Code Online (Sandbox Code Playgroud)
答案就是Marc在他的评论中所说的" 这就是"作为"的全部内容 - 它不会引发异常 - 它只会报告为空."
这是证据:
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; }
}
}
Run Code Online (Sandbox Code Playgroud)
Sim*_*ead 26
as如果操作数兼容,将返回您请求的类型的对象.如果不是,它将返回null.如果您使用as并且演员表可能会失败,您需要检查以确保参考有效.
例如,如果depObj属于类型String,则不会null,但它也无法转换为任何一个请求的类型,并且这两个变量都将变为null.
就像"施放,如果是"一样,相当于:
(X is TYPE) ? (TYPE) X : null
然而,它比is+ 更有效cast.
depObj可以实现interface,none或两者.
| 归档时间: |
|
| 查看次数: |
6789 次 |
| 最近记录: |