C#readonly vs Get

rob*_*jam 17 c# properties

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)

提前谢谢了!

Rob*_*Rob 22

你从根本上误解了这两个定义的含义.只露出吸气说什么约值是否为只读.

虽然在这个简单的例子中:

public class GetOnly
{
    public string MyProp { get; }
}
Run Code Online (Sandbox Code Playgroud)

我们可以说,MyProp永远不会改变它的价值,我们不能总是说,一个只有消气属性不会有它的价值变化.这种情况的一个例子是我们无法看到GetOnly公共定义的实现,只知道公共定义 - 例如,如果您正在使用闭源第三方库.

一个更清楚的例子是:

public interface ISomething
{
    string MyProp { get; }
}
Run Code Online (Sandbox Code Playgroud)

此接口并未说明MyProp是只读的.它说不能改变财产.它没有说明财产的行为.更糟糕的是,它只表示在显式转换时不能更改属性ISomething.

这是完全可以实现像这样(即使接口只公开吸气)的界面:

public class GetOnly : ISomething
{
    public string MyProp { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

readonly是一个修饰符,它明确地强制了这个值不会改变的事实,除了声明或构造函数(禁止像反射这样的变通方法).

但是,readonly无法处理属性,因为属性只是get/set 方法的语法糖.此外,接口只定义方法,因此您无法定义字段(以及扩展名,只读字段).

所以回答你的答案:是的,它们是世界分开的,并且表面上只是相似的.


Hen*_*man 14

乍一看,属性和字段在功能上是等价的,对于正常使用情况,存储数据并将其传递到那里使用它们没有太大区别.

但您似乎已经发现了一个重要问题:只有属性才能成为界面的一部分.

有没有办法使界面适用于两者?

没有.

此外,许多依赖于反射(EF,序列化)的API专门寻找属性.