在下面的方法中,从不使用参数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时,它会显示此消息,与其他所有其他建议不同,它无法更正此代码块
任何人都可以帮我用良好的编码实践重写这个方法。
答案 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#希望您在任何覆盖之前使用参数值。