Xaq*_*ron 76 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)
Run Code Online (Sandbox Code Playgroud)
哪一个是最佳实践,为什么?
Eri*_*ert 86
他们各有利弊.
Out参数快速且便宜,但要求您传入变量,并依赖于变异.使用LINQ正确使用out参数几乎是不可能的.
元组会产生收集压力并且是非自我记录的."Item1"不是很具描述性.
如果自定义结构很大,则复制速度很慢,但是它们是自我文档的,如果它们很小则很有效.然而,为琐碎的用途定义一大堆自定义结构也很痛苦.
在所有其他条件相同的情况下,我倾向于自定义结构解决方案.更好的方法是创建一个只返回一个值的函数.为什么你首先返回两个值?
更新:请注意,编写本文六年后发布的C#7中的元组是值类型,因此不太可能产生收集压力.
And*_*per 19
我认为答案取决于函数正在做什么的语义,以及两个值之间的关系.
例如,TryParse
方法接受一个out
参数来接受解析后的值,并返回一个bool
指示解析是否成功的方法.这两个值并不真正属于一起,因此,从语义上讲,它更有意义,并且代码的意图更容易阅读,以使用out
参数.
但是,如果你的函数返回屏幕上某个对象的X/Y坐标,那么这两个值在语义上属于一起,最好使用a struct
.
我个人避免使用tuple
任何外部代码可见的东西,因为检索成员的笨拙语法.
dim*_*cas 16
除了之前的答案之外,C#7还带来了值类型元组,与之不同的System.Tuple
是它是一种引用类型,并且还提供了改进的语义.
您仍然可以将它们保留为未命名并使用以下.Item*
语法:
(string, string, int) getPerson()
{
return ("John", "Doe", 42);
}
var person = getPerson();
person.Item1; //John
person.Item2; //Doe
person.Item3; //42
Run Code Online (Sandbox Code Playgroud)
但是这个新功能的真正强大之处在于能够拥有命名元组.所以我们可以像这样重写上面的内容:
(string FirstName, string LastName, int Age) getPerson()
{
return ("John", "Doe", 42);
}
var person = getPerson();
person.FirstName; //John
person.LastName; //Doe
person.Age; //42
Run Code Online (Sandbox Code Playgroud)
还支持解构:
(string firstName, string lastName, int age) = getPerson()