Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.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#9中,init是什么意思?_C# - Fatal编程技术网

在c#9中,init是什么意思?

在c#9中,init是什么意思?,c#,C#,我在c#9预览中遇到了c#中的“init”关键字。它意味着什么?它的应用是什么 public class Person { private readonly string firstName; private readonly string lastName; public string FirstName { get => firstName; init => firstName = (value ?? thr

我在c#9预览中遇到了c#中的“init”关键字。它意味着什么?它的应用是什么

public class Person
{
    private readonly string firstName;
    private readonly string lastName;

    public string FirstName 
    { 
        get => firstName; 
        init => firstName = (value ?? throw new ArgumentNullException(nameof(FirstName)));
    }
    public string LastName 
    { 
        get => lastName; 
        init => lastName = (value ?? throw new ArgumentNullException(nameof(LastName)));
    }
}

init类似于旧的“set”,但只允许在创建/初始化类时使用它

比如:

在此之后,您不允许更改FirstName或LastName

这将引发一种期待:

var p = new Person();
p.FirstName = "Adam";

init关键字创建所谓的仅限init的setter。他们在C#中添加了仅限init的属性和索引器的概念。这些属性和索引器可以在对象创建时设置,但只有在对象创建完成后才能有效获取

引入的主要原因是避免使用样板代码

像Point这样的简单不可变对象需要:

struct Point
{
    public int X { get; }
    public int Y { get; }

    public Point(int x, int y)
    {
        this.X = x;
        this.Y = y;
    }
}

init访问器允许调用方在构造过程中对成员进行变异,从而使不可变对象更加灵活。这意味着对象的不可变属性可以参与对象初始值设定项,从而消除了对类型中所有构造函数样板的需要。现在,点类型仅为:

struct Point
{
    public int X { get; init; }
    public int Y { get; init; }
}
然后,使用者可以使用对象初始值设定项来创建对象

var p = new Point() { X = 42, Y = 13 };
您可以在此处阅读包含更多详细信息和说明的提案:


这将是一个很好的功能,允许开发人员更有效地使用只读属性。这是一个例外还是编译时错误?据我所知,这是一个错误,比一个例外要好得多。正如你所提到的,根据提案,它只提到了错误,但没有提供更多的细节。但我猜它会像今天其他的setter一样工作,如果你只使用get(没有set),你会得到一个即时错误,我希望这也能工作。“通过允许调用方在构造过程中变异成员”-抱歉,这应该是“初始化过程中的成员”,不是在构造期间,因为在类型的构造函数完成之后和赋值之前,只调用init属性。
var p = new Point() { X = 42, Y = 13 };