结构以结构化的方式从函数返回Data有意义吗?(结构什么时候合适?)



简介

到目前为止,我正试图把我的头脑包裹在结构上。我在主题";何时使用结构";。它们中的大多数都是模糊的,比如建议一般不要使用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(它是一个类(是块实例的引用还是找到的块的副本。

它仍然是一个引用。引用类型不会仅仅因为是结构的属性就不再是引用类型。引用的将与结构一起携带,就像整数一样。

最新更新