Resharper建议对这段代码块进行重构,但不会执行任何重构操作。

4
在以下方法中,参数fromDate和toDate的值从未被使用,因为它们在被读取之前在函数体内被覆盖了。
static void GetDatesFromMonth(string month, ref DateTime fromDate, ref DateTime toDate)
{
  DateTime userDateTime = TimeHelper.getUserGMTNow();
  DateTime calculatedDate = Convert.ToDateTime(month + " 01," + userDateTime.Year);
  toDate = calculatedDate.AddMonths(1).AddSeconds(-1);
  fromDate = toDate.AddMonths(-12).AddSeconds(1);
}

我在我的类文件中许多地方都使用了这段代码。

当我在我的代码上运行Resharper时,它会显示此消息,与其所有其他建议不同,它无法更正此代码块。

有人能帮我用较好的编码实践重写这个方法吗?


询问有关ReSharper的错误/警告是否太多了? - gdoron
3个回答

13

将这两个日期参数更改为 out

static void GetDatesFromMonth(string month, out DateTime fromDate, out DateTime toDate) 

点击此处查看关于out与ref的澄清。

简单来说,当您的方法需要返回两个或更多的值时,使用out,out表示“在退出之前我将设置这些值”。相反,ref更加复杂。它表示“我需要这些值/对象在该方法内部,并且我会在退出之前更改它们”。


8

另外,由于输出参数通常是代码异味,因此您可能希望将方法重写为以下内容:

static Tuple<DateTime, DateTime> GetDatesFromMonth(string month)
{
    ...
}

或者

static ToFromDates GetDatesFromMonth(string month)
{
    ...
}

使用

class ToFromDates
{
   public DateTime To{get;set;}
   public DateTime From{get;set;}
}

您也可以创建一个扩展方法

static class DateExtensions
{
    public static Tuple<DateTime, DateTime> GetDatesFromMonth(this string month)
    {
        ...
    }
}

并在你的代码中像这样使用

var dates = "January".GetDatesFromMonth();

2

只需使用out代替ref。这将显示您的意图(参数将是输出参数),并且还将表明这些参数的初始值是无关紧要的。这也应该解决R#警告。如果您使用ref,则R#希望您在任何覆盖之前使用参数值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接