我有这样的方法:
private double GetHeight()
{
return 2;
}
Run Code Online (Sandbox Code Playgroud)
但是我希望能够返回两个不同的数字,例如2和3。在C#中有什么方法可以实现?
AAA*_*ddd 31
是ValueTuple/ 命名为元组(在C#7.1中可用)。优点是它最简洁,不可变且易于构造。
ValueTuple结构具有名为Item1,Item2,Item3等的字段,类似于现有Tuple类型中定义的属性。
但是,在初始化元组时,可以使用新的语言功能,以便为每个字段赋予更好的名称。这样做会创建一个命名的元组。命名元组仍然具有名为Item1,Item2,Item3等的元素。但是它们也具有您已命名的任何元素的同义词。通过为每个元素指定名称来创建命名元组。
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}");
Run Code Online (Sandbox Code Playgroud)
经典元组
.NET Framework已经具有通用的Tuple类。但是,这些类有两个主要限制。首先,Tuple类将其属性命名为Item1,Item2,依此类推。这些名称不包含语义信息。使用这些元组类型不能实现传达每个属性的含义。新的语言功能使您可以为元组中的元素声明和使用语义上有意义的名称。
public Tuple<int, int> ViaClassicTuple()
{
return new Tuple<int, int>(1,2);
}
...
var tuple = ViaClassicTuple();
Console.WriteLine($"{tuple.Item1}, {tuple.Item2}");
Run Code Online (Sandbox Code Playgroud)
经典结构
struct类型是一种值类型,通常用于封装少量相关变量,例如矩形的坐标或清单中项目的特征。
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}");
Run Code Online (Sandbox Code Playgroud)
只读结构
结构定义上的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}");
Run Code Online (Sandbox Code Playgroud)
简单班
定义为类的类型是引用类型。在运行时,当您声明引用类型的变量时,变量将包含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}");
Run Code Online (Sandbox Code Playgroud)
输出参数
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}");
Run Code Online (Sandbox Code Playgroud)
超值元组
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}");
Run Code Online (Sandbox Code Playgroud)
Mar*_*ell 21
多种方式:
out 参数:
private double GetHeight(out int anotherValue)
{
anotherValue = 42;
return 2;
}
Run Code Online (Sandbox Code Playgroud)价值元组:
private (double height, int anotherValue) GetHeight()
{
return (42, 2);
}
Run Code Online (Sandbox Code Playgroud)
(警告:如果在.NET Standard库中使用值元组,则存在已知问题,因为从.NET Standard到.NET Framework的程序集绑定有点...)
自定义返回类型:
private Something GetHeight()
{
return new Something(42, 2);
}
Run Code Online (Sandbox Code Playgroud)
(为避免分配,您可能希望在这种情况下将其定义Something为readonly struct)