对象和集合初始化器和访问器
Object & Collection Initializers and Accessors
首先我想说我是 C# 的新手,因此访问器和对象初始化器对我来说是一个全新的概念。也就是说,我认为我对它们的处理还不错,除了下面的例子让我很困惑:
using System;
using System.Collections.ObjectModel;
class How {
public ObservableCollection<int> Coll {
get { return coll_; }
set {
Console.WriteLine("Setter for Coll Called!");
coll_.Clear();
foreach (int i in value)
coll_.Add(i);
}
}
public string Field {
get { return field_; }
set {
Console.WriteLine("Setter for field called");
field_ = value;
}
}
// To confirm the internal coll_ is actually set
public void Test() {
foreach(int i in coll_)
Console.Write(i + " ");
}
public How() {
coll_ = new ObservableCollection<int>();
field_ = "";
}
private ObservableCollection<int> coll_;
private string field_;
}
public class Test {
public static void Main() {
var how = new How {
Coll = { 1, 2, 3, 4, 5 },
Field = "Test Field",
};
Console.Write("Coll: ");
foreach (int i in how.Coll)
Console.Write(i + " ");
Console.WriteLine();
Console.WriteLine("Field: " + how.Field);
Console.Write("Internal coll_: ");
how.Test();
Console.WriteLine();
}
}
以上代码的输出是(见实例here):
Setter for field called
Coll: 1 2 3 4 5
Field: Test Field
Internal coll_: 1 2 3 4 5
Field
完全按照我的预期运行,但 Coll
让我感到困惑。 setter 到 Coll
永远不会被调用,这对我来说意味着集合初始值设定项不会将 will 与属性(或至少是非自动属性)混合。但是,如果是这样的话,我会预料到会出现编译时错误。
不管这部分行为如何,更让我困惑的是 coll_
的内部值以某种方式设置为初始化值。
我很想知道 a) 为什么不调用 Coll
的集合,以及 C# 如何设置 coll_
的值。在 Coll
的 get 和 set 访问器中使用该标识符是否足以让 C# 将 coll_
识别为内部存储?或者也许因为它是相应类型的唯一成员而设置的?
var how = new How
{
Coll = { 1, 2, 3, 4, 5 },
Field = "Test Field",
};
这是 How
class 的对象初始化语法。
Coll = { 1, 2, 3, 4, 5 }
是集合初始化器语法的一种形式,适用于没有 public setter 的集合属性(但与 有 setter)。此表单需要实例化 Coll
(不是 null
):尝试在构造函数中注释 coll_ = new ObservableCollection<int>();
行,程序将因 NullReferenceException 而崩溃。
Coll = { 1, 2, 3, 4, 5 }
在重复的 Coll.Add
调用中翻译:
Coll.Add(1);
Coll.Add(2);
Coll.Add(3);
Coll.Add(4);
Coll.Add(5);
确认它在 How
构造函数中添加事件处理程序:
public How()
{
coll_ = new ObservableCollection<int>();
coll_.CollectionChanged += (o,e) =>
{ Console.WriteLine("New items: {0}", String.Join (",", e.NewItems.OfType<int>())); };
field_ = "";
}
C# 语言规范的第 7.6.10.3 节中描述了集合初始值设定项
首先我想说我是 C# 的新手,因此访问器和对象初始化器对我来说是一个全新的概念。也就是说,我认为我对它们的处理还不错,除了下面的例子让我很困惑:
using System;
using System.Collections.ObjectModel;
class How {
public ObservableCollection<int> Coll {
get { return coll_; }
set {
Console.WriteLine("Setter for Coll Called!");
coll_.Clear();
foreach (int i in value)
coll_.Add(i);
}
}
public string Field {
get { return field_; }
set {
Console.WriteLine("Setter for field called");
field_ = value;
}
}
// To confirm the internal coll_ is actually set
public void Test() {
foreach(int i in coll_)
Console.Write(i + " ");
}
public How() {
coll_ = new ObservableCollection<int>();
field_ = "";
}
private ObservableCollection<int> coll_;
private string field_;
}
public class Test {
public static void Main() {
var how = new How {
Coll = { 1, 2, 3, 4, 5 },
Field = "Test Field",
};
Console.Write("Coll: ");
foreach (int i in how.Coll)
Console.Write(i + " ");
Console.WriteLine();
Console.WriteLine("Field: " + how.Field);
Console.Write("Internal coll_: ");
how.Test();
Console.WriteLine();
}
}
以上代码的输出是(见实例here):
Setter for field called
Coll: 1 2 3 4 5
Field: Test Field
Internal coll_: 1 2 3 4 5
Field
完全按照我的预期运行,但 Coll
让我感到困惑。 setter 到 Coll
永远不会被调用,这对我来说意味着集合初始值设定项不会将 will 与属性(或至少是非自动属性)混合。但是,如果是这样的话,我会预料到会出现编译时错误。
不管这部分行为如何,更让我困惑的是 coll_
的内部值以某种方式设置为初始化值。
我很想知道 a) 为什么不调用 Coll
的集合,以及 C# 如何设置 coll_
的值。在 Coll
的 get 和 set 访问器中使用该标识符是否足以让 C# 将 coll_
识别为内部存储?或者也许因为它是相应类型的唯一成员而设置的?
var how = new How
{
Coll = { 1, 2, 3, 4, 5 },
Field = "Test Field",
};
这是 How
class 的对象初始化语法。
Coll = { 1, 2, 3, 4, 5 }
是集合初始化器语法的一种形式,适用于没有 public setter 的集合属性(但与 有 setter)。此表单需要实例化 Coll
(不是 null
):尝试在构造函数中注释 coll_ = new ObservableCollection<int>();
行,程序将因 NullReferenceException 而崩溃。
Coll = { 1, 2, 3, 4, 5 }
在重复的 Coll.Add
调用中翻译:
Coll.Add(1);
Coll.Add(2);
Coll.Add(3);
Coll.Add(4);
Coll.Add(5);
确认它在 How
构造函数中添加事件处理程序:
public How()
{
coll_ = new ObservableCollection<int>();
coll_.CollectionChanged += (o,e) =>
{ Console.WriteLine("New items: {0}", String.Join (",", e.NewItems.OfType<int>())); };
field_ = "";
}
C# 语言规范的第 7.6.10.3 节中描述了集合初始值设定项