C#中是否有类似于VB.NET中的"With"语句?

5

可能是重复问题: C#中“With…End With”的等效性?

我不知道这个问题是否已经被问过,我也不是一个大 VB.NET 的粉丝。但是,在 C#中我缺少的一种语法是 With 语法。

在 VB.NET 中,您可以编写:

Dim sb As New StringBuilder
With sb
    .Append("foo")
    .Append("bar")
    .Append("zap")
End With

我是否错过了C#中可以完成同样操作的语法?


sb.Append("foo") 代替 with 语句确实更好吗?我在 VB.NET 编程已经有12年了,从来没有理解过使用 with 语句的好处。这只是另一件你必须每次查找的东西(那是什么来着?)。 - Tim Schmelter
@TimSchmelter:我也很好奇。我可能已经使用VB.NET编码了4年,但除了New...With结构之外,从未发现过使用With语句的用途。 - Meta-Knight
5个回答

13
不,没有。
这在C#中是有意省略的,因为它并没有增加很多便利性,而且它很容易被用来编写令人困惑的代码。
来自Visual C#的Group Program Manager Scott Wiltamuth的博客文章,关于with关键字:https://web.archive.org/web/20111217005440/http://msdn.microsoft.com/en-us/vstudio/aa336816.aspx 对于StringBuilder的特殊情况,您可以链接调用。
StringBuilder sb = new StringBuilder()
  .Append("foo")
  .Append("bar")
  .Append("zap");

4
好的,以下是一个使用 With/End With 语法的 VB.Net 代码示例,可能会让人感到困惑:With myObject .Property1 = "Value1" .Property2 = "Value2" .Method1() End With这段代码中,myObject 是一个对象,使用 With/End With 语法可以简化对该对象属性和方法的调用。但如果在 With 块内部使用过多的点符号来引用对象成员,则代码可读性就会下降。 - ken2k
你可能也注意到了,C#有对象初始化器语法,但只能用于设置公共实例变量,而不能进行函数调用。 - Scott M.

4

VB的With语句没有直接的对应物。

然而,需要注意的是StringBuilder.Append返回StringBuilder实例,因此以下代码等同于您原来的代码:

sb.Append("foo").Append("bar").Append("zap");

甚至更多
sb.Append("foo")
  .Append("bar")
  .Append("zap");

这对于所有对象/方法都不可能实现。

2

对于 New Type With,有一个相等的替代品:

var obj = new Type {
    PropName = Value,
    PropName = Value
};

但不适用于普通的With


2

不,没有等价的语法。

With 是VB/VB.NET专用的。


0

这个功能只有 Visual Basic 才有,其他语言没有。

C# 中没有包含这个功能的主要原因是它可能会导致代码混乱,例如在使用嵌套的 With 语句时。


链接似乎已经失效 - Toby Allen
链接似乎(实际上)已损坏 - 它重定向至一个非特定页面。 - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接