我们应该使用struct for data和class for behavior吗?

时间:2014-04-17 11:01:48

标签: c#

在文章Active Record vs Objects中鲍勃·马丁指出:

  
      
  • 对象隐藏数据并公开行为
  •   
  • 数据结构公开数据且没有行为
  •   
然后他继续说

  

在C ++和C#等语言中,struct关键字用于描述a   公共领域的数据结构。

对我而言,他似乎正在使用数据结构作为struct的同义词,并且说我们应该使用struct关键字作为数据,使用class关键字来实现具有行为的对象。这听起来很奇怪,因为mutable structs are evil和大多数系统中的数据需要改变(这意味着大多数数据都是邪恶的)。

有人能指出我推理中的缺陷吗?

3 个答案:

答案 0 :(得分:1)

我认为这不是鲍勃·马丁试图说的。我明白他在说:

  1. 如果您需要行为以及数据,请使用课程,而实际数据可能(或可能不)感兴趣。
  2. 如果您不想对数据执行任何操作,但仍希望对单个数据值进行分组(全部公开),请使用结构
  3. 示例1)车辆的经典OO示例 - 它具有功能(数据)和操作(如驱动,停止,换挡等)

    2)的例子一个例子是地址。它是不可变的,没有立即执行的操作。或者在2D / 3D空间中占据一个点 - 它有三个坐标,就是它。

答案 1 :(得分:1)

鲍勃对活动记录提出了一个很好的观点,但他决定混合使用struct 关键字(而不是概念)有点令人困惑......

首先,重要的是要理解struct在C#和C ++中意味着完全不同的东西。

以下是对差异的粗略解释:

在C#中,关键字struct用于定义自定义值类型。关于这种类型的唯一是它总是将 by-value 传递给方法(而不是通过引用传递的引用类型。换句话说。 ,当您将值类型传递给方法时 - 实际传递了它的副本,并且对方法内的副本的任何更改都不会在其外部显示。

在C ++中,类和结构几乎相同。结构本质上是一个类,默认情况下所有成员都是公共的。

因此,当你谈论可变结构的邪恶属性时,请记住,这只涉及C#并且与Bob所谈论的内容无关。主要问题是在使用它们时会破坏语义和非常奇怪的错误,但这是对另一个问题的讨论。

答案 2 :(得分:0)

我不认为他提到数据结构是否可变。您总是可以通过构造函数实例化成员来使您的结构不可变。

public struct Foo
{
    private int _bar;

    public Foo(int bar)
    {
       _bar = bar;
    }

    public int Bar { get { return _bar; } }
}

我认为使用结构作为分组数据的方式特别适用于需要值类型语义的小型短期对象。