C#是否支持多个返回值?

时间:2010-10-21 22:16:36

标签: c# methods return-value

这是一个非常基本的问题,如果我想做的事情很复杂/涉及,那么我不希望你详细介绍......我读过这可能涉及结构或哈希或某些其他可怕的程序我还没有到达。如果是这样,我相信它很快就能帮到我。

学习类,方法和返回值。

我想让我的班级/方法返回当前小时和分钟。很简单,真的。 这构造是正确的还是正确的?

class MyClass
{
    public int GetHour (int hr, int min)
    {
        DateTime dt = DateTime.Now;
        int hour = dt.Hour;
        int minute = dt.Minute;

        return hour;
        return minute;

    }
}

并且,从Main()调用它:获得一些错误(No overload for methodUnreachable code detected

static void Main ( string[] args )
{
    MyClass mc = new MyClass ();
    Console.WriteLine ("Hour: {0} \n Minute: {1}", mc.GetHour());   
    Console.ReadLine ();
}

问题是:我关闭了吗?

11 个答案:

答案 0 :(得分:30)

如@ChaosPandion所述,在特定情况下,您将返回DateTime结构。

但是,一般情况下,您可以选择以下选项:

使用out参数

这是一种通常始终有效的简单方法。但是,它有点笨拙,因为返回的结果是您通常希望传递函数参数,并且方法签名可能会变得冗长且难以重构。

public void GetTime(out int hr, out int min) 
{ 
    DateTime dt = DateTime.Now;
    hr = dt.Hour;
    min = dt.Minute;
}

static void Main(string[] args)
{
     // declare variables for out parameters first
     int hour, minute;
     GetTime(out hour, out minute);
}

使用数组

如果要返回的值具有相同的类型,这是一个很好的方法。

public int[] GetTime() 
{ 
    DateTime dt = DateTime.Now;
    return new[] { dt.Hour, dt.Minute};
}

使用属性包(属性包是一个只有属性的简单类)

这非常方便,以后可以在不更改方法签名的情况下轻松修改返回值的类型和数量。

class A
{ 
     int Prop1 { get; set; }
     int Prop2 { get; set; }
}

public A SomeMethod()
{
    return new A() { Prop1 = 1, Prop2 = 2 }
}    

使用元组

在C#4.0(需要VS 2010)中,您可以使用Tuple<T1, T2, ...>类:

public Tuple<int, int> GetTime() 
{ 
    DateTime dt = DateTime.Now;
    return Tuple.Create(dt.Hour, dt.Minute);
}

C#7.0元组

C#7.0增加了对多个返回值的支持。您可以编写这样的代码来返回隐式创建的元组:

(string, string, string) LookupName(long id) // tuple return type
{
    ... // retrieve first, middle and last from data storage
    return (first, middle, last); // tuple literal
}

默认情况下,元组元素是名称Item1Item2等,但您也可以指定名称,例如

(string first, string middle, string last) LookupName(long id) // tuple return type
{
    ... // retrieve first, middle and last from data storage
    return (first, middle, last); // tuple literal
}

然后通过这些名称访问元组元素:

var names = LookupName(id);
WriteLine($"found {names.first} {names.last}.");

答案 1 :(得分:6)

C#不支持多个返回值,因此在这种情况下,您应该返回一个DateTime结构,这是惯用的方法。客户端代码可以简单地忽略他们不关心的属性。你可以创建自己的简单结构,但它确实不值得努力。

答案 2 :(得分:3)

C#不支持以这种方式直接从方法返回多个值的想法。但是,有两种方法可以创建返回多个值的方法。第一种是使用ref / out参数。

public void GetHourMinute(out int hour, out int minute) { 
  var now = DateTime.Now;
  hour = now.Hour;
  minute = now.Minute;
}

第二种是创建一个包装这两个值的包装器类型。从4.0开始,使用Tuple类型可以使这更容易。

public Tuple<int,int> GetHourMinute() {
  var now = DateTime.Now;
  return Tuple.Create(now.Hour, now.Minute);
}

答案 3 :(得分:2)

1:你不能有两个return编译器到达return语句后,方法的操作就完成了。
2:如果不使用参数,为什么要让方法接收参数? DateTime.Now为您提供当前时间,如果您将自己视为该方法 - 您需要什么才能完成任务?没有。

所以,实用技巧:
实际上,DateTime比你的方法做得更好。

Console.WriteLine ("Hour: {0} \n Minute: {1}", DateTime.Now.Hour,DateTime.Now.Minute);

本来会更好,
但是我们忽略这一点并将其视为课堂练习。

2返回两个值是违反方法的概念 - 一个方法返回一个东西(有out ref的例外,但我们会忽略它们。) 您实际上可以在自己的代码中看到 - 您的方法名称为GetHour而不是GetHourAndMinutes。我不认为我曾经见过一个带有“和”字样的方法名称 - 一种方法只做一件事。

答案 4 :(得分:2)

我建议你返回DateTime对象。然后在主方法中调用小时和分钟属性。

答案 5 :(得分:1)

是的,你只能从C#中的方法返回一个'东西'。

您遇到的另一个问题是您正在调用没有任何参数的方法。括号中的内容:

public int GetHour (int hr, int min) // here
{
}

是参数。并且在调用方法时需要指定它们,如下所示:

mc.GetHour(1, 2);

但是,当然,在你的情况下,这样做是没有意义的。

回答一般问题:“我如何归还多件事?”您将其封装在类中,设置属性并返回该类。碰巧的是,在您给出的示例中,DateTime类就是这样做的。

希望这有用。

答案 6 :(得分:1)

抱歉,你做不到。返回数组或对象会更好。您可以返回DateTime对象并使用它。

同样如上所述,您的功能签名未被正确调用。

class MyClass
        {
        public int[] GetHour ()
            {
            DateTime dt = DateTime.Now;

            int hour = dt.Hour;
            int minute = dt.Minute;

            return new int[]{hour, minute};
            }
        }

static void Main ( string[] args )
            {
            MyClass mc = new MyClass ();
int[] temp = mc.GetHour();
            Console.WriteLine ("Hour: {0} \n Minute: {1}", temp[0], temp[1]);

            Console.ReadLine ();
            }

答案 7 :(得分:1)

您无法返回多个值。 TimeSpan正是您所寻找的。用你想要捕获的小时,分​​钟甚至秒来创建一个对象并将其返回。

来考虑一下,对于上面你需要的东西,你甚至不必写上面的方法。只需在代码中直接使用DateTime.Now.TimeOfDay

即可

答案 8 :(得分:1)

你不能两次返回,只能返回一次 几个返回值一次需要lambda表达式,而AFAIK只有Python能够做到这一点 语法就像这样:

return x, y

所以也许你应该尝试使用IronPython,然后反编译为C#。

在C#中,有两种方法可以返回多个值:
1.使用参数作为引用调用,这样您就可以分配3个变量然后返回 2.使用某种struct / class / array / tuple / vector并将多个值放入其中
通过引用打电话是这样的:

  

public static void xxx(ref var1,ref   var2,ref var3){        var1 = 123;        var2 = 456;        var3 = 789;        返回; }

然后你做:

int a =1;
int b=2;
int c=3;

xxx(ref a, ref b, ref c);

Console.WriteLine(a.ToString());
Console.WriteLine(b.ToString());
Console.WriteLine(c.ToString());

答案 9 :(得分:1)

在C#中,如果使用yield return格式,方法可以多次返回。

using System.Collections.Generic;

namespace YieldReturn
{
    class Program
    {
        public static void Main(string[] args)
        {
            MyClass mc = new MyClass();
            IEnumerator<int> enu = mc.GetHour().GetEnumerator();
            enu.MoveNext();
            int hour = enu.Current;
            enu.MoveNext();
            int min = enu.Current;
            Console.WriteLine("Hour {0} min {1}", hour, min);
            Console.ReadKey(true);
        }
    }

    class MyClass
    {
        DateTime dt;

        public MyClass()
        {
            dt = DateTime.Now;
        }
        public IEnumerable<int> GetHour()
        {
            int hour = dt.Hour;
            int minute = dt.Minute;
            yield return hour;
            yield return minute;
        }
    }
}

给出“小时8分50”

答案 10 :(得分:0)

我想问你的问题是你为什么要返回多个值?为我返回多个值意味着在函数中有多个职责,并且由于它违反了SRP,因此应该是一个很大的职责。但是,如果这些返回值是相关的,那么他们可能会创建一个您丢失的对象而应该创建它?或者是包含一种对象的列表。

所以简而言之。为什么?将您的返回值封装在一个对象中?不要在一个函数中做多件事。

编辑:在您的情况下,我甚至不会将您的功能包装在函数中,只需写入:

static void Main ( string[] args )
        {
        MyClass mc = new MyClass ();
        DateTime now = DateTime.Now;
        int hour = now.Hour;
        int min = now.Minute;
        Console.WriteLine ("Hour: {0} \n Minute: {1}", hour, min);

        Console.ReadLine ();
        }

您的功能名称GetHour不会执行该功能所说的内容...如果它显示GetHour它应该返回小时而小时加分钟