简介
到目前为止,我正试图把我的头脑包裹在结构上。我在主题";何时使用结构";。它们中的大多数都是模糊的,比如建议一般不要使用structs,只有少数例外。有关于何时使用structs的解释(几个例子(:
- 不可变数据
- 与引用语义相对的值语义
- 在将结构化数据传递到C/C或从C/C传递结构化数据的代码中需要它们++
- 除非需要,否则不要使用structs
但是没有关于这种情况何时实际发生的示例代码是有意义的。
可能最为人所知的问题/答案之一是:在C#中,我什么时候应该使用结构而不是类?
项目结构
class StorageBlock<Type>
:
/// this is a storage block. It is not a struct because the data is not immutable and it
/// should be passed by reference
public class StorageBlock<Type>
{
Type[] Data;
/* other stuff */
}
方法BlockSearcher()
:
public (StorageBlock<Type> FoundBlock, int FoundIndex) SearchBlock(Type searchForThisElement)
{
StorageBlock<Type> found = Blocks.Find(searchForThisElement);
int index = Array.IndexOf(found.Data, searchForThisElement);
return (found,index);
}
调用方示例:
(StorageBlock<Type> FoundBlock, int FoundIndex) searchResult = SearchBlock(searchElement);
/* process SearchResult(s) */
问题
我想知道将(StorageBlock<Type> FoundBlock, int FoundIndex) searchResult
转换为结构是否有意义。搜索结果应该是不可变的。它只是用来提供特定索引操作的返回。
像这样的东西:
struct BlockIndex
{
StorageBlock<Type> Block;
int Index;
}
因为结构是DataType,而不是引用类型,所以我还想知道BlockIndex.Block
(它是一个类(是块实例的引用还是找到的块的副本。
您似乎在将结构与元组(编译为ValueTuple
,而不是Tuple
(进行比较,而不是将结构与类进行比较(这是更常见的问题,也是原始建议的上下文(。用这种语法定义元组是C#中最新的构造,所以我不知道是否有明确定义结构或使用元组的最佳实践。
在幕后,元组是作为ValueTuple
结构实现的,因此通过定义结构应该可以将性能差异最小化(如果有的话(。它更多的是为了编码的方便而不是性能。
作为一个实用主义者,我想说继续使用元组,直到你有一个可衡量的问题。
搜索结果应该是不可变的
这是我看到的唯一会让我考虑定义readonly
结构的东西,因为默认情况下ValueTuple
不是不可变的。
因为结构是[值类型],而不是引用类型,我还想知道
BlockIndex.Block
(它是一个类(是块实例的引用还是找到的块的副本。
它仍然是一个引用。引用类型不会仅仅因为是结构的属性就不再是引用类型。引用的值将与结构一起携带,就像整数一样。