无法将项添加到在其他类中初始化的列表中

时间:2017-02-17 14:07:10

标签: c# list initialization

朋友们,我想知道为什么以下代码适用于List<int>而不适用于List<string>。当我在getter of property中初始化list时,它不起作用。如果我在构造函数中初始化它是有效的,如果我在调用类中创建列表它也可以。

public class MyClass
{
    private List<int> _ints;
    private static List<string> _strings;

    public MyClass()
    {
        _ints = new List<int>();
    }
    public List<int> Ints
    {
        get
        {
            return _ints;
        }
        set
        {
            _ints = value;
        }
    }

    public List<string> Strings
    {
        get
        {
            return _strings ?? new List<string>();
        }
    }
}

class Program
{
    static void Main(string[] args)
    {

        MyClass mc = new MyClass();
        // This works
        // mc.Ints = new List<int>();
        // This works           
        mc.Ints.Add(1);
        // This does not
        mc.Strings.Add("Krishna");
   } 
}

6 个答案:

答案 0 :(得分:4)

您没有在getter上初始化变量,如果变量为null,则创建一个新列表,但不存储对它的引用。

将您的代码更改为:

public List<string> Strings
{
    get
    {
        if(_strings == null)
            _strings = new List<string>();

        return _strings;
    }
}

答案 1 :(得分:1)

因为List<int>在您的类的构造函数上初始化,而List<string>没有。尝试:

public MyClass()
{
        _ints = new List<int>();
        _strings=new List<string>();
}

答案 2 :(得分:1)

CREATE TABLE <table_name> as ( column_name1 datatype(), column_name2 datatype() ) INSERT INTO <table_name>(column_name1, column_name2) SELECT <column_names> FROM <table_name>; 无效,因为您每次致电mc.Strings.Add("Krishna");时都会返回新的List<string>。更详细地解释一下:

mc.Strings

简单地说,你做的就像你打电话一样:

MyClass mc = new MyClass(); // create new instance of MyClass and store it in the "mc" variable
mc // Direct call to the instance
    .Strings // Direct call to MyClass Strings property
         // inside Strings property :
         // return _strings ?? new List<string>();
         // meaning that if "_strings" member field is null
         // return new instance of that property's type
    .Add("abc"); // adds "abc" to the "forgotten" instance of List<string>

为了解决这个问题,你可以使用像这样的单线(你明显尝试过):

new List<string>().Add("abc");

或使用if语句:

return _strings ?? ( _strings = new List<string>() );

答案 3 :(得分:0)

你的&#39; _strings&#39; list始终为null。如果你打电话给&#39;得到&#39; &#39; Strings&#39;您始终创建并返回新的列表实例。

    get
    {
        // if '_strings' is null, then create new instance of list
        return _strings ?? new List<string>();
    }

你需要使用它:

    get
    {           
        // If '_strings' is null, then create new instance of list and assign new instance to '_strings'
        return _strings ?? (_strings = new List<string>());
    }

答案 4 :(得分:0)

Gusman答案的内联变体,使用了C#6.0的一些不错的功能

public List<string> Strings => _strings ?? (_strings = new List<string>());

答案 5 :(得分:-1)

仅供参考,为了完全理解这个问题,你可以在这一行上设置一个断点:

return _strings ?? new List<string>();

您会看到_strings始终为空,您需要将其初始化,因为上面的答案会告诉您:)