C# 处理is/as检查和铸造的更好方法

C# 处理is/as检查和铸造的更好方法,c#,C#,在我们的代码中,我们键入check,然后立即需要转换它们。大概是这样的: if((foo is SomeClass) && (foo as SomeClass).Bar != null) { SomeClass fooClass = foo as SomeClass; DoSomething(fooClass.Bar); ... } 我希望有一种方式,在显式类型检查之后,foo的引用可以隐式转换为类: if (foo is SomeClass &

在我们的代码中,我们键入check,然后立即需要转换它们。大概是这样的:

if((foo is SomeClass) && (foo as SomeClass).Bar != null) {
    SomeClass fooClass = foo as SomeClass;
    DoSomething(fooClass.Bar);
    ...
}
我希望有一种方式,在显式类型检查之后,
foo
的引用可以隐式转换为类:

if (foo is SomeClass && foo.Bar != null) {
    DoSomething(foo.Bar);
}
它通过了
(foo是SomeClass)
,所以我们知道
foo
SomeClass
as
cast似乎是多余的。如果您在一条语句中传递了
(foo是SomeClass)
,那么您似乎不必显式地将
foo
转换为
SomeClass

在任何人谈论编码实践之前。。。我知道。理想情况下,在应用程序的大多数地方,我们都充分利用泛型、抽象类、接口和所有其他方法以合理的方式与对象交互。但有时你会得到一个
对象,需要检查它,特别是在事件之类的事情上。我在做
is
/
时没有什么问题,因为
都是这样,我只是想知道是否有一些语法上的魔法可以让我用得更干净一点。这是一个语法优化的实验,而不是实用性

作为测试,我使用了一个名为I call
IsAs
的扩展方法:

public static bool IsAs<T>(this object check, out T result) {
    if (check is T) {
        result = (T)check;
        return true;
    }
    result = default(T);
    return false;
}
使用
is
,可以将结果转换分配给变量:

if (foo is SomeClass fooSomeClass && fooSomeClass.Bar != null) 
{
    DoSomething(fooSomeClass.Bar);
}

查找模式匹配。现代C#会将其写成
if(foo是SomeClass s&&s.Bar!=null)
if(foo是SomeClass{Bar:{}Bar})
在同一事物上同时使用“is”和“as”是一种不好的做法。你正在做不必要的额外工作。如果需要访问实际对象,请使用“as”。如果只需要检查对象是否属于特定类型(但不打算访问它的任何成员),请使用“is”。或者,正如其他人所说,使用新的模式匹配功能。很好的实现,但C#支持开箱即用。找到一个我们希望已经存在的功能总是很好的:)更新我们的C#版本刚刚被推到我的待办事项列表的顶部。这只是更改列表中的另一件事,可以清理我们的codecombing中一些常用的东西。与C#8中的新开关表达式匹配的组合模式也非常棒:
if (foo is SomeClass fooSomeClass && fooSomeClass.Bar != null) 
{
    DoSomething(fooSomeClass.Bar);
}