代码之家  ›  专栏  ›  技术社区  ›  variable

如何为使用init语法的类构造对象?

  •  0
  • variable  · 技术社区  · 4 年前
    public class Person
    {
       private string _myName;
    
       public Person(string myName)
       {
          _myName= myName;
       }
    
       public string Name => _myName;
    }
    

    我对对象构造使用的理解如下: var obj = new Person("Tim");

    仅限init的setter仅在对象构造期间为属性或索引器元素赋值。下面是使用 init :

    public class Person
    {
       private string _myName;
    
       public string Name
         {
             get => _myName; 
             init => _myName= value;
         }
    }
    

    为这样的类构造对象的方法是什么,以便在对象构造期间调用init?例如:

    1. var obj=新员工(“Tim”);

    2. var obj = new Person().Name("Tim");

    3. var obj = new Person(); obj.Name="Tim";

    我找不到对象是如何在中创建的 初始化 此msdn链接中的示例: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/init

    2 回复  |  直到 4 年前
        1
  •  2
  •   MindSwipe    4 年前

    问题是你们班 Person 不公开无参数构造函数,您的类只有一个以字符串为参数的构造函数,这意味着您无法调用 new Person(); 你 必须 提供字符串类型的参数。也就是说,创造新世界的唯一途径 人 在你看来,目前的例子是:

    var person = new Person("Anders Hejlsberg");
    

    然后你就不能修改了 Name 随着对象的初始化完成。如果你想 改变 这个 名称 属性之后,您必须删除 init 关键字并使用普通setter。如果你想初始化你的对象,比如

    var person = new Person
    {
        Name = "Denis Ritchie"
    };
    

    (旁注:这是因为 new Person { ... } 隐式调用无参数构造函数,即它等于 new Person() { ... } ,你也可以 new Person("Richard Stallman") { ... } 如果你想强制一个人必须有 名称 )

    你必须给你的类一个无参数构造函数(或者删除你唯一的构造函数),我还建议使用 auto property (即没有明确的支持字段)。这样重新编写你的课程会导致:

    public class Person
    {
        public string Name { get; init; }
    }
    
    // usage
    var person = new Person
    {
        Name = "Erich Gamma"
    };
    

    如果要强制执行该类型的对象 人 总是有一个 名称 设置,但仍要使用 初始化 属性对于其他属性,可以这样做:

    public class Person
    {
        public string Name { get; init; }
    
        public string Nickname { get; init; }
    
        public Person(string name)
        {
            Name = name;
        }
    }
    
    // usage
    var linus1 = new Person("Linus Torvalds");
    var linus2 = new Person("Linus Sebastian")
    {
        Nickname = "Linus 'TechTips' Sebastian"
    };
    
        2
  •  0
  •   Gimly    4 年前

    那就是

    var myPerson = new Person() { Name = "Tim" };
    

    或者,你甚至可以省略括号,这是有效的。

    var myPerson = new Person { Name = "Tim" };
    

    此外,您可以大大简化示例,不需要定义属性 myName .您可以简单地使用如下自动属性:

    public class Person
    {
        public string Name { get; init; }
    }
    
    推荐文章