【问题标题】:Equivalence of "With...End With" in C#? [duplicate]C# 中“With...End With”的等价物? [复制]
【发布时间】:2009-06-30 12:38:25
【问题描述】:

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

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

【问题讨论】:

  • "with" 实际上早在 VB 之前就已经存在了。它存在于 Pascal 中,用于处理记录类型。不知道 Pascal 是否从其他地方借鉴了这个想法。

标签: c# vb.net with-statement


【解决方案1】:

这不是等效的,但是这种语法对你有用吗?

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

【讨论】:

  • "With" 不会创建实例,所以这是错误的。
  • @John Stock 但它在某种程度上解决了一些问题。一切都取决于上下文。当您需要设置一些属性并使用某种属性注入时,这会简化一些事情。当然主要问题是这不允许调用某种返回函数,因为它需要已经创建的实例。
【解决方案2】:

C# 没有与之等效的语言结构。

【讨论】:

【解决方案3】:

没有等价物,但我认为讨论语法可能很有趣!

我很喜欢;

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..
});

编辑:有趣的是,似乎有人再次用这个“解决方案”击败了我。哦,好吧..

【讨论】:

  • 虽然不完全一样,但我喜欢你的想法。如果使用良好的格式,它可以使代码更具可读性。
  • 因此,您最终再次重复了变量名。你也可以这样做:x = LongInstanceOfPersonVariableName; x.AgeIntVar = 21; //etc.
  • 我只是在嘴里吐了一点。
【解决方案4】:

我觉得相当于下面的VB

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

这是C#

{
  Var q=SomeOtherExpression();
  q.SomeProperty = 5;
  q.SomeOtherProperty = "Hello";
}

唯一真正的区别是,在 vb 中,标识符没有名称“q”,而只是一个默认标识符,用于在遇到句号之前没有任何其他标识符时使用。

【讨论】:

  • 外卷发是怎么回事?抱歉,但这绝不是等效的。这只是对 setter 的一堆调用。
  • 外部大括号设置变量 q 的范围。如果对象表达式是类而不是结构,我认为上面的 VB.Net 和 C# 代码几乎完全等效。前一个语句是如何使用 with 语句的示例,后一个语句是 C# 翻译。 C# 示例使用了几个 setter,因为这是任意选择的 VB.net 示例所做的。要点是“with”相当于定义一个临时变量,然后在任何时候使用它,而没有前面的标识符。
  • 这不是等价物,而是替代品。
  • @JohnStock:当我说“等效”时,我指的是行为。无论SomeOtherExpression 或属性设置器做什么,我认为他们中的任何人都无法通过使用反射检查来确定上述代码 sn-ps 中的哪个 except 正在评估它们调用上下文。反射可以区分调用上下文这一事实使它们完全等效,但在所有其他方面,行为都是相同的。
【解决方案5】:

C# 中没有与 With ... End With 等价物。

这里是 a comparison chart,它说明了 Visual Basic 和 C# 之间的差异。

【讨论】:

  • 那个对比图太棒了。我正在努力从 VB 过渡到 C#,这将非常有帮助。
【解决方案6】:

C# 中没有等效的结构。这是 Visual Basic 6.0 / VB.NET 功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    相关资源
    最近更新 更多