Resharper建议但不对此代码块执行任何重构

时间:2012-03-18 10:14:26

标签: c# asp.net resharper

在下面的方法中,从不使用参数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时,它会显示此消息,与其他所有其他建议不同,它无法更正此代码块

任何人都可以帮我用良好的编码实践重写这个方法。

3 个答案:

答案 0 :(得分:9)

将两个日期参数更改为out

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

See here有关out vs ref的说明

简单地说,当你的方法需要返回两个或多个值时,你会使用out,out表示'我会在退出之前设置这个值'。相反,ref更复杂。这意味着'我需要在此方法中使用此值/对象,我将在退出'

之前更改它们

答案 1 :(得分:8)

或者,因为out参数通常是代码气味,所以您可能希望将方法重写为:

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 :(得分:2)

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