【问题标题】:Class constructor for List<string>List<string> 的类构造函数
【发布时间】:2013-11-13 17:27:17
【问题描述】:

我有以下课程

MyClass
{

    public int Id {get;set;}
    public string Name {get;set;}
    public List<string> FriendNames {get;set;} 

    public MyClass()
    {
       FriendNames = new List<string>();
    }
}

像我做的那样初始化列表是正确的还是应该是

this.FriendNames = new List<string>;

有什么不同吗?

然后在我的代码中我可以创建一个类似的实例

MyClass oMyClass = new MyClass();
oMyClass.Id = 1;
oMyClass.Name = "Bob Smith";
oMyClass.FriendNames.Add("Joe King");

【问题讨论】:

  • 通常当你在一个类中有一个集合时,你会将它标记为{get; private set;},这样外部用户就无法替换底层集合。

标签: c# class constructor initialization


【解决方案1】:

这里this.FriendNames = new List&lt;string&gt;;FriendNames = new List&lt;string&gt;; 完全相同this 仅当您拥有与您的属性名称相同的变量时才会计算在内。

喜欢这里:

public MyClass(List<string> FriendNames)
{
    this.FriendNames = FriendNames; // here we have to specify which FriendNames is from this class
}

构造函数是用来初始化一些资源的,所以初始化你的列表是个好主意。

您可以创建带有名称和 id 的构造函数(如果您总是分配它们)

public MyClass(string name, int id)
{
   FriendNames = new List<string>();
   Name = name;
   Id = id;
}

并将您的代码更改为:

MyClass oMyClass = new MyClass("Bob Smith", 1);
oMyClass.FriendNames.Add("Joe King");

【讨论】:

    【解决方案2】:

    你可以这样做。

        private List<string> list = new List<string>();
    
        public List<string> List
        {
            get { return list; }
            set { list = value; }
        }
    

    【讨论】:

      【解决方案3】:

      实例化一个列表应该是这样的

      FriendNames = new List<string>();
      

      如果您询问是否需要 this,如果您的构造函数获取了 FriendNames 的列表,这样您的意思就有歧义,那么您必须使用 this 来表明您想将它分配给对象的实例。

      public MyClass(List<String> FriendNames)
      {
         this.FriendNames = FriendNames;
      }
      

      【讨论】:

        【解决方案4】:

        没有真正的区别。所以归结为偏好。

        有些人喜欢这样做,因为它非常明确和自我评论。其他人则认为它使代码混乱。

        重要的是你在构造函数中实例化了List。太多人忘记做的事情。

        在这个 SO 问题中接受的答案有一个很好的列表,说明何时使用 this 关键字

        When do you use the “this” keyword?

        【讨论】:

          【解决方案5】:

          如果您使用this.FriendNames = new List&lt;string&gt;;,您第一眼就会发现这是一个类变量。

          尤其是在具有许多变量的大型类中,这可能是一个优势,因为您可以更轻松/更快地将类变量与局部变量区分开来。

          但正如这里的许多其他人所说,这取决于您的喜好。

          如果你有一个类和一个同名的局部变量,这一点变得很重要,如下所示:

          MyClass
          {
              public List<string> FriendNames {get;set;} 
          
              public SetMyList(List<string> FriendNames)
              {
                 this.FriendNames = FriendNames;
              }
          }
          

          在这种情况下,您必须使用this-keyword

          【讨论】:

            【解决方案6】:

            使用它来初始化你的类的一个实例

            var x = new MyClass { Id = 1, Name = "Steve", 
                        FriendNames = { "John", "Paul", "Ringo", "George" } };
            

            而且一般不要使用“this”。引用,我很少看到它以这种方式使用(我经常使用代码中剩下的任何匈牙利符号的唯一残余,通过在私有字段前加上“_”所以至少

            public void DoSomething();
            {
               _myInt = 123;
            }
            private int _myInt;
            public int MyInt { get { return _myInt; } }
            

            意味着我知道发生了什么,但我确信外面的人不会喜欢“_”。

            【讨论】:

            • 使用new MyClass { Id = 1, Name = "Steve", 的应该换成构造函数
            • 您提供了另一种选择 - 明确编写构造函数来获取一组参数。但这不是做到这一点的“正确方法”。当微软引入这种风格的初始化列表时,这意味着我不必再编写多个重载的构造函数了。大多数时候,您希望能够灵活地创建和初始化对象,构造函数不允许您这样做。
            【解决方案7】:

            应该是

            FriendNames = new List<string>();
            

            或者

            FriendNames = new List<string>(123456);
            

            如果您在初始化之前知道容量。

            【讨论】:

            • 两者都没有编译,这也没有提供问题的答案
            • 我已编辑以修复编译时错误。 “123456”是什么意思?你的意思是你在做什么?您将列表的容量预设为 123456
            • 谢谢@Sriram,是的,只要知道需要容量的任何数字。
            • @Recursor 这对 OP 有何帮助?
            • @wudzik 在编辑之前,列表后没有括号,因此无法编译。还有“这个”。 before 是不需要的。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-09-10
            • 2015-05-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多