c# - 返回两个值,元组 vs 'out' vs 'struct'

标签 c# struct tuples out value-type

考虑一个返回两个值的函数。我们可以这样写:

// Using out:
string MyFunction(string input, out int count)

// Using Tuple class:
Tuple<string, int> MyFunction(string input)

// Using struct:
MyStruct MyFunction(string input)

哪个是最佳实践,为什么?

最佳答案

它们各有优缺点。

Out 参数快速且便宜,但需要您传入一个变量,并依赖于变异。在 LINQ 中正确使用输出参数几乎是不可能的。

元组会产生收集压力1 并且不会 self 记录。 “Item1”描述性不强。

如果自定义结构较大,则复制起来可能会很慢,但如果它们很小,则可以 self 记录并且高效。然而,为琐碎的用途定义一大堆自定义结构也是一件痛苦的事情。

在所有其他条件相同的情况下,我倾向于自定义结构解决方案。更好的方法是制作一个只返回一个值的函数。为什么首先要返回两个值?

请注意,C# 7 中的元组(在编写此答案后六年发布)是值类型,因此不太可能产生收集压力。


1 每次您从堆中分配一个小对象时,都会对垃圾收集器施加“压力”。压力越大,催收越频繁。在某些应用程序中,控制产生的收集压力量很重要,因此在这些应用程序中不必要地分配几百万个元组可能是一件坏事。当然,就像所有性能问题一样,在了解问题的严重性之前,不要盲目地进行更改。

关于c# - 返回两个值,元组 vs 'out' vs 'struct',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6381918/

相关文章:

c# - Unity - 在没有 resolve() 的情况下解析

c# - 重构帮助c#

arrays - 如何在 Swift 中使用元组数组参数调用类 init?

python - 函数返回元组而不是字符串

c# - 为什么 Array.IndexOf 不像 List<T> 那样检查 IEquatable?

c# - SelectedValue 无效...我知道为什么,但不知道如何处理?

调用结构类型的函数并返回指针不运行

c++ - 如何将数据推送到 C++ 中的第二个位置

c - C 中的二维结构数组 - 如何声明和使用

python - 打印格式化的元组值