3

どうやら public フィールドはめったに良いアイデアではなく、プロパティに何も追加しません。

例えば:

public class ClientGroupDetails
{
    public DateTime Col2;
    public String Col3;
    public Int32 Col4;

    public ClientGroupDetails(DateTime m_Col2, String m_Col3, Int32 m_Col4)
    {
        Col2 = m_Col2;
        Col3 = m_Col3;
        Col4 = m_Col4;
    }

    public ClientGroupDetails() { }
}

[WebMethod()]
public List<ClientGroupDetails> GetClientGroupDetails(string phrase)
{
    var client_group_details = new List<ClientGroupDetails>();

    using (connection = new SqlConnection(ConfigurationManager.AppSettings["connString"]))
    {
        using (command = new SqlCommand(@"select col2, col3, col4 from table1 where col1 = @strSearch", connection))
        {
            command.Parameters.Add("@strSearch", SqlDbType.VarChar, 255).Value = phrase;

            connection.Open();
            using (reader = command.ExecuteReader())
            {
                int Col2Index = reader.GetOrdinal("col2");
                int Col3Index = reader.GetOrdinal("col3");
                int Col4Index = reader.GetOrdinal("col4");

                while (reader.Read())
                {
                    client_group_details.Add(new ClientGroupDetails(
                        reader.IsDBNull(Col2Index) ? (Nullable<DateTime>)null : (Nullable<DateTime>)reader.GetDateTime(Col2Index),
                        reader.IsDBNull(Col3Index) ? null : reader.GetString(Col3Index),
                        reader.GetInt32(Col4Index)));
                }
            }
        }
    }

    return client_group_details;
}
}

私の質問は、パブリック フィールドを使用するこのコードをプロパティに変換するにはどうすればよいですか?

4

3 に答える 3

11

最も簡単な方法は、次のようにすることです。

public DateTime Col2 { get; set; }
public String Col3 { get; set; }
public Int32 Col4 { get; set; }

これにより、フィールドではなく自動実装されたプロパティになります。

「パブリックフィールドは決して良いアイデアではない」というあなたの声明には同意しないことに注意してください-それらがめったに良いアイデアではないことに同意しますが、パブリックプロパティよりもはるかに使いやすい(まれな)場合があります。パブリック フィールド適切な場合についての適切な議論については、Rico Mariani の「値ベースのプログラミングに関する 10 の質問」を、質問回答の両方で読むことをお勧めします。特に不正な値がなく、一般的なユースケースに頻繁なミューテーションが含まれることが予想される場合、彼は public フィールドを強く主張しています。

そうは言っても、あなたの特定のケースでは、プロパティに変換することが有益だと思います。さらに、これを意味のある名前のプロパティに変換することをお勧めします( ではなくCol2、 のようなものDateなど)。


コメントに応じて編集:

完全なクラスは次のようになります。

public class ClientGroupDetails
{
    public DateTime Col2 { get; set; }
    public String Col3 { get; set; }
    public Int32 Col4 { get; set; }

    public ClientGroupDetails(DateTime m_Col2, String m_Col3, Int32 m_Col4)
    {
        Col2 = m_Col2;
        Col3 = m_Col3;
        Col4 = m_Col4;
    }

    public ClientGroupDetails() { }
}

ただし、これを作り直して、より良い名前にすることをお勧めします。つまり、次のようになります。

public class ClientGroupDetails
{
    // Not 100% sure what appropriate names should be here
    public DateTime Date { get; set; }
    public String Name { get; set; }
    public Int32 Id { get; set; }

    public ClientGroupDetails(DateTime date, String name, Int32 id)
    {
        this.Date = date;
        this.Name = name;
        this.Id = id;
    }

    // I also wouldn't include this unless you really need it...
    // public ClientGroupDetails() { }
}

このクラスを作成した後に値を編集しない場合は、次の方法で、値を公開して取得できるが設定できないプロパティにすることができます。

    public DateTime Date { get; private set; }
    public String Name { get; private set; }
    public Int32 Id { get; private set; }

これにより、クラス (つまり、コンストラクター) が値を設定できるようになりますが、クラスの外部では値を変更することはできません。

于 2012-11-02T16:07:06.750 に答える
2

プライベートおよびパブリック キーワードを使用して、これらの変数へのアクセスを提供できます。完全な(怠惰ではない)方法は(ここTにいくつかのクラスタイプがあります)

private T myT;
public T MyT
{
    get { return this.myT; }
    set { this.myT = value; }
}

または私たちの怠け者のために、あなたは使用することができます

public T MyT { get; set; }

これが役立つことを願っています。

于 2012-11-02T16:09:04.210 に答える
1

プロパティ構文の例を次に示します。getandブロック内で、setコードを関数のように実行できるようになったため、値を検証してからプライベート変数に割り当てることができます。getプライベートな値を公開するだけでなく、ブロックから計算された値を返すこともできます。

private MyType _myField;

public MyType MyField
{
    get { return _myField; }
    set { _myField = value; }
}

プライベートメンバーを非表示にするだけの場合は、省略形もあります。

public MyType MyField { get; set; }
于 2012-11-02T16:06:29.400 に答える