繁体   English   中英

vb.net vs c#对象初始化程序:c#中的限制?

[英]vb.net vs c# object initializer: limitation in c#?

在VB.NET中,您可以使用对象初始化程序并在右侧引用相同的成员,如下所示:

  GetValue.Add(New ArrayIndexInfo() With {
               .Type = CType(NvpInfo(Index), Type),
               .Name = NvpInfo(Index + 2).ToString,
               .NvpValues = CType(.Type.GetField(NvpInfo(Index + 1).ToString).GetValue(Instances.First(Function(o) o IsNot Nothing AndAlso o.GetType = CType(NvpInfo(Index), Type))), NameValuePair())
               })

请注意,在设置.NvpValues的行中,您可以如何引用.Type ,这没问题。

但是,如果您尝试在c#中执行此操作(或像我一样,尝试将项目从vb.net转换为c#),则会出现错误。

<variable>未声明

我像这样解决它,它不是DRY,因为((Type)NvpInfo[Index])被重复了:

        functionReturnValue.Add(new ArrayIndexInfo {
            Type = (Type)NvpInfo[Index],
            Name = NvpInfo[Index + 2].ToString(),
            NvpValues = (NameValuePair[])((Type)NvpInfo[Index]).GetField(NvpInfo[Index + 1].ToString()).GetValue(Instances.First(o => o != null && o.GetType() == (Type)NvpInfo[Index]))
        });
  1. 为什么C#不允许这样做? 我认为应该。 我认为将遗留代码转换为C#应该尽可能轻松。
  2. 有没有更好的方法可以解决此问题,并且仍然使用对象初始化程序?

为了回答这个问题,我将基于您的示例的简化版本

VB.NET

Dim c = New SomeClass With {
    .Prop1 = "abc",
    .Prop2 = .Prop1
}

Console.WriteLine(c.Prop1) 'prints "abc"
Console.WriteLine(c.Prop2) 'prints "abc"

C#

var c = new SomeClass
{
    Prop1 = "abc",
    Prop2 = Prop1 // won't compile. Can't reference Prop1 here.
};

Console.WriteLine(c.Prop1);
Console.WriteLine(c.Prop2);

解决您的最后一个问题:

有没有更好的方法可以解决此问题,并且仍然使用对象初始化程序?

因此,您担心的一个问题是,由于C#不允许在对象初始化语句中引用其他属性,因此它会导致您违反DRY原理。 但实际上,您需要做的就是使用变量:

不违反DRY原理的工作C#示例:

string temp = "abc";
var c = new SomeClass
{
    Prop1 = temp,
    Prop2 = temp
};

Console.WriteLine(c.Prop1); // prints "abc"
Console.WriteLine(c.Prop2); // prints "abc"

为什么C#不允许这样做? 我认为应该。

显然,只有语言的设计师才能真正回答这一问题。 但是我至少可以分享为什么我更喜欢C#的设计决策。 例如,在VB.NET版本中,如果我错误地以不同的顺序初始化属性:

Dim c = New SomeClass With {
    .Prop2 = .Prop1,
    .Prop1 = "abc"
}

Console.WriteLine(c.Prop1) 'prints "abc"
Console.WriteLine(c.Prop2) 'prints nothing

...代码仍然是“合法的”,但是我现在无意中引入了一个错误,并且Prop2现在被错误地初始化。

因为C#不允许这样做,所以它可以防止大多数与属性初始化顺序有关的错误。 我同意在这个非常简化的示例中,很难想象有人会犯该错误。 但是,随着更多的属性和更复杂的初始化语句,它可能不会那么明显,并且更容易出错。 C#可帮助您避免这些细微的错误。

我认为将遗留代码转换为C#应该尽可能轻松。

我猜您是在暗示VB.NET是一种传统语言吗? 有些人可能会冒犯:)

但更严重的是,您是否暗示应该制定语言设计决策以促进从其他语言的移植? C#VB.NET本身就是两种功能齐全的语言。 它们并不具有匹配和对称的语言设计。 如果他们这样做了,那么拥有2种独立语言的意义何在?

不。它们是2种不同的语言,具有2种不同的哲学。 我们应该认为自己很幸运,迁移路径是如此简单。 没有理由这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM