C#,不变性和公共只读字段

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#中引入它.

看到这个相关的问题.

  • 嗯,一个"C#的假设新版本"我想我知道你一直在阅读谁的博客;) (2认同)
  • @Eric Lippert,现在你只是在取笑我们.我希望很快就有关于困难的帖子:) (2认同)