Ben*_*jol 34 c# field properties immutability
我已经在许多地方读过,公开公开字段并不是一个好主意,因为如果你以后想要更改属性,则必须重新编译使用你的类的所有代码.
但是,在不可变类的情况下,我不明白为什么你需要更改为属性 - 毕竟你不会在'set'中添加逻辑.
对此有任何想法,我错过了什么吗?
差异的例子,对于那些比文本更容易阅读代码的人:)
//Immutable Tuple using public readonly fields
public class Tuple<T1,T2>
{
public readonly T1 Item1;
public readonly T2 Item2;
public Tuple(T1 item1, T2 item2)
{
Item1 = item1;
Item2 = item2;
}
}
//Immutable Tuple using public properties and private readonly fields
public class Tuple<T1,T2>
{
private readonly T1 _Item1;
private readonly T2 _Item2;
public Tuple(T1 item1, T2 item2)
{
_Item1 = item1;
_Item2 = item2;
}
public T1 Item1 { get { return _Item1; } }
public T2 Item2 { get { return _Item2; } }
}
Run Code Online (Sandbox Code Playgroud)
当然,你可以使用auto-properties(public T1 Item1 { get; private set; }),但这只会让你'同意不变"而不是'保证不变性'......
Vla*_*den 12
C#6.0现在支持自动属性初始值设定项.
auto-property初始化程序允许直接在其声明中分配属性.对于只读属性,它负责确保财产不可变所需的所有仪式.
您可以在构造函数中初始化只读属性或使用自动初始化程序
public class Customer
{
public Customer3(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
public string FirstName { get; }
public string LastName { get; }
public string Company { get; } = "Microsoft";
}
var customer = new Customer("Bill", "Gates");
Run Code Online (Sandbox Code Playgroud)
您可以在此处阅读有关自动属性初始化程序的更多信息
Mar*_*ers 11
这是一个明显的遗漏属性,你不能写如下:
public T2 Item2 { get; readonly set; }
Run Code Online (Sandbox Code Playgroud)
我甚至不确定readonly这个词最好用"只能在构造函数中设置",但这就是我们所坚持的.
这实际上是许多人要求的功能,所以我们希望很快就会在假设的新版C#中引入它.
看到这个相关的问题.
| 归档时间: |
|
| 查看次数: |
4779 次 |
| 最近记录: |