“的等价性”;以…结尾,以“结束”;在C#中?

“的等价性”;以…结尾,以“结束”;在C#中?,c#,vb.net,with-statement,C#,Vb.net,With Statement,我知道C#有using关键字,但是using自动处理对象 在中是否存在与…End With的等价性?C#没有相应的语言结构。没有与…的等价性。。。以…结尾 这里为您演示Visual Basic和C#之间的区别。C#中没有等效的结构。这是一个Visual Basic 6.0/功能 它不是等价的,但是这种语法对您有用吗 Animal a = new Animal() { SpeciesName = "Lion", IsHairy = true, NumberOfLegs =

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


在中是否存在与…End With的等价性?

C#没有相应的语言结构。

没有与…的等价性。。。以…结尾


这里为您演示Visual Basic和C#之间的区别。

C#中没有等效的结构。这是一个Visual Basic 6.0/功能

它不是等价的,但是这种语法对您有用吗

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

我认为这相当于下面的VB

与SomeObjectExpression()
.SomeProperty=5
.SomeOtherProperty=“你好”
以
这是C#

{
Var q=SomeOtherExpression();
q、 SomeProperty=5;
q、 SomeOtherProperty=“你好”;
}

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

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

我很喜欢

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

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

这是真的。但是,如果您有一个类,其中包含返回“this”的方法,那么您可以将这些方法链接在一起。with现在可用于C#9记录(但不是100%相同的概念),“with”实际上早在VB之前就存在了。它存在于Pascal中,用于处理记录类型。不知道帕斯卡是不是从其他地方借鉴了这个想法。外面的卷发是怎么回事?很抱歉,但这一点与等效值相差甚远。它只是对setter的一系列调用。外部大括号设置变量q的范围。如果对象表达式是一个类而不是一个结构,我认为上面的VB.Net和C#代码几乎完全是等价的。前一条语句是如何使用with语句的示例,后一条语句是C#翻译。C#示例使用了两个setter,因为任意选择的VB.net示例就是这样做的。关键的一点是,“with”相当于定义一个临时变量,然后在任何时候使用一个没有前面标识符的句点时使用它。这不是等价的,它是一种替代方法。@JohnStock:当我说“等价”时,我指的是行为。无论
SomeOtherExpression
或属性设置程序做什么,我认为除了使用反射来检查调用上下文外,他们中的任何人都无法确定上面的代码段中有哪些正在对其进行评估。反射可以区分调用上下文,这一事实使它们并不完全相同,但在所有其他方面,行为都是相同的。这个比较图太棒了。我正在努力从VB转换到C语言,这将非常有帮助。虽然不完全一样,但我喜欢你的想法。如果与良好的格式一起使用,它可以使代码更具可读性。因此,您最终再次重复变量名。您也可以使用:
x=longinInstanceOfPersonVariableName;x、 AgeIntVar=21//等等。
我只是在嘴里吐了一点。“With”不会创建实例,所以这是错误的。@John Stock,但它在某种程度上解决了一些问题。一切都取决于上下文。当您需要设置一些属性并使用某种类型的属性注入时,这将简化一些事情。当然,主要的问题是,这不允许调用某种返回函数,因为它需要已经创建的实例。
LongInstanceOfPersonVariableName.With(x => {
     x.AgeIntVar = 21;
     x.NameStrVar = "John";
     x.NameStrVar += " Smith";
     //etc..
});