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专门寻找属性.
| 归档时间: |
|
| 查看次数: |
5397 次 |
| 最近记录: |