在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#),则会出现错误。
<变量>未声明
我是这样解决的,不是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]))
});
答案 0 :(得分:3)
要回答这个问题,我将基于您的示例的简化版本
<强> 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
原则。但实际上,您需要做的就是使用变量:
工作C#示例,不违反DRY原则:
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种不同语言会有什么意义呢?
没有。它们是两种不同的语言,有两种不同的哲学。我们应该认为自己很幸运,迁移路径就像现在一样容易。它没有必要成为原因。