3

我简直不敢相信 C# 开发人员没有想到这一点。我不喜欢没有更好的方法来创建一次性变量,因为我们必须在块中声明它们:

using( XYZ x = smth){
    ShowForm(Color.Blue, x,  "30px");
    ......
}

对我来说,将行放在括号中并将声明放在代码前面,在视觉上是不愉快的(因为它提醒我要if {} else {}阻止)。

那么,是否存在任何替代方法来创建内联自处置变量,例如:

ShowForm(Color.Blue, (using x=smth) x ,  "30px");

?

4

1 回答 1

7

C# 不仅没有为此提供便利,而且还不可能在不涉及表达式语义的歧义的情况下定义一个。

块的限制using定义了新添加的变量的范围,以及它的有用生命周期。块的右大括号using(或未包含在花括号中的单个语句的结尾)定义了Dispose必须在using子句对象上调用的点。

现在想象一下,有一个using表达式可以让我们创建一个“内联”的一次性对象,例如

ShowForm(Color.Blue, using var x = smth,  "30px");

的使用寿命应该是x多少?退货时是否应该丢弃ShowForm?如果你这样做怎么办

Foo(1, Bar(2, using var x = smth))

应该xBar完成时处理,还是应该等待Foo完成?

还有其他上下文,例如循环和条件语句的控制表达式,其中一次性变量的范围会变得不明确。这就是为什么 C# 坚持对using条款中引入的一次性变量的范围提供明确的限制。

于 2018-02-03T11:33:09.223 回答