将类传递给函数或带引用的结构之间的功能区别是什么?

-1 c# struct class

所以,我正在研究Structs vs Classes.到目前为止,我知道以下内容:

当传递给另一个函数时,类可以直接修改数据.类比Struct使用更多内存.

结构可以传递给函数,但数据在函数内克隆,而不是修改原始数据.

因此,如果我使用类,我可以将数据传递给函数并直接从新函数修改类中的数据.

如果我使用结构,我可以将数据传递给一个函数,该函数生成要在函数中使用的数据的副本,但不会影响原始数据.

但是,如果我将Struct传递给具有Ref关键字的函数,则它会修改Struct中的原始数据.

考虑到这一点,使用Struct与Ref关键字或仅使用类之间的主要区别是什么?它纯粹与记忆有关吗?我一直在使用Structs,但我需要修改原始数据 - 如果最好使用Ref关键字传递Struct,或者将我的所有Structs更改为Classes,则尝试解决.

Eri*_*ert 10

这是一个非常令人困惑的问题.以下是一些可以帮助您做出决定的指南:

  • 您的默认位置应该是在结构上使用类.
  • 特别是,如果要改变类型中的数据,您几乎总是想要一个类.可变结构在C#中是一种不好的做法.有一些罕见的情况,他们是合理的; 那些罕见的情况很少见.
  • 特别是,如果类型中有很多字段 - 比如说,有几个双精度浮点数,或者少数几个引用 - 那么你几乎总是想要一个类.大型结构可能效率非常低,因为默认情况下它们是按值复制而不是通过引用复制.在一些罕见的情况下,大型结构是合理的.那些罕见的情况很少见.
  • 特别是,如果你的类型在逻辑上不是一个值 - 比如数字,坐标或日期等等 - 那么它应该是一个类,而不是一个结构.
  • 特别是,如果您的类型参与类型的层次结构,那么它必须是类,而不是结构.

使用Struct与Ref关键字或仅使用类之间的主要区别是什么?

这是查看结构和类之间差异的错误方法.如果您通过ref传递结构以修改其字段,那么您可能做错了. 字段应该是私有的,结构应该是不可变的.

使用任何 ref参数和通过引用传递对象之间的主要区别在于前者是变量别名,后者是对象的引用.我很遗憾这ref是C#设计团队选择该功能的语法,因为它令人困惑.你不应该认为它是传递参考.您应该将其视为变量的别名.在幕后它传递一个指向变量的托管指针是一个实现细节.别名行为是语义含义.