这是一个非常基本的问题,如果我想做的事情很复杂/涉及,那么我不希望你详细介绍......我读过这可能涉及结构或哈希或某些其他可怕的程序我还没有到达。如果是这样,我相信它很快就能帮到我。
学习类,方法和返回值。
我想让我的班级/方法返回当前小时和分钟。很简单,真的。 这构造是正确的还是正确的?
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 method
和Unreachable code detected
)
static void Main ( string[] args )
{
MyClass mc = new MyClass ();
Console.WriteLine ("Hour: {0} \n Minute: {1}", mc.GetHour());
Console.ReadLine ();
}
问题是:我关闭了吗?
答案 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
}
默认情况下,元组元素是名称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
}
然后通过这些名称访问元组元素:
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
它应该返回小时而不小时加分钟