决定何时只读一个属性的指南

时间:2017-02-05 20:37:29

标签: c# class oop constructor readonly

我要问的问题有点笼统,可能适用于所有OOP语言,但我在C#中进行编码。

我们如何决定将属性设置为只读?在我当前的程序中,我已将所有属性的所有属性设置为只读,并在初始化时通过构造函数传递值。所以我的所有课程都是这样的:

public class Point
{
   private double _x;
   private double _y;

   public double X
   {
      get { return _x; }
   }

   public double Y
   {
      get { return _y; }
   }


   public Point(double x, double y)
   {
      _x = x;
      _y = y;
   }
}

但现在我怀疑这是不是一个好主意!?因为现在我的类中的一些构造函数变得越来越大,而且参数太多了!我现在有点迷路了!有哪些指导方针可以决定以后允许设置哪些属性,而不需要通过构造函数传递!?

2 个答案:

答案 0 :(得分:1)

答案似乎很简单:当对象的关联数据必须是不可变的时,您需要将它们全部设为只读。当关联数据也由其他对象组成时,这很麻烦,因为可能无法设置整个属性,但无论如何都可以设置关联对象的属性。顺便说一下,至少你知道一个给定的相关物体不会在丛林中丢失。

另一方面,使用构造函数初始化对象并不直接与在这些构造函数上作为参数传递的值必然是不可变的这一事实相关联。他们可以在以后变异,为什么不呢。

也许您的问题还有其他一些内在问题:何时提供构造函数

基本上,当您想要以具体方式初始化对象时,或者在您的情况下,您希望初始化readonly字段和/或只读属性时,您提供构造函数。否则,除了默认构造函数之外,不提供任何特定构造函数:

public class Person
{
     public string Name { get; set; }
     public string LastName { get; set; }
}

// Default constructor with an object initializer
var person = new Person { Name = "Matías", LastName = "Fidemraizer" };

答案 1 :(得分:1)

从只读字段开始是个好主意。然后,如果需要,请释放此字段并删除" readonly"关键词。很容易放松这个规则,但很难添加" readonly"已经存在的领域。这可能会导致很多重构。

要缩短行数,请使用简洁的语法。

//no need to implement y property explicitly
public double Y { get; private set; }

在C#6的情况下,您甚至可以使用表达式主体

public double Y => 51123;