1

入力データの検証を get;set; に移動しようとしています。クラス構造体の。

public void PlotFiles()
    {

     List<DTVitem.item> dataitems;
        DTVitem.item i;
        DateTime.TryParse("2012/01/01", out i.dt);
        DateTime.TryParse("04:04:04", out i.t);
        int.TryParse("455", out i.v);
        dataitems.Add(i);

    }

構造体は別のクラスで宣言されています (おそらく不要です)。

public partial class DTVitem
{
    public struct item
    {
        public DateTime dt;
        public DateTime t;
        public int v;
    }
}

DTVitem.item.dtDTVitem.item.t、またはを設定するたびにDTVitem.item.v、関連することを実行し.TryParse()てプロパティの内容を検証したいと考えています。

ただし、次のように TryParse() を使用しようとすると ( MSDN のこの例に頭を悩ませようとしています):

public partial class DTVitem
{
    private DateTime _datevalue;

    public string dt
    {
        get { return _datevalue; }
        set { DateTime.TryParse(value, out _datevalue) ;}
    }
}

というエラーが表示され_datevalue is a DateTime and cannot be converted to a stringます。その理由は明らかに、戻りパスがdtこのインスタンス ( a string) の型を返さなければならないからです。ただし、これをいくつかの異なる方法でマッサージしようとしましたが、ハッキングできません。

値を構造体のインスタンスのプロパティとして設定するときに、string値を として検証するという目標を達成するにはどうすればよいですか?DateTime

set私が最善の方法を試みているように使用していますか?

get;set; を使用することには多くの価値があることがわかります。検証のために、本当にそれを理解したいです。

どうもありがとう、

マット

[編集]

私のやり方の誤りを指摘してくれた以下のJon Skeetに感謝します。

変更可能な structs の問題に関する別のスレッドと、 structのインスタンス化について話している別のスレッドがあります。注意構造体は値型です。

彼が指摘していたことの残りの部分は、構造体を遠くに埋める必要はないということに同意しているだけだと思います。なぜそうしているのかを確認する必要があります。

[解決]

以下のいくつかの推奨事項を考慮して、次のことを考え出しました。

public partial class DTVitem
{
    private DateTime _dtvalue, _tvalue;
    private int _vvalue;

    public string dt
    {
        get { return _dtvalue.ToString(); }
        set { DateTime.TryParse(value, out _dtvalue); }
    }

    public string t
    {
        get { return _tvalue.ToString(); }
        set { DateTime.TryParse(value, out _tvalue); }
    }

    public string v
    {
        get { return _vvalue.ToString(); }
        set { int.TryParse(value, out _vvalue); }
    }
}

プログラム クラス内で、次のようにインスタンス化して設定しました。

DTVitem item = new DTVitem();
item.dt = "2012/01/01";
item.t = "04:04:04";
item.v = "455";

そこで、構造体ではなくクラスを使用することにしました。または実際にはクラスのインスタンス。

4

5 に答える 5

3

プロパティは 1 つのタイプのみを持つことができます。プロパティを文字列型にしたい場合は、次のように実装できます。

public partial class DTVitem
{
    private DateTime _datevalue;

    public string dt
    {
        get { return _datevalue.ToString(); }
        set { DateTime.TryParse(value, out _datevalue) ;}
    }
}

ただし、TryParse() を使用すると、DateTime が無効な場合、setter は例外をスローしません。これを行いたい場合は、代わりに DateTime.Parse() を使用してください。

于 2013-02-19T21:30:23.200 に答える
1

getで型変換が欠落しているだけです。_datevalueはDateTimeですが、プロパティは文字列です。

get { return _datevalue.ToString(); } //or .toShortDateString() or ToShorttimeString()
于 2013-02-19T21:32:18.983 に答える
1
public partial class DTVitem
{
    private DateTime _datevalue;

    public string dt
    {
        get { return _datevalue.ToString(); }
        set { DateTime.TryParse(value, out _datevalue) ;}
    }
}
于 2013-02-19T21:30:34.433 に答える
0

その他の (主に設計上の) 問題はさておき、_datevalue文字列として返される問題に取り掛かるだけで、次のようなことが簡単にできます。

public string dt
{
    get { return _datevalue.ToString(); }
    set { if(!DateTime.TryParse(value, out _datevalue)) /* Error recovery!! */ ;}
}

>>>ドキュメントをチェックしてDateTime.ToString()、プロパティにアクセスするときに文字列を取得する形式を確認することもできます。

于 2013-02-19T21:34:17.007 に答える
0

取得;設定; 同じタイプでなければなりません。get は、文字列が必要なときに日時を返すため、エラーが発生します。

明示的なメソッド bool setDate(String datestring) を使用して、そこにコードを配置してください。成功したかどうかを知らせるために、tryparse から bool を返すことができます。

于 2013-02-19T21:32:04.037 に答える