我一直在努力创建一个课程,突然想到了两个代码之间有什么区别:
public readonly string ProductLocation;
Run Code Online (Sandbox Code Playgroud)
和
public string ProductLocation
{
get;
private set;
}
Run Code Online (Sandbox Code Playgroud)
你能告诉我什么时候更好地使用以下内容吗?谢谢.
readonly修饰符和get-only属性之间是否存在任何差异?
例:
public class GetOnly
{
public string MyProp { get; }
}
public class ReadOnly
{
public readonly string MyProp;
}
Run Code Online (Sandbox Code Playgroud)
奖励:有没有办法使界面适用于两者?(与泛型一起使用)
public interface ISomething
{
public string MyProp { get; }
}
public class GetOnly : ISomething
{
public string MyProp { get; }
}
public class ReadOnly : ISomething // Cannot implement
{
public readonly string MyProp;
}
Run Code Online (Sandbox Code Playgroud)
提前谢谢了!
有时我看到用readonly成员定义的类是这样的:
class Foo
{
private readonly string bar;
public Foo(string bar)
{
this.bar = bar;
}
public string Bar => bar;
}
Run Code Online (Sandbox Code Playgroud)
有时我看到用readonly成员定义的类是这样的:
class Foo
{
public Foo(string bar)
{
Bar = bar;
}
public string Bar { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)
第二个例子看起来更具可读性/简洁性,但我想知道是否有任何合理的理由明确定义readonly支持字段(根据第一个例子)?
有关这两个例子的深入分析,请在CLR中理想地涵盖真正发生的事情.
我正在浏览即将发布的C# 9 新功能。Init-Only属性正在被引入。
今天的一大限制是属性必须是可变的,对象初始值设定项才能工作:它们通过首先调用对象的构造函数(在本例中为默认的无参数构造函数)然后分配给属性设置器来起作用。
仅初始化属性解决了这个问题!他们引入了一个 init 访问器,它是 set 访问器的变体,只能在对象初始化期间调用:
public class Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
}
Run Code Online (Sandbox Code Playgroud)
有了这个声明,上面的客户端代码仍然是合法的,但是对 FirstName 和 LastName 属性的任何后续分配都是错误的。这条线是什么意思?如果 ReadOnly 也做同样的事情,那么 Init-Only 属性的用途是什么。