Structs and Classes / value type vs refrence type
所以我已经花了好几个星期的时间来思考这个问题了。我理解结构是值类型,类是引用类型。我感到困惑的是这两者在行为上的差异。
例如:如果我有一袋土豆,每个土豆的大小、形状和重量都不一样…该包将是"类/引用类型"土豆将是一个"结构/值类型"
我的土豆可以是一个类,还是必须是一个结构,因为其中包含的值不同?
基本上,这个问题的答案将为我澄清一切。
谢谢您!
- 我非常怀疑"我的土豆能成为一门课吗?"清除任何东西。
- 请记住基于语言的值/引用类型和逻辑值/引用类型之间的区别。class在逻辑上可以是一个值类型,并且在内部维护诸如相等性/不可变性等引用概念。
- 考虑结构的种类:int、float、decimal、Color;以及类的种类:Form、Page、StackPanel、Socket。
- 这篇文章很好地解释了何时使用struct:stackoverflow.com/questions/521298/when-to-use-struct-in-c
- 主要区别在于"复制语义":a = b;的具体情况取决于rev或value类型。
- 可以。出于某种原因,我假设…如果土豆是"班",那如果我改变一个土豆的重量,它就会反映在所有的土豆上…
- @用户2455645您考虑的是静态与实例字段/方法。与结构和类无关。
- 可以。是啊。我想在过去的几周里,我的大脑在某个地方冻结了…这一切现在都有意义了。
- 你拿土豆作类比对你一点帮助都没有
- 某些集合(包)中包含的元素(土豆)不必是值类型(结构)。它们可以是值类型或引用类型(类)。是什么让你认为它们必须是结构?
如果你所追踪的关于土豆的所有信息都是它们的大小、重量和形状,那么回答这个问题:"如果两个土豆的大小、重量和形状相同,那么它们应该被认为是相同的吗?".这个问题的答案取决于你的问题域。
如果它们应该是"相同的",那么您将按值比较它们,并且(通常)可以/应该是值类型。如果它们不应该被视为"相同的",那么它们应该是引用类型。
- 我同意,尽管我认为同一性的概念与某个事物是引用类型还是值类型是正交的。我引用了string类的例子,它是一个引用类型,但它的行为类似于一个值类型。但你说的是"一般",所以我同意。:)
- 是的,我不会依赖于讨论比较,因为您可以非常高兴地按值比较引用类型…
- "标识"与值类型冲突。没有标识(字符串)与引用类型不冲突。
- @是的,这使得问题更容易回答。如果某物具有"标识",则它不能是值类型。
如果你想把一个Potato从BagOfPotatoes中取出,在其他类之间传递,如果这些类要修改potato,那么它应该是一个引用类型。
例如,将BagOfPotatoes传递给Chef.SortPotatoes(List potatoes),然后继续到Chef.SkinPotatoes(Potato potato),厨师在那里剥土豆皮,放置Potato.IsSkinned。
它取决于你是否需要将一个土豆称为一个单独的土豆,在那里你把它扔掉,并在它的末尾(通过引用)谈论同一个土豆泥。或者你是否只想谈论土豆的类型(按价值)。
任何是struct的东西都可以是class。这两个行为有细微的不同,但你的"土豆"肯定是一个class,而不是一个struct。
- 我不同意,土豆是固有的价值类型。我想你会对西红柿产生混淆,西红柿绝对是参考类型。