C# 单例继承列表<;T>;
我的课程结构如下:C# 单例继承列表<;T>;,c#,list,singleton,C#,List,Singleton,我的课程结构如下: public class MyList: List<MyClass> { internal static bool isConfigured; // singleton public MyList() { if (!MyList.isConfigured) { lock ("isConfigured") { if (!M
public class MyList: List<MyClass>
{
internal static bool isConfigured;
// singleton
public MyList()
{
if (!MyList.isConfigured)
{
lock ("isConfigured")
{
if (!MyList.isConfigured)
{
// add some elements to MyList parsing them from an XML
[..]
MyList.isConfigured = true;
}
}
}
}
public static MyClass MyStaticMethod(int argument)
{
foreach (MyClass c in new MyList())
{
// do something
}
return // an instance of MyClass
}
}
我怎样才能解决这个问题?为什么要基于列表设置一个单例类,最好的方法是什么?像其他单身汉一样谢谢你
public class MyList: List<MyClass> {
private readonly static MyList instance = new MyList();
private MyList() { }
public static MyList Instance
{
get
{
return instance;
}
}
}
公共类MyList:列表{
私有只读静态MyList实例=新建MyList();
私有MyList(){}
公共静态MyList实例
{
得到
{
返回实例;
}
}
}
和其他单身汉一样
public class MyList: List<MyClass> {
private readonly static MyList instance = new MyList();
private MyList() { }
public static MyList Instance
{
get
{
return instance;
}
}
}
公共类MyList:列表{
私有只读静态MyList实例=新建MyList();
私有MyList(){}
公共静态MyList实例
{
得到
{
返回实例;
}
}
}
根据错误消息:
非静态字段、方法或属性“MyList.get”需要对象引用
我认为这只是一个名称冲突的情况,例如:
class Foo {
static void Bar() {
MyClass mc = MyList.MyStaticMethod(1); // your erroring line
}
string MyList {get;set;} // the data-type is not important here
}
在这种情况下,修复程序将限定类型MyList
与本地成员MyList
:
MyClass mc = SomeNamespace.MyList.MyStaticMethod(1); // your erroring line
其中SomeNamespace
是MyList
类的名称空间,或者如果它是根名称空间:
MyClass mc = global::MyList.MyStaticMethod(1); // your erroring line
注意:我不能以所描述的方式将此设置为错误,但事实上,它是关于属性访问器的,这使我认为这可能与此相关。根据错误消息: 非静态字段、方法或属性“MyList.get”需要对象引用 我认为这只是一个名称冲突的情况,例如:
class Foo {
static void Bar() {
MyClass mc = MyList.MyStaticMethod(1); // your erroring line
}
string MyList {get;set;} // the data-type is not important here
}
在这种情况下,修复程序将限定类型MyList
与本地成员MyList
:
MyClass mc = SomeNamespace.MyList.MyStaticMethod(1); // your erroring line
其中SomeNamespace
是MyList
类的名称空间,或者如果它是根名称空间:
MyClass mc = global::MyList.MyStaticMethod(1); // your erroring line
注意:我不能以所描述的方式将其出错,但事实上,它是在谈论属性访问器,这使我认为这可能与继承有关。您无法通过继承实现
单例。您必须有一个静态的复合
字段,才能使您的单例
正常工作
调用构造函数时,实际上是在创建MyList
的新实例,并且有一个static
字段isConfigured
关于您的问题的最佳实践是使用工厂方法
,该方法将为您的MyList
提供一个具有附加风格的实例
您所寻求的是从IList
实现,并使用基本上是静态的类型的列表
public class MyList: IList<MyClass>
{
private static MyList _myList = null;
private MyList()
{
}
//This is the factory method
public static MyList GetInstance(int args)
{
return _myList ?? (_myList = new MyList());
}
public IEnumerator<MyClass> GetEnumerator()
{
return _myList.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public void Add(MyClass item)
{
_myList.Add(item);
}
public void Clear()
{
_myList.Clear();
}
public bool Contains(MyClass item)
{
return _myList.Contains(item);
}
public void CopyTo(MyClass[] array, int arrayIndex)
{
_myList.CopyTo(array, arrayIndex);
}
public bool Remove(MyClass item)
{
return _myList.Remove(item);
}
public int Count
{
get { return _myList.Count; }
}
public bool IsReadOnly
{
get { return _myList.IsReadOnly; }
}
public int IndexOf(MyClass item)
{
return _myList.IndexOf(item);
}
public void Insert(int index, MyClass item)
{
_myList.Insert(index, item);
}
public void RemoveAt(int index)
{
_myList.RemoveAt(index);
}
public MyClass this[int index]
{
get { return _myList[index]; }
set { _myList[index] = value; }
}
}
公共类MyList:IList
{
私有静态MyList _MyList=null;
私人MyList()
{
}
//这是工厂法
公共静态MyList GetInstance(int args)
{
返回_myList??(_myList=new myList());
}
公共IEnumerator GetEnumerator()
{
返回_myList.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
返回GetEnumerator();
}
公共作废添加(MyClass项目)
{
_myList.Add(项目);
}
公共空间清除()
{
_myList.Clear();
}
公共布尔包含(MyClass项)
{
返回_myList.Contains(项目);
}
public void CopyTo(MyClass[]数组,int arrayIndex)
{
_myList.CopyTo(数组,数组索引);
}
公共布尔删除(MyClass项)
{
返回_myList.Remove(项目);
}
公共整数计数
{
获取{return\u myList.Count;}
}
公共图书馆是只读的
{
获取{return\u myList.IsReadOnly;}
}
public int IndexOf(MyClass项)
{
返回(项目)的列表索引;
}
公共void插入(int索引,MyClass项)
{
_myList.Insert(索引,项目);
}
公共无效删除(整数索引)
{
_myList.RemoveAt(索引);
}
公共MyClass此[int索引]
{
获取{return _myList[index];}
集合{u myList[index]=value;}
}
}
用法
MyList myList = MyList.GetInstance();
var myClass = new MyClass();
myList.Add(myClass);
Assert.Equal(myClass, myList[0]); // yields true
// Now you basically an instance of List<MyClass>
// and which is singleton.
MyList MyList=MyList.GetInstance();
var myClass=新的myClass();
添加(myClass);
Assert.Equal(myClass,myList[0]);//屈服于真实
//现在您基本上是列表的一个实例
//哪一个是单身。
继承无法实现单例。您必须有一个静态的复合
字段,才能使您的单例
正常工作
调用构造函数时,实际上是在创建MyList
的新实例,并且有一个static
字段isConfigured
关于您的问题的最佳实践是使用工厂方法
,该方法将为您的MyList
提供一个具有附加风格的实例
您所寻求的是从IList
实现,并使用基本上是静态的类型的列表
public class MyList: IList<MyClass>
{
private static MyList _myList = null;
private MyList()
{
}
//This is the factory method
public static MyList GetInstance(int args)
{
return _myList ?? (_myList = new MyList());
}
public IEnumerator<MyClass> GetEnumerator()
{
return _myList.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public void Add(MyClass item)
{
_myList.Add(item);
}
public void Clear()
{
_myList.Clear();
}
public bool Contains(MyClass item)
{
return _myList.Contains(item);
}
public void CopyTo(MyClass[] array, int arrayIndex)
{
_myList.CopyTo(array, arrayIndex);
}
public bool Remove(MyClass item)
{
return _myList.Remove(item);
}
public int Count
{
get { return _myList.Count; }
}
public bool IsReadOnly
{
get { return _myList.IsReadOnly; }
}
public int IndexOf(MyClass item)
{
return _myList.IndexOf(item);
}
public void Insert(int index, MyClass item)
{
_myList.Insert(index, item);
}
public void RemoveAt(int index)
{
_myList.RemoveAt(index);
}
public MyClass this[int index]
{
get { return _myList[index]; }
set { _myList[index] = value; }
}
}
公共类MyList:IList
{
私有静态MyList _MyList=null;
私人MyList()
{
}
//这是工厂法
公共静态MyList GetInstance(int args)
{
返回_myList??(_myList=new myList());
}
公共IEnumerator GetEnumerator()
{
返回_myList.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
返回GetEnumerator();
}
公共作废添加(MyClass项目)
{
_myList.Add(项目);
}
公共空间清除()
{
_myList.Clear();
}
公共布尔包含(MyClass项)
{
返回_myList.Contains(项目);
}
public void CopyTo(MyClass[]数组,int arrayIndex)
{
_myList.CopyTo(数组,数组索引);
}
公共布尔删除(MyClass项)
{
返回_myList.Remove(项目);
}
公共整数计数
{
获取{return\u myList.Count;}
}
公共图书馆是只读的
{
获取{return\u myList.IsReadOnly;}
}
公共整数