c# - c# - 有没有办法从方法中返回多个整数?

  显示原文与译文双语对照的内容

我有一个这样的方法:


private double GetHeight()


{


 return 2;


}



但我希望能够返回两个不同的数字例如 2和 3 。 我可以在 C# 中做到这一点?

时间:

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}");



经典元组

C# 元组类型

.NET 框架已经具有泛型元组类。 然而,这些类有两个主要的。 例如元组类名为 Item1.Item2等等。 这些名字没有语义信息。 使用这些元组类型不允许传达每个属性的含义。 新的语言特性使你能够声明和使用元组中的元素语义有意义的名称。


public Tuple<int, int> ViaClassicTuple()


{


 return new Tuple<int, int>(1,2);


}



...



var tuple = ViaClassicTuple();


Console.WriteLine($"{tuple.Item1}, {tuple.Item2}");



经典结构

结构( C# 引用)

结构类型是一种值类型,通常用于封装小组相关变量,例如 rectangle的坐标或者库存的特性。


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# 引用)

结构定义上的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# 编程指南)

定义为类的类型是引用类型。 在运行时声明引用类型的变量,直到通过使用新操作符显式创建类的实例。


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}");



参数

输出参数修饰符( C# 引用)

out关键字会导致参数通过引用来传递。 它使形参成为参数的别名,它必须是变量。 换句话说,对参数的任何操作都是在参数上进行的。 它与is关键字一样,除非is要求在传递该变量之前初始化该变量。 除了不允许调用方法修改参数值之外,它也类似于in关键字。 使用输出参数时,方法定义和调用方法都必须显式使用输出关键字。


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}");



...