4

正如它在 MSDN 文档和其他地方所说的那样,结构没有身份,因此应该代表一个永远不会改变的“永恒”值,例如电话号码(电话号码不会改变,但你会得到一个新的)。

这对我的编码决策有何影响?

基于这些知识,我认为没有同一性意味着如果两个结构具有相同的数据,则无法区分它们,所以从概念上讲,它们是相同的东西。因此,代码库中用于数字(例如(7))的两个结构总是相同的。因此,对于类,具有相同数据的两个对象(例如,只有名称的人员对象)可以是不同的人,但对于结构,这种区别不存在。因此,可能代表一项技能(例如钓鱼)的结构将始终是相同的(没有身份可以区分它)。

希望这是有道理的。

谢谢

4

3 回答 3

4

结构与类共享大部分相同的语法,但根据MSDN

struct 类型适合表示轻量级对象

它们之间的关键区别在于Classes生成引用类型对象,而Structs生成值类型对象,这意味着以下操作:

Point A = new Point();
Point B = A;

如果 Point 是 Class,则 A 和 B 访问相同的内存对象,如果 Point 是 Struct,则创建 A 的新副本并将其分配给 B。

在 Point 是 Struct 的情况下,以下关系成立:

Object.Equals(A,B) == true
Object.ReferenceEquals(A,B) == false

因此,您可以将它们区分开来,并且这两个结构不是一回事,因为它们中的每一个都是内存中的一个对象。

这个 SO question讨论了何时使用 Structs 是个好主意。

于 2012-05-19T13:41:06.093 回答
1

结构是一个值。类是一个对象。这与现实生活中的 42 永远等于 42 非常相似,但您可以有两个名为 John Smith 的人。

您在问题中所说的是对值类型与引用类型概念的一个很好的概述。

至于它应该如何影响您的编码,请始终编码以使值等于相同的值,例如 42 必须始终等于 42。在某些情况下,应该按值而不是标识(例如字符串)来比较引用类型。但在大多数情况下,引用类型按标识进行比较。

如果你可以测量或计算它,它就属于一个值类型。否则,使用引用类型。

于 2012-05-19T13:54:34.473 回答
0

“结构”或“记录”概念是在“类”概念之前创建的。有时,可以互换。

何时使用结构的变量、字段或实例:

(1) 当只有数据成员需要它时,没有方法。或者很少有很少使用的方法,例如构造函数。

例子:

struct CoordinateStruct
{
  int X;
  int Y;
}

(2) 当需要大量元素时,由于对象使用额外的内存,有时是不可见的,将方法迁移到容器元素,例如另一个对象、类似模块(命名空间)的对象或单例对象(享元设计图案)。

前:

class PointClass
{
  int X;
  int Y;
  // its also an object / class
  Color Color;

  public void assign(int NewX, int NewY, Color NewColor) { ... }
  public void move(int addX, int addNewY) { ... }
}

// multiple element container
class CADAppClass
{
  List<Point> Points;

 // ...
}

// Not enough memory Exception !!!

后:

struct PointStruct
{
  int X;
  int Y;
  // its a low memory integer
  int Color;      
}

// multiple element container
class CADAppClass
{
  List<Point> Points;

  public void assignPoint
    (ref PointStruct Point, int NewX, int NewY, Color NewColor) { ... }
  public void movePoint
    (ref PointStruct Point, int addX, int addNewY) { ... }

 // ...
}

(3) 当你需要封装数据元素时,即使是少量的元素,在一个变量中,即使有方法、操作符、事件或“消息”。封装,可能以序列化为例(从 DLL、DCOM、JSON、纯数据文件加载)。

前:

class CustomerClass
{
  String FirstName;
  String LastName;

  public void Store(Stream Destination) { ... }
  public void Load(Stream Source) { ... }

  public void CopyTo(CustomerClass Destination) { ... }
  public void CopyFrom(CustomerClass Source) { ... }
}

后:

struct CustomerStruct
{
  char[100] FirstName;
  char[100] LastName;
}

// one to one, nested, relationship, seems redudant,
// but required
Class CustomerClass
{
  CustomerStruct Data;

  public void Store(Stream Destination) { ... }
  public void Load(Stream Source) { ... }

  public void CopyTo(CustomerStruct Destination) { ... }
  public void CopyFrom(CustomerStruct Source) { ... }
}

我在面向对象和类的编程语言中使用了这个枚举,而不是结构,但是,它不像 Java 或 C# 那样将枚举视为对象(例如:面向对象的 PHP 和对象 Pascal)。

(4) 前面的案例或场景的混合,没有考虑。

干杯。

于 2012-05-19T18:39:22.313 回答