有没有办法可以从一个方法返回多个整数?

时间:2019-04-08 08:48:27

标签: c#

我有一个这样的方法:

private double GetHeight()
{
    return 2;
}

但是我希望能够返回两个不同的数字,例如2和3。在C#中有什么方法可以实现?

5 个答案:

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

经典元组

C# tuple type

  

.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 (C# Reference)

  

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 (C# Reference)

  

结构定义上的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)

多种方式:

  1. out参数:

    private double GetHeight(out int anotherValue)
    {
        anotherValue = 42;
        return 2;
    }
    
  2. 值元组:

    private (double height, int anotherValue) GetHeight()
    {
        return (42, 2);
    }
    

    (警告:如果在.NET Standard库中使用值元组,则存在已知问题,因为从.NET Standard到.NET Framework的程序集绑定有点...)

  3. 自定义返回类型:

    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数组。另一种方法是创建类。