初始化私有成员c#
我有两个私有列表需要在创建对象时初始化。第二个列表依赖于第一个列表。我可以这样做吗:初始化私有成员c#,c#,.net,initialization,C#,.net,Initialization,我有两个私有列表需要在创建对象时初始化。第二个列表依赖于第一个列表。我可以这样做吗: public class MyClass { private List<T> myList = new List<T>(); private ReadOnlyCollection<T> myReadOnlyList = myList.AsReadOnly; ... } 否。如果要基于类中的单独变量初始化变量,则需要在构造函数
public class MyClass
{
private List<T> myList = new List<T>();
private ReadOnlyCollection<T> myReadOnlyList = myList.AsReadOnly;
...
}
否。如果要基于类中的单独变量初始化变量,则需要在构造函数中执行此操作:
public class MyClass
{
private List<T> myList = new List<T>();
private ReadOnlyCollection<T> myReadOnlyList;
public MyClass()
{
myReadOnlyList = myList.AsReadOnly;
}
}
公共类MyClass
{
私有列表myList=新列表();
私有只读集合myReadOnlyList;
公共MyClass()
{
myReadOnlyList=myList.AsReadOnly;
}
}
内联初始化器始终在静态上下文中运行,这意味着您无法访问类中的成员变量。但是,在构造函数内部,您可以这样做。内联初始值设定项将出现在构造函数之前,这就是我可以保留列表初始化的原因。是的,您应该将myReadOnlyList的初始化放在构造函数中,但为了一致性,我建议将两者都放在构造函数中 我能指望c#每次运行时都会按这个顺序执行这两行吗
是的,合法时的实例变量初始值设定项(见下文)按其出现的顺序运行。请参阅本规范第§10.11.2节: 这对应于一系列赋值,这些赋值在进入构造函数之后和隐式调用直接基类构造函数之前立即执行。变量初始值设定项按照它们在类声明中出现的文本顺序执行 但是,字段初始值设定项不能像您所做的那样引用非静态字段。你的代码不合法。这是本规范的§10.5.5.2: 实例字段的变量初始值设定项不能引用正在创建的实例。因此,在变量初始值设定项中引用它是编译时错误,因为变量初始值设定项通过简单名称引用任何实例成员是编译时错误 关于你的第二个问题: 或者我应该把这个初始化放在构造函数中吗 根据上述情况,你别无选择。您至少必须将
myReadOnlyList
的初始化放在构造函数中,因为它引用实例字段myList
。为了清楚起见,我将把这两个都放在构造函数中
最后一点,关于另一个问题。即使是以下情况也不合法:
public class MyClass {
private List<T> myList;public class MyClass
private ReadOnlyCollection<T> myReadOnlyList;
public MyClass() {
myList = new List<T>();
myReadOnlyList = myList.AsReadOnly;
}
公共类MyClass{
私有列表myList;公共类MyClass
私有只读集合myReadOnlyList;
公共MyClass(){
myList=新列表();
myReadOnlyList=myList.AsReadOnly;
}
这是因为您没有将
MyClass
声明为泛型类。将public class MyClass
替换为public class MyClass
成为会员11个月后,您应该非常熟悉这里的投票人的沉默驾驶;)@Mehrdad:是的,但我一直很好奇为什么人们会随机地投反对票-所以我通常会问。我偶尔会得到回复;)[个人来说,我喜欢有理由被否决的时候,因为这通常是一个学习机会。]关于你的编辑,请看下面我的回答:。错误消息很糟糕,应该是这样的:“字段初始化不能引用以前的字段”“是的,合法(见下文)时的实例变量初始值设定项按其出现的顺序运行。”--旁注:未定义分部类不同“部分”中初始值设定项的求值顺序。
public class MyClass {
private List<T> myList;public class MyClass
private ReadOnlyCollection<T> myReadOnlyList;
public MyClass() {
myList = new List<T>();
myReadOnlyList = myList.AsReadOnly;
}