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

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

これは私が今持っているものです。ただし、日付が正しくフォーマットされていない場合の3番目のオプションが必要です。現在のように、elseに直接ジャンプし、falseを返します。

問題は、3つの可能な結果が必要なことです。

true->有効期限が切れていません

false->有効期限が切れています

3番目->無効な日付が入力されました

私はそこにたどり着く方法に固執しています。文字列の戻り型を簡単に使用できることは知っていますが、それを回避する方法はありますか?

4

9 に答える 9

6

いくつかのオプション。

  1. bool?タイプを使用します。nullその後、結果として戻ることができます。つまり、「null」はあなたの文脈では実際には意味がないので、使用法は明確ではありません

  2. Exception正しくフォーマットされていない場合はスローします。おそらく使用法が明確になります(不適切な形式の日付を渡すことはできません)が、すべての発信者でトライキャッチが必要になることを意味します

  3. を戻り値として使用しenumます。これにより、結果の名前を明示的に設定できます。

列挙型はおそらくここで最も理にかなっており、メソッドの消費者にとって最も明確であると思います。

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.");
}

次に、戻り型にboolの代わりにNullableを使用します。

于 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

null許容の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 に答える
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

これを試して:

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

個人的には、次のように、戻り値の状態をカプセル化する 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;
    }
}

私は、この種のことに対してnull可能なブール値が本当に好きではありません。呼び出しサイトでは、戻り値がどうあるべきかが明確になることは決してありません。列挙型では、明示的です。

[編集]それに殴られた。:)

于 2013-02-04T21:13:08.767 に答える