C#中与"With...End With"等价的语法是什么?

29

我知道C#有using关键字,但using会自动清理对象。

Visual Basic 6.0中是否有相当于With...End With的等价物?


2
在VB之前,“with”实际上已经存在了。它在Pascal中也存在,用于处理记录类型。不知道Pascal是否从其他地方借鉴了这个想法。 - JeffK
6个回答

38

这不是完全等价的,但这种语法对你是否可行呢?

Animal a = new Animal()
{
    SpeciesName = "Lion",
    IsHairy = true,
    NumberOfLegs = 4
};

5
"with"不能创建实例,因此这是错误的。 - John Stock
@ John Stock 但它以某种方式解决了一些问题。一切都取决于上下文。当您需要设置某些属性并使用某种属性注入时,这会简化一些事情。当然,主要问题是这不允许调用某些返回函数,因为它需要已创建的实例。 - Mantas Daškevičius

35

C#没有相应的语言结构来实现这个。


4
这是正确的。但如果您有一个返回“this”的方法类,则可以将这些方法链接在一起。 - Dlongnecker
现在使用C# 9记录(虽然不完全相同的概念)可以使用with了。https://devblogs.microsoft.com/dotnet/c-9-0-on-the-record/ - Imran Qadir Baksh - Baloch

22

虽然没有相应的对应词汇,但我认为讨论语法可能会很有趣!

我非常喜欢;

NameSpace.MyObject.
{
    active = true;
    bgcol = Color.Red;
}

还有其他建议吗?

我不认为添加这个语言特性会很困难,实质上只是一个预处理。

编辑:

我等待这个特性等得不耐烦了,因此这里有一个扩展可以实现类似的行为。

/// <summary>
/// C# implementation of Visual Basics With statement
/// </summary>
public static void With<T>(this T _object, Action<T> _action)
{
    _action(_object);
}

使用方法:

LongInstanceOfPersonVariableName.With(x => {
     x.AgeIntVar = 21;
     x.NameStrVar = "John";
     x.NameStrVar += " Smith";
     //etc..
});

编辑:有趣的是,似乎有人比我更早地提出了这个“解决方案”。好吧..


虽然不完全相同,但我喜欢你的想法。如果使用良好的格式化,它可以使代码更易读。 - Rudi
所以,你最终又重复了变量名。你可以使用以下方式来进行操作:x = LongInstanceOfPersonVariableName; x.AgeIntVar = 21; //等等。 - LoBo
1
我刚才有点反胃。 - JJS

10

我认为以下VB代码的等效代码是:

With SomeObjectExpression()
  .SomeProperty = 5
  .SomeOtherProperty = "Hello"
End With

这应该是关于 C# 的问题:

{
  Var q=SomeOtherExpression();
  q.SomeProperty = 5;
  q.SomeOtherProperty = "Hello";
}
唯一的真正区别是,在VB中,标识符没有名称“q”,而是在遇到句点之前没有任何其他标识符时,简单地用作默认标识符。

1
外面的花括号是什么意思?抱歉,但这根本不等同。它只是一堆调用setter方法的代码。 - tomfanning
2
外部的大括号设置了变量q的作用域。只要对象表达式是一个类而不是一个结构体,我认为上面的VB.Net和C#代码几乎是完全相等的。前面的语句是一个with语句的使用示例,后面的语句是C#的翻译。C#的示例使用了一些setter,因为这是任意选择的VB.net示例所做的。重点是,“with”相当于定义一个临时变量,然后在任何没有前置标识符的情况下使用它。 - supercat
这不是等价物,而是替代品。 - John Stock
@JohnStock:当我说“等效”时,我指的是行为。无论SomeOtherExpression或属性设置器做什么,我认为它们都没有办法确定上述代码片段中哪一个在评估它们,除非使用反射来检查调用上下文。事实上,反射可以区分调用上下文,这使它们不完全等效,但在所有其他方面,行为将是相同的。 - supercat

7

C#中没有类似于With ... End With的等效语句。

这是一张比较表,它展示了Visual Basic和C#之间的差异。


那个比较表太棒了。我正在从VB转向C#,这对我来说会非常有帮助。 - Buck Hicks

3

在C#中没有相应的结构,这是Visual Basic 6.0 / VB.NET 的特性。


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