gpt4 book ai didi

c# - 更好的处理方法是/作为检查和类型转换

转载 作者:行者123 更新时间:2023-12-05 08:38:16 25 4
gpt4 key购买 nike

在我们的代码中,我们输入检查内容,然后立即需要转换它们。像这样:

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 is SomeClass) 所以我们知道 foo 是一个 SomeClassas 转换似乎是多余的。如果您在已传递 (foo is SomeClass) 的语句中,那么您似乎不必再将 foo 显式转换为 SomeClass

在任何人谈论编码实践之前......我知道。理想情况下,在我们应用程序的大多数地方,我们都充分利用了泛型、抽象类、接口(interface)和所有其他方法,以合理的方式与对象进行交互。但有时您会得到一个 object 并需要检查它,尤其是在事件之类的情况下。我对执行 is/as 没有真正的问题,我只是好奇是否有一些我可以使用的语法魔法,它更干净一些。这是一个语法优化的实验,而不是实用性。

作为测试,我使用了一个名为 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;
}

这将返回一个 bool 值,满足 is 部分,并使用引用输入来填充 as 的转换值。但在实践中,语法并没有更清晰:

SomeClass fooClass;
if(foo.IsAs<SomeClass>(out fooClass) && fooClass.Bar != null) {
DoSomething(fooClass)
...
}

最佳答案

使用 type pattern expression ,您可以将生成的转换分配给一个变量:

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

关于c# - 更好的处理方法是/作为检查和类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63604266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com