如何通过调用构造函数提供 read-only 属性 的值?
How can I supply a read-only property's value by calling a constructor?
我有一本书 class,它的构造函数有一个标题参数:
public class Book
public Book (string title)
{
this.Title = title;
}
我需要通过调用 Book 构造函数来提供 Title 的 (read-only 属性) 值。我尝试了以下但不确定这是否正确,因为据我了解 read-only 属性 应该只有 getter.
public string Title { get; private set {} }
我需要帮助来完成/更正此代码块。提前谢谢你。
C# 9 引入了 init
关键字,它是 set
的变体,它允许我们这样做。 init
访问器实际上是 set
访问器的变体,只能在对象初始化期间调用
public class Book
{
public string Title { get; init };
}
更多关于 init
- https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-9.0/init
正如您当前定义的 Title
,可以从 Book
中的任何位置进行设置。也就是说,它不是只读的,只是私有的。
要使其成为只读的(类似于字段上的 readonly
关键字),您可以像这样简单地声明它:
public string Title { get; }
然后您可以使用您当前必须初始化它的构造函数代码:
public Book (string title)
{
this.Title = title;
}
如 运行 在 , C# 9 has introduced the concept of the init
modifier 中的注释。 init
的不同之处在于,虽然 属性 仍然只能设置一次,但它可以从构造函数外部初始化。例如,如果您想使用对象初始化器模式,这将很有用。
任何只读字段都可以在构造函数中设置,构造完成后该字段将变为不可变的。换句话说,你不需要做任何花哨的事情,构造函数会处理它。
用你的
做一个interface
public string Title { get; }
然后将此接口实现到您的 class/classes 中并执行一个简单的 field
(在构造函数之外,在您的方法之上):
public string Title => "xyz"; //(or string.Empty)
我有一本书 class,它的构造函数有一个标题参数:
public class Book
public Book (string title)
{
this.Title = title;
}
我需要通过调用 Book 构造函数来提供 Title 的 (read-only 属性) 值。我尝试了以下但不确定这是否正确,因为据我了解 read-only 属性 应该只有 getter.
public string Title { get; private set {} }
我需要帮助来完成/更正此代码块。提前谢谢你。
C# 9 引入了 init
关键字,它是 set
的变体,它允许我们这样做。 init
访问器实际上是 set
访问器的变体,只能在对象初始化期间调用
public class Book
{
public string Title { get; init };
}
更多关于 init
- https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-9.0/init
正如您当前定义的 Title
,可以从 Book
中的任何位置进行设置。也就是说,它不是只读的,只是私有的。
要使其成为只读的(类似于字段上的 readonly
关键字),您可以像这样简单地声明它:
public string Title { get; }
然后您可以使用您当前必须初始化它的构造函数代码:
public Book (string title)
{
this.Title = title;
}
如 运行 在 init
modifier 中的注释。 init
的不同之处在于,虽然 属性 仍然只能设置一次,但它可以从构造函数外部初始化。例如,如果您想使用对象初始化器模式,这将很有用。
任何只读字段都可以在构造函数中设置,构造完成后该字段将变为不可变的。换句话说,你不需要做任何花哨的事情,构造函数会处理它。
用你的
做一个interface
public string Title { get; }
然后将此接口实现到您的 class/classes 中并执行一个简单的 field
(在构造函数之外,在您的方法之上):
public string Title => "xyz"; //(or string.Empty)