Yes ValueTuple https://learn.microsoft.com/en-us/dotnet/csharp/tuples?view=netframework-4.7.2 / 命名元组(在 C# 7.0 中可用)。优点是最简洁、不可变并且易于构建。
ValueTuple 结构体具有名为 Item1、Item2、Item3 等的字段,
类似于现有元组类型中定义的属性。
然而,当你初始化一个元组时,你可以使用新的语言
为每个字段提供更好的名称的功能。这样做会创建一个
命名元组。命名元组仍然具有名为 Item1、Item2 的元素,
第3项等等。但它们也有这些元素的同义词
你所命名的。您可以通过指定名称来创建命名元组
对于每个元素。
private (double first, double second) GetHeight()
{
return (1,2);
}
...
var result = ViaNamedValueTuple();
Console.WriteLine($"{result.first}, {result.second}");
var (first, second) = ViaNamedValueTuple();
Console.WriteLine($"{first}, {second}");
经典元组
C# 元组类型 https://learn.microsoft.com/en-us/dotnet/csharp/tuples
.NET Framework 已经有了通用的 Tuple 类。这些课程,
然而,有两个主要限制。其一,名为的元组类
它们的属性 Item1、Item2 等等。这些名字没有
语义信息。使用这些元组类型不会启用
传达每个属性的含义。新语言
功能使您能够声明和使用语义上有意义的名称
对于元组中的元素。
public Tuple<int, int> ViaClassicTuple()
{
return new Tuple<int, int>(1,2);
}
...
var tuple = ViaClassicTuple();
Console.WriteLine($"{tuple.Item1}, {tuple.Item2}");
经典结构
结构体(C# 参考) https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/struct
结构类型是一种值类型,通常用于封装
一小组相关变量,例如a的坐标
矩形或库存中物品的特征。
public struct ClassicStruct
{
public int First { get; set; }
public int Second { get; set; }
public ClassicStruct(int first, int second)
{
First = first;
Second = second;
}
}
...
public ClassicStruct ViaClassicStruct()
{
return new ClassicStruct(1, 2);
}
...
var classicStruct = ViaClassicStruct();
Console.WriteLine($"{classicStruct.First}, {classicStruct.Second}");
只读结构体
只读(C# 参考) https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/readonly#readonly-struct-example
结构体定义上的 readonly 修饰符声明该结构体
是不可变的。结构体的每个实例字段都必须被标记
只读,如下例所示:
public readonly struct ReadonlyStruct
{
public int First { get; }
public int Second { get; }
public ReadonlyStruct(int first, int second)
{
First = first;
Second = second;
}
}
...
public ReadonlyStruct ViaReadonlyStruct()
{
return new ReadonlyStruct(1, 2);
}
...
var readonlyStruct = ViaReadonlyStruct();
Console.WriteLine($"{readonlyStruct.First}, {readonlyStruct.Second}");
简单类
类(C# 编程指南) https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/classes
定义为类的类型是引用类型。在运行时,
当您声明引用类型的变量时,该变量包含
值 null 直到您通过以下方式显式创建该类的实例
使用 new 运算符,或为其分配一个兼容类型的对象
可能是在其他地方创建的
public class SomeClass
{
public int First { get; set; }
public int Second { get; set; }
public SomeClass(int first, int second)
{
First = first;
Second = second;
}
}
...
public SomeClass ViaSomeClass()
{
return new SomeClass(1, 2);
}
...
var someClass = ViaSomeClass();
Console.WriteLine($"{someClass.First}, {someClass.Second}");
输出参数
out 参数修饰符(C# 参考) https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/out-parameter-modifier
out 关键字导致参数通过引用传递。它使
形式参数 参数的别名,必须是
多变的。换句话说,对参数的任何操作都是在
的论点。它类似于 ref 关键字,只不过 ref 需要
在传递变量之前对其进行初始化。它也像
in 关键字,但 in 不允许被调用的方法
修改参数值。要使用 out 参数,这两种方法
定义和调用方法必须显式使用out关键字。
public bool ViaOutParams(out int first, out int second)
{
first = 1;
second = 2;
return someCondition;
}
...
if(ViaOutParams(out var firstInt, out var secondInt))
Console.WriteLine($"{firstInt}, {secondInt}");
输出值元组
public bool ViaOutTuple(out (int first,int second) output)
{
output = (1, 2);
return someCondition;
}
...
if (ViaOutTuple(out var output))
Console.WriteLine($"{output.first}, {output.second}");