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

Don*_*onG 13 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;

    }
}
Run Code Online (Sandbox Code Playgroud)

并且,从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 ();
}
Run Code Online (Sandbox Code Playgroud)

问题是:我关闭了吗?

Dir*_*mar 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);
}
Run Code Online (Sandbox Code Playgroud)

使用数组

这是一个简单的方法,如果要返回的值具有相同的类型,则该方法很有效.

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

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

这非常方便,可以在以后轻松修改返回值的类型和数量,而无需更改方法签名.

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

public A SomeMethod()
{
    return new A() { Prop1 = 1, Prop2 = 2 }
}    
Run Code Online (Sandbox Code Playgroud)

使用元组

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

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

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
}
Run Code Online (Sandbox Code Playgroud)

元组元素的名称Item1,Item2等默认,但你也可以指定名称,例如,

(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
}
Run Code Online (Sandbox Code Playgroud)

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

var names = LookupName(id);
WriteLine($"found {names.first} {names.last}.");
Run Code Online (Sandbox Code Playgroud)


Cha*_*ion 6

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

  • @DonG - 使用`DateTime`的最大优点是清晰度.几乎每个.NET开发人员都会确切知道如何使用您的代码. (2认同)