[英]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]))
});
为了回答这个问题,我将基于您的示例的简化版本
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.