vb.net与c#对象初始值设定项:c#中的限制?
在VB.NET中,可以使用对象初始值设定项并引用右侧的相同成员,如下所示:vb.net与c#对象初始值设定项:c#中的限制?,c#,vb.net,C#,Vb.net,在VB.NET中,可以使用对象初始值设定项并引用右侧的相同成员,如下所示: GetValue.Add(使用{ .Type=CType(NvpInfo(索引),类型), .Name=NvpInfo(索引+2).ToString, .NvpValues=CType(.Type.GetField(NvpInfo(Index+1).ToString).GetValue(Instances.First(函数(o)o不是零,并且o.GetType=CType(NvpInfo(Index),Type))),N
GetValue.Add(使用{
.Type=CType(NvpInfo(索引),类型),
.Name=NvpInfo(索引+2).ToString,
.NvpValues=CType(.Type.GetField(NvpInfo(Index+1).ToString).GetValue(Instances.First(函数(o)o不是零,并且o.GetType=CType(NvpInfo(Index),Type))),NameValuePair()
})
注意,在设置.NvpValues
的行中,您可以引用.Type
,这没有问题
但是,如果您尝试在c#中执行此操作(或者像我一样,尝试将项目从vb.net转换为c#),则会出现错误
未申报
我是这样处理的,这并不是因为重复了((Type)NvpInfo[Index])
:
functionReturnValue.Add(新数组索引信息{
类型=(类型)NvpInfo[索引],
Name=NvpInfo[Index+2].ToString(),
NvpValues=(NameValuePair[])((类型)NvpInfo[Index]).GetField(NvpInfo[Index+1].ToString()).GetValue(实例。首先(o=>o!=null&&o.GetType()=(类型)NvpInfo[Index]))
});
为了回答这个问题,我将以您的示例的简化版本为基础 VB.NET:
Dim c=带有{
.Prop1=“abc”,
.Prop2=.Prop1
}
Console.WriteLine(c.Prop1)“打印”abc“
Console.WriteLine(c.Prop2)'打印“abc”
C#
var c=new SomeClass
{
Prop1=“abc”,
Prop2=Prop1//无法编译。无法在此处引用Prop1。
};
控制台写入线(c.Prop1);
控制台写入线(c.Prop2);
回答最后一个问题:
有没有更好的方法来解决这个问题,并且仍然使用对象初始值设定项
因此,您关注的一个问题是,由于C#不允许在对象初始化语句中引用其他属性,因此它会导致您违反DRY
原则。但实际上,您需要做的就是使用变量:
工作C#不违反干燥原则的示例:
string temp=“abc”;
var c=新类
{
Prop1=温度,
Prop2=温度
};
控制台写入线(c.Prop1);//打印“abc”
控制台写入线(c.Prop2);//打印“abc”
为什么c#不允许这样?我认为应该
显然,只有语言的设计者才能真正回答这个问题。但我至少可以分享为什么我更喜欢C的设计决策。例如,在VB.NET版本中,如果我错误地以不同的顺序初始化属性:
Dim c=带有{
.Prop2=.Prop1,
.Prop1=“abc”
}
Console.WriteLine(c.Prop1)“打印”abc“
Console.WriteLine(c.Prop2)“不打印任何内容
。。。代码仍然是“合法的”,但我现在无意中引入了一个bug,Prop2
现在初始化错误
因为C#不允许这样做,所以它可以防止大多数与属性初始化顺序相关的bug。我同意,在这个非常简单的例子中,很难想象有人会犯这样的错误。但是,随着更多属性和更复杂的初始化语句的出现,它可能不会如此明显,并且更容易出错。C#帮助您避免这些微妙的错误
我认为将遗留代码转换为c#应该尽可能轻松
我猜你是在暗示VB.NET
是一种遗留语言?有些人可能会生气:)
但更严重的是,您是否暗示应该做出语言设计决策以促进从其他语言的迁移C#
和VB.NET
本身就是两种功能齐全的语言。它们不应该有匹配和对称的语言设计。如果他们这样做了,那么拥有两种不同的语言又有什么意义呢
不,它们是两种不同的语言,有两种不同的哲学。我们应该感到幸运的是,移民路线和现在一样容易。没有理由需要这样做。为了回答这个问题,我将以您的示例的简化版本为基础 VB.NET:
Dim c=带有{
.Prop1=“abc”,
.Prop2=.Prop1
}
Console.WriteLine(c.Prop1)“打印”abc“
Console.WriteLine(c.Prop2)'打印“abc”
C#
var c=new SomeClass
{
Prop1=“abc”,
Prop2=Prop1//无法编译。无法在此处引用Prop1。
};
控制台写入线(c.Prop1);
控制台写入线(c.Prop2);
回答最后一个问题:
有没有更好的方法来解决这个问题,并且仍然使用对象初始值设定项
因此,您关注的一个问题是,由于C#不允许在对象初始化语句中引用其他属性,因此它会导致您违反DRY
原则。但实际上,您需要做的就是使用变量:
工作C#不违反干燥原则的示例:
string temp=“abc”;
var c=新类
{
Prop1=温度,
Prop2=温度
};
控制台写入线(c.Prop1);//打印“abc”
控制台写入线(c.Prop2);//打印“abc”
为什么c#不允许这样?我认为应该
显然,只有语言的设计者才能真正回答这个问题。但我至少可以分享为什么我更喜欢C的设计决策。例如,在VB.NET版本中,如果我错误地以不同的顺序初始化属性:
Dim c=带有{
.Prop2=.Prop1,
.Prop1=“abc”
}
Console.WriteLine(c.Prop1)“打印”abc“
Console.WriteLine(c.Prop2)“不打印任何内容
。。。代码是