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# 什么;仅限初始设置器“;提供,与C中的readonly有什么区别#_C#_C# 9.0 - Fatal编程技术网

C# 什么;仅限初始设置器“;提供,与C中的readonly有什么区别#

C# 什么;仅限初始设置器“;提供,与C中的readonly有什么区别#,c#,c#-9.0,C#,C# 9.0,我可以定义如下所示的类: public class MyClass { public int Id { get; } public MyClass(int id) => Id = id; } 我必须从构造函数中定义Id,它将是只读的 但是,如果我想在C#9.0中使用Init-only setters,它是什么?我如何使用它 public class MyClass { public int Id { get; init; } } 简言之: var obj=新MyClass

我可以定义如下所示的类:

public class MyClass
{
  public int Id { get; }
  public MyClass(int id) => Id = id;
}
我必须从构造函数中定义
Id
,它将是只读的

但是,如果我想在
C#9.0
中使用
Init-only setters
,它是什么?我如何使用它

public class MyClass
{
  public int Id { get; init; }
}
简言之:

var obj=新MyClass
{
Id=42//完全正常
};
对象Id=43;//不好,我们没有初始化

在这种情况下很简单,与使用构造函数参数没有太大区别,但在一些更复杂的场景中很有用,您不需要200个构造函数参数,但希望它在构造后外观上是不可变的。

仅初始化设置器提供一致的语法来初始化对象的成员。属性初始值设定项可以明确哪个值正在设置哪个属性。缺点是这些属性必须是可设置的

这样,您就不需要在开始时提供值和构造函数,并且可以在之后提供:

var myClass = new MyClass 
{ 
   Id = 10 
}
它将被密封,你不能再改变它了

myClass.Id = 43; // not allowed
阅读