0
public static bool CheckExpired()
{
    DateTime expiryDate, currentDate = DateTime.Today;
    DateTime.TryParse(date, out expiryDate);

    if (expiryDate > currentDate)
    {
        return true;
    }
    else { return false; }
}

这就是我现在所拥有的。但是,如果日期格式不正确,我希望有第三个选项。就像现在一样,它直接跳转到 else 并返回 false。

问题是我想要三个可能的结果:

true --> 没有过期

false --> 已过期

第三个 --> 输入的日期无效

我只是坚持我是如何到达那里的。我知道我可以轻松地使用 String 返回类型,但是有什么办法吗?

4

9 回答 9

6

几个选项;

  1. 使用bool?类型;然后您可以返回null结果。问题是,“null”在您的上下文中并没有真正的意义,因此用法不清楚

  2. 抛出一个Exceptionif 格式不正确。可能使用法更清晰(不能传递格式错误的日期),但这意味着您需要在所有调用者中进行尝试捕获

  3. 使用 anenum作为返回值,它可以为您的结果显式设置名称。

我认为枚举在这里可能最有意义,并且对于该方法的消费者来说是最清楚的;

public enum ExpiredResult
{
    Expired,
    NotExpired,
    FormatError,
}
于 2013-02-04T21:06:22.130 回答
5

由于DateTime.TryParse()如果成功返回布尔值,您可以触发它。

if(DateTime.TryParse(date, out expiryDate))
{
    if (expiryDate > currentDate)
    {
        return true;
    }
    else { return false; }
}
else
{
    Console.Write("Invalid date.");
}

然后使用 Nullable 而不是 bool 作为返回类型。

于 2013-02-04T21:05:18.280 回答
5

你可以使用NullableBool,

    public static bool? CheckExpired(string date)
    {
        DateTime expiryDate, currentDate = DateTime.Today;
        if (DateTime.TryParse(date, out expiryDate))
        {
            return expiryDate > currentDate;
        }
        return null;
    }

true --> 没有过期

false --> 已过期

null --> 输入的日期无效

于 2013-02-04T21:05:34.017 回答
1

我稍微重构了代码。但这可能是一个解决方案:

public static bool CheckExpired()
{
    DateTime expiryDate, currentDate = DateTime.Today;

    if (!DateTime.TryParse(date, out expiryDate))
    {
         throw new Exception("Invalid date");
    }

    return (expiryDate > currentDate);
}
于 2013-02-04T21:06:19.687 回答
0

就我个人而言,我只是编写一个 Enum 来封装返回状态,如下所示:

public enum ExipiryStatus
{
    Expired,
    NotExpired,
    InvalidDate
}

public static ExipiryStatus CheckExpired(string date)
{
    DateTime expiryDate, currentDate = DateTime.Today;

    if (DateTime.TryParse(date, out expiryDate))
    {
        if (expiryDate > currentDate)
        {
            return ExipiryStatus.Expired;
        }
        else
        {
            return ExipiryStatus.NotExpired;
        }
    }
    else
    {
        return ExipiryStatus.InvalidDate;
    }
}

我真的不喜欢这种可以为空的布尔值。在调用站点上,返回值应该是什么从来都不是很清楚。使用枚举,它是明确的。

[编辑] 被打败了。:)

于 2013-02-04T21:13:08.767 回答
0

尝试这个:

public static bool? CheckExpired(string date)
{
    DateTime expiryDate;
    DateTime currentDate = DateTime.Today;

    if (!DateTime.TryParse(date, out expiryDate))
    {
        return null;
    }

    return (expiryDate > currentDate);
}

检查null返回值或有效true/false值,如下所示:

string date = "2/4/2013";
bool? isExpired = CheckExpired(date);

if (!isExpired.HasValue)
{
    Console.Write("Invalid date");
}
else if (isExpired.Value)
{
    Console.Write("Expired");
}
else // if (!isExpired.Value)
{
    Console.Write("Valid");
}
于 2013-02-04T21:09:30.373 回答
0

听起来像是一个枚举的工作......

于 2013-02-04T21:07:15.003 回答
0

我会选择一个枚举。类似于以下内容:

public static DateValidationResult CheckExpired(string date)
{
    DateTime expiryDate, currentDate = DateTime.Today;
    if (!DateTime.TryParse(date, out expiryDate))
        return DateValidationResult.InvalidDate;

    return expiryDate > currentDate ? DateValidationResult.Ok : DateValidationResult.Fail;
}

public enum DateValidationResult
{
    InvalidDate,
    Ok,
    Fail
}
于 2013-02-04T21:07:36.917 回答
0

您可以使用可为空的 bool (bool?) 或 int

如果字符串未能转换为日期时间,它将返回 null

public static bool? CheckExpired()
    {
        DateTime expiryDate, currentDate = DateTime.Today;
        DateTime.TryParse(date, out expiryDate);
        if (expiryDate == new DateTime())
        {
            return null;
        }
        if (expiryDate > currentDate)
        {
            return true;
        }
        else 
        { return false; }
    }
于 2013-02-04T21:06:01.313 回答