C# 对象初始化类似于列表<&燃气轮机;语法
如何定义类,使其可以像C# 对象初始化类似于列表<&燃气轮机;语法,c#,collections,collection-initializer,C#,Collections,Collection Initializer,如何定义类,使其可以像List一样初始化: 如果将MyClass定义为学生集合: public class MyClass : List<Student> { } var aClass = new MyClass{ new Student(), new Student()//... } 您选择哪一个真正取决于您对类的建模方式。我没有看到任何人建议泛型实现,所以就在这里 class Class<T> : IEnumerable { private L
List
一样初始化:
如果将
MyClass
定义为学生集合:
public class MyClass : List<Student>
{
}
var aClass = new MyClass{ new Student(), new Student()//... }
您选择哪一个真正取决于您对类的建模方式。我没有看到任何人建议泛型实现,所以就在这里
class Class<T> : IEnumerable
{
private List<T> list;
public Class()
{
list = new List<T>();
}
public void Add(T d)
{
list.Add(d);
}
public IEnumerator GetEnumerator()
{
return list.GetEnumerator();
}
}
class类:IEnumerable
{
私人名单;
公共类()
{
列表=新列表();
}
公共无效添加(TD)
{
列表.添加(d);
}
公共IEnumerator GetEnumerator()
{
返回list.GetEnumerator();
}
}
和使用:
Class<int> s = new Class<int>() {1,2,3,4};
Class s=newclass(){1,2,3,4};
通常,为了允许直接在类上使用语法,它将实现一个集合接口,例如ICollection
或类似的接口(比如通过继承集合
)
但从技术上讲,它只需要实现非泛型的IEnumerable
接口,并具有兼容的Add
方法
所以这就足够了:
using System.Collections;
public class Class : IEnumerable
{
// This method needn't implement any collection-interface method.
public void Add(Student student) { ... }
IEnumerator IEnumerable.GetEnumerator() { ... }
}
用法:
Class aClass = new Class { new Student(), new Student() };
正如您所料,编译器生成的代码类似于:
Class temp = new Class();
temp.Add(new Student());
temp.Add(new Student());
Class aClass = temp;
有关更多信息,请参阅的“7.6.10.3集合初始值设定项”部分。您的类是否继承自IList?但ICollection和IEnumarable都没有void Add()方法,只有IList有。这是否意味着我需要实现IList(这是更好的实践,尽管您的示例运行良好)?ICollection
确实有一个方法,尽管编译器绑定的方法不必来自该接口(如示例所示)。是否实现IList取决于集合是否必须支持按索引快速访问。
using System.Collections;
public class Class : IEnumerable
{
// This method needn't implement any collection-interface method.
public void Add(Student student) { ... }
IEnumerator IEnumerable.GetEnumerator() { ... }
}
Class aClass = new Class { new Student(), new Student() };
Class temp = new Class();
temp.Add(new Student());
temp.Add(new Student());
Class aClass = temp;