Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该使用Struct吗?_C#_Struct - Fatal编程技术网

C# 我应该使用Struct吗?

C# 我应该使用Struct吗?,c#,struct,C#,Struct,可能重复: 大家好,我正在创建一个应用程序,它在C#中有一个类,纯粹用于保存变量,它除了设置和获取这些变量之外,什么都不做。为了提高效率和良好的编码实践,我想知道是否应该将这个类转换为结构,以便正确使用它。我以前从未使用过structs,但一直在研究它们,但是我在让它工作时遇到了一些困难。任何建议都将不胜感激 谢谢, Stuart如果值集合对值类型进行建模(即,没有自己标识的对象,并且具有相同值的两个实例被视为相同的对象),则使用结构 否则,请使用类。使用结构代替类取决于您工作的场景。虽然可以

可能重复:

大家好,我正在创建一个应用程序,它在C#中有一个类,纯粹用于保存变量,它除了设置和获取这些变量之外,什么都不做。为了提高效率和良好的编码实践,我想知道是否应该将这个类转换为结构,以便正确使用它。我以前从未使用过structs,但一直在研究它们,但是我在让它工作时遇到了一些困难。任何建议都将不胜感激

谢谢,
Stuart

如果值集合对值类型进行建模(即,没有自己标识的对象,并且具有相同值的两个实例被视为相同的对象),则使用结构


否则,请使用类。

使用结构代替类取决于您工作的场景。虽然可以使用结构代替类,但结构缺乏实现访问标识符(例如私有、公共、受保护)的能力。如果您使用类只是为了保存变量,那么也可以使用结构,但是如果您的类包含一些私有的、受保护的或公共的方法或变量/属性,则不能使用结构


希望这有帮助

结构或类的决策应该基于“我想要引用类型语义还是值类型语义?”

使用结构作为参数时,将复制完整的内容。对于类,仅复制引用。因此,“大结构”可能会有性能损失

在以下情况下使用结构:

  • 逻辑上表示单个值
  • 实例大小小于16 字节
  • 创建后将不会更改
  • 将不会强制转换为引用类型

参考MCTS 70-536

在大多数情况下,最好使用等级。结构是按值传递的,没有继承,等等。您提到效率,这个类可能是性能瓶颈吗


但是,如果您创建了一个结构,请确保它

我不确定是否使用结构与良好的编码实践有关,但在某些情况下使用结构有一些性能优势。例如,MSDN建议结构比类更有效地处理小于16字节的类型

理解为什么结构可能是更好的选择以及运行时如何管理它们的内存很重要。必须以最小开销快速执行的库将考虑使用结构(如XNA框架中的许多数学类型)。还有一些设计问题,比如结构总是有一个默认构造函数;如果您想确保您的类型只能用特定的值构造,那么结构不是最佳选择

长话短说,除非你有一个非常具体的理由在类之上使用结构,只要坚持使用类就行了


如果你想继续使用结构,你会遇到什么问题?

这实际上取决于你想要实现什么。事实上,你目前只有一个能手和二传手并不意味着什么。例如,类型可能正在对从文件读取的应用程序设置进行建模。在某些时候,您可能希望添加IsValid()或Normalize()方法。因此,在本例中,您更愿意使用类,而不是结构

当类型的标识由字段的值决定时,应使用结构。NET框架中的一个很好的例子是Point,它有X和Y。 第二件事是结构应该便宜地传递到函数和从函数传递:

public bool IsInRange(Point point)
{
    // ...
}

请记住,点将在此处逐字段复制,所以这应该是相当便宜的。

struct可以有私有方法。然而,“受保护”的方法毫无意义,因为不能从结构派生。有时需要大于16字节的结构。“如果你不打算在创建实例后重新分配它。”你可能的意思是:“你想要一个(应该)不可变的类型”也许你不喜欢这句话,我也不喜欢,我认为现在更好,MS推荐的结构。这是完全重复的。不要提供更多的答案。这是毫无意义的。谢谢,从这一点上我将继续使用一个类。