从一个函数返回2个值

本文关键字:函数 返回 2个值 一个 | 更新日期: 2023-09-27 18:28:50

我有一个表示计划付款的对象。我的数据库有这些付款的列表,但我有一个付款的实例。

我需要写一个方法,在我有一个之后获得下一次付款,以及上一次付款的前一个日期。

我想写一个返回这两个日期的方法。但是'DateTime'的返回类型只允许一个。我可以返回一个List<DateTime>,但这似乎很奇怪,而且可能不明确。哪个是上一个,哪个是下一个?

我还可以创建一个DTO对象,该对象具有:

DateTime previousPayment {get; set;}
DateTime nextPayment {get; set;}

Tuple<DateTime, DateTime>可能是另一种选择,但它也不明确。除非我能说出它的属性?

但是,有没有更好的方法允许返回两个日期?匿名类型还是什么?

从一个函数返回2个值

使用"ref"修饰符。(如果在分配变量之前不需要读取变量,则可以使用"out")

public void GetNextPayment(ref DateTime previousPayment, ref DateTime nextPayment){
    // do stuff here
}

用法:

DateTime previousPayment = DateTime.Now(); //Example
DateTime nextPayment = DateTime.Now(); // example
GetNextPayment(ref previousPayment, ref nextPayment); // Forgot to add "ref" when calling it

previousPayment和nextPayment将在函数中进行修改并保持值。

使用字典更新

正如Anik提到的,使用字典可能会更好;

public Dictionary<string,DateTime> GetNextPayment(DateTime previousPayment, DateTime nextPayment){
    // modify payments
    Dictionary<string,DateTime> myDict = new Dictionary(string, DateTime);
    myDict.Add("PreviousPayment", [date]);
    myDict.Add("NextPayment", [date]);
    return myDict;
}

使用类

伊利亚。N.提到要使用一个类。如果你会有很多付款对象被不止一次使用,我不得不同意这一点。但我坚信,最好给你所有可用的工具,因为你永远不知道什么时候你可能想使用参数或字典。

public class Payment {
    public string Name {get;set;}
    public DateTime previousPayment {get;set;}
    public DateTime nextPayment {get;set;}
    public GetNextPayment(){
        // code to get the next payment
        this.previousPayment = //whatever
        this.nextPayment = //whatever
    }
}

如果你只有一笔付款,你将一如既往地使用。(有利于类的未来验证),那么您可以使用方法或字典。

除了您列出的两个选项外,还有两个:

  1. 返回Tuple<DateTime, DateTime>
  2. 使用out参数

为什么不简单地返回一个类?

public class DateCombo {
DateTime PreviousPayment {get; set;}
DateTime NextPayment {get; set;}
}

试试这个。。。

private void Form1_Load(object sender, EventArgs e)
    {
        DateTime previousPayment =new DateTime();
        DateTime nextPayment=new DateTime();
        getdate(ref previousPayment, ref nextPayment);
    }
    public void getdate(ref  DateTime previousPayment, ref DateTime nextPayment)
    {
        previousPayment = System.DateTime.Now;
        nextPayment = System.DateTime.Now.AddDays(1);
    }