C# 处理is/as检查和铸造的更好方法
在我们的代码中,我们键入check,然后立即需要转换它们。大概是这样的: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 &
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 callIsAs
的扩展方法:
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);
}