如果可选参数在C#中不为null,则调用方法

时间:2019-02-25 06:40:27

标签: c#

我有一个带有两个可选参数的方法。我想缩短代码。
这是我的代码:

DataTable dtList;
if (!duration.ContainsKey("startDay") && duration.ContainsKey("endDay"))
{
    dtList = GetAllReservation();
}
else if (duration.ContainsKey("startDay") && !duration.ContainsKey("endDay"))
{
    dtList = GetAllReservation(duration["startDay"]);
}
else
{
    dtList = GetAllReservation(duration["startDay"], duration["endDay"]);
}

有什么方法可以将这段代码缩短为:

dtList = GetAllReservation(duration["startDay"], duration?["endDay"]);

这是我的方法GetAllReservation:

public static DataTable GetAllReservation(string start = "1397/01/01", string end = "1400/12/29") =>
    DataAccess.Select($"Exec ReservationList '{start}', '{end}'", ref _methodState);

5 个答案:

答案 0 :(得分:2)

请勿将参数default定义为业务默认值。将参数default定义为null,表示缺少值。该方法本身应检查默认参数,并根据需要替换业务默认值。

uint64_t

此外,您可以在Dictionary上编写扩展方法:

public static DataTable GetAllReservation(string start = null, string end = null) 
{
    if (start == null) start = _config.GetDefaultStartDate();
    if (end == null) end = _config.GetDefaultEndDate();

    DataAccess.Select($"Exec ReservationList '{start}', '{end}'", ref _methodState);
}

这可以使您缩短对此的通话:

public static string GetStringOrNull(this Dictionary<string,string> source, string key)
{
    if (!source.ContainsKey(key)) return null;
    return source[key];
}

答案 1 :(得分:1)

你可以这样做

$branch = 'select_name';
$query = "
    SELECT 
        your_field
    FROM 
         [".${'connection_'.$branch.'_db'}."].['table_name'] 
";
$rs = ${'connection_'.$branch}->execute($query);

答案 2 :(得分:1)

尝试一下,

 dtList = GetAllReservation(duration.ContainsKey("startDay")?duration["startDay"]:"1397/01/01",duration.ContainsKey("endDay")?duration["endDay"]:"1400/12/29");

答案 3 :(得分:0)

这里不需要可选参数(如果您确实想要较短的代码版本,并且可能更易读):

string startDayDuration = duration.ContainsKey("startDay") ? duration["startDay"] : "1397/01/01";
string endDayDuration = duration.ContainsKey("endDay") ? duration["endDay"] : "1400/12/29";

dtList = GetAllReservation(startDayDuration, endDayDuration);

然后使用您的方法

public static DataTable GetAllReservation(string start, string end) =>
    DataAccess.Select($"Exec ReservationList '{start}', '{end}'", ref _methodState);

答案 4 :(得分:0)

我认为,良好的编程不一定意味着较短的代码。将每种情况视为单独的方法可能很有价值。如果每种方法都具有特定的功能,则每种方法的逻辑将变得更简单。它还减少了编码错误和可能的异常。 在这种情况下,您有3种方法。每种方法根据参数的数量执行略有不同的工作,但最后返回相同的结果。这看起来是方法重载的一个很好的例子。我相信方法重载是好的,只要方法仅使用不同的参数才真正执行相同的核心功能。有人认为方法重载是邪恶的。