2

小さなコードを書いたばかりですが、プロパティを介して公開および使用されるメンバー変数の初期化に関して、どの初期化方法がベスト プラクティスであるかがわからないことに気づきました。以下の 2 つの例のうち、メンバー変数を初期化する最良の方法はどれですか?さらに重要なのはその理由です。

例 1:

    private string m_connectionString = ConfigurationManager.ConnectionStrings["ApplicationDefault"].ConnectionString;
    private string m_providerName = ConfigurationManager.ConnectionStrings["ApplicationDefault"].ProviderName;

    public string ConnectionString
    {
        get { return m_connectionString; }
        set { m_connectionString = value; }
    }

    public string ProviderName
    {
        get { return m_providerName; }
        set { m_providerName = value; }
    }

    public EntityClusterRefreshServiceDatabaseWorker()
    {
    }

例 2:

    private string m_connectionString;
    private string m_providerName;

    public string ConnectionString
    {
        get { return m_connectionString; }
        set { m_connectionString = value; }
    }

    public string ProviderName
    {
        get { return m_providerName; }
        set { m_providerName = value; }
    }

    public EntityClusterRefreshServiceDatabaseWorker()
    {
        ConnectionString = ConfigurationManager.ConnectionStrings["ApplicationDefault"].ConnectionString;
        ProviderName = ConfigurationManager.ConnectionStrings["ApplicationDefault"].ProviderName;
    }

注: これらの変数を静的コンテキストで使用していないと仮定します。

4

4 に答える 4

8

基本クラスのコンストラクターがオーバーライドされたメンバーを呼び出すという非常に奇妙な状況を除いて、どちらを使用するかは実際には問題ではありません。コンストラクタ本体はその後実行されます。

後者の場合、自動的に実装されたプロパティを使用することで、コードをより簡単にすることができます:

public string ConnectionString { get; set; }
public string ProviderName { get; set; }

public EntityClusterRefreshServiceDatabaseWorker()
{
    // Code as before
    ConnectionString = ...;
    ProviderName = ...;
}

自動的に実装されたプロパティには初期値を指定する方法がないため、最初のフォームでこれを行うことはできません。

(セッターを非公開にすることを検討することもできますが、それは別の問題です。)

于 2012-06-27T08:18:34.523 に答える
1

基本的に同じことをしていますが、別の形式で書いています。

メソッドがどこにもないところで実行されるのは好きではないので、私は常に2番目のアプローチを好みます(そして使用します)。物は分けたほうがいいです。属性はクラス本体で宣言され、クラス コンストラクターで初期化されます。

于 2012-06-27T08:19:51.000 に答える
1

接続文字列が変更されない限り、次のように初期化できますstatic readonly

private readonly static string m_connectionString = ConfigurationManager.ConnectionStrings["ApplicationDefault"].ConnectionString;
private readonly static string m_providerName = ConfigurationManager.ConnectionStrings["ApplicationDefault"].ProviderName;

読み取り専用変数は、クラス宣言/コンストラクターでのみ初期化でき、通常のプライベート変数よりもパフォーマンスが最適化されています。

質問に戻りますが、これらをどこで初期化するかは問題ではありません。

于 2012-06-27T08:22:02.150 に答える
0

フィールドをドロップして自動プロパティを選択し、セッターを非公開にします。

public string ConnectionString {get; private set;}

public string ProviderName {get; private set;}

ロブ

于 2012-06-27T08:20:06.007 に答える