C# 在if语句条件中声明并分配变量,在语句体中重用

C# 在if语句条件中声明并分配变量,在语句体中重用,c#,C#,我真的说不出这个问题的标题。不管怎样,假设我有一句话: if(myObject.SomeMethod() != null) { DoSomethingWith(myObject.SomeMethod()); } 我希望避免双重调用SomeMethod()。理想情况下,某种模式匹配,如: if(myObject.SomeMethod() result != null) { DoSomethingWith(result); } 语言中有什么东西可以帮我解决这个问题吗?目前,我的选

我真的说不出这个问题的标题。不管怎样,假设我有一句话:

if(myObject.SomeMethod() != null)
{
    DoSomethingWith(myObject.SomeMethod());
}
我希望避免双重调用
SomeMethod()
。理想情况下,某种模式匹配,如:

if(myObject.SomeMethod() result != null)
{
    DoSomethingWith(result);
}
语言中有什么东西可以帮我解决这个问题吗?目前,我的选择是:

var result = myObject.SomeMethod();
if(result != null)
{
    DoSomethingWith(result);
}

我知道上面的方法没有错,它非常规范。简单地说,最近该语言中添加了大量语法糖分,使我们能够大量压缩代码:我之所以这样问,是因为我不知道是否有什么东西阻止了if(myObject.SomeMethod()result!=null)工作。

好吧,我建议像在第三段代码中那样使用变量。然而

如果不想使用变量,可以使用:

if(myObject.SomeMethod() is var result && result != null)
{
    DoSomethingWith(result);
}

但请注意,这并不阻止访问变量
result
。如果,您甚至可以在
之后访问它。如果您希望需要一个新的作用域:
{If…}

那么,我建议您像在第三个代码中那样使用一个变量。然而

如果不想使用变量,可以使用:

if(myObject.SomeMethod() is var result && result != null)
{
    DoSomethingWith(result);
}

但请注意,这并不阻止访问变量
result
。如果
,您甚至可以在
之后访问它。如果您想要,您需要一个新的作用域:
{If…}

使用变量有什么坏处?这正是你应该做的,我建议你解释一下你发现的错误,也许你有一个错误的假设,绝对没有本质上的不好,就像在
var x=y作为T中没有不好的东西;如果(x!=null){}
而不是
如果(y是tx){}
使用变量有什么坏处?这正是你应该做的,我建议你解释一下你发现的错误,也许你有一个错误的假设,绝对没有本质上的不好,就像在
var x=y作为T中没有不好的东西;如果(x!=null){}
而不是
if(y是tx){}
如果您知道
SomeMethod
返回的类型
T
,是否可以压缩为
if(myObject.SomeMethod()是T result)
?(也就是说,这是否包括空检查?@Rawling:我认为这个编译器不明白。看起来很管用,但正如你所建议的,但可读性较差。谢谢您的建议。如果您知道
SomeMethod
返回的类型
T
,您能否将其压缩为
If(myObject.SomeMethod()是T result)
?(也就是说,这是否包括空检查?@Rawling:我认为这个编译器不明白。看起来很管用,但正如你所建议的,但可读性较差。谢谢你的建议。