我有一个这样的方法:
private double GetHeight()
{
return 2;
}
但是我希望能够返回两个不同的数字,例如2和3。在C#中有什么方法可以实现?
答案 0 :(得分:31)
是ValueTuple
/ 命名为元组(在C#7.1中可用)。优点是它最简洁,不可变且易于构建。
ValueTuple结构具有名为Item1,Item2,Item3等的字段, 与现有元组类型中定义的属性相似。
但是,在初始化元组时,可以使用新语言 可以给每个字段起更好名字的功能。这样做会创建一个 命名为元组。命名元组仍然具有名为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}");
经典元组
.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}");
经典结构
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}");
只读结构
结构定义上的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}");
简单类
Classes (C# Programming Guide)
定义为类的类型是引用类型。在运行时, 当您声明引用类型的变量时,该变量包含 该值一直为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 parameter modifier (C# Reference)
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}");
答案 1 :(得分:21)
多种方式:
out
参数:
private double GetHeight(out int anotherValue)
{
anotherValue = 42;
return 2;
}
值元组:
private (double height, int anotherValue) GetHeight()
{
return (42, 2);
}
(警告:如果在.NET Standard库中使用值元组,则存在已知问题,因为从.NET Standard到.NET Framework的程序集绑定有点...)
自定义返回类型:
private Something GetHeight()
{
return new Something(42, 2);
}
(为避免分配,在这种情况下,您可能希望将Something
定义为readonly struct
)
答案 2 :(得分:3)
是的,您可以使用元组:
class Program
{
static void Main(string[] args)
{
Tuple<int, int> height = GetHeight();
Console.WriteLine(height.Item1 + " - " + height.Item2);
Console.ReadLine();
}
private static Tuple<int, int> GetHeight()
{
return new Tuple<int, int>(2, 3);
}
}
输出:
2 - 3
答案 3 :(得分:2)
还可以使用out
参数:
static void Main(string[] args)
{
int i, j;
GetHeight(out i, out j);
}
public static void GetHeight(out int i1, out int i2)
{
i1 = 1;
i2 = 2;
}
答案 4 :(得分:0)
创建一个int数组。另一种方法是创建类。