Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单例继承列表<;T>;_C#_List_Singleton - Fatal编程技术网

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;}
}
公共整数