24

log4net のコードを確認していたところ、これに遭遇しました。

private static readonly ILog logger = LogManager.GetLogger(typeof(AdminClient));

なぜプライベートな静的読み取り専用が必要なのか疑問に思っています。

私の理解では、private は、アクセサー メソッドまたは get プロパティがない限り、変数をクラス外で使用できないことを意味します。

static は、変数がこのファイルのみにスコープされていることを意味します。

readonly は、値から読み取ることしかできず、割り当てることができないことを意味します。

だから、このコードを書いた人だと思っています。クラス外で使用したくないのでプライベートと宣言し、ファイル外で使用したくないので静的と宣言しました。ただし、get プロパティがある場合、static はこのフォームの発生を防ぎます。

私は読み取り専用を理解できると思います。値は読み取りのみで設定されません。

アドバイスありがとうございました。

4

9 に答える 9

48
  • private誰もクラス外 (サブクラスであっても) logger フィールドを使用しないでください。これを設定しないと、他のクラスがクラス名でログにロガーを使用する可能性があります。
  • static属性はクラスに関連付けられているため、クラスの各インスタンスで繰り返されません。これを設定しないと、システムがオブジェクトのインスタンスを作成するたびに、ロガー属性がメモリ内の余分なスペースを占有します (これは誤解です)。
  • readonlyロガー フィールドは変更しないでください。
于 2009-06-09T04:32:28.360 に答える
2

c#のstaticは、メンバーがクラスのインスタンスではなく、クラスに関連付けられていることを意味します。C#ではほとんどの変数、特にこれは参照変数であるため、読み取り専用が重要です。読み取り専用とは、この変数が常に同じロガーを参照することを意味します。

于 2009-06-09T04:45:32.250 に答える
2

開発者が言っているのは、このクラスの任意のインスタンスで logger.Info(...) を呼び出すときに、共通の (静的) インスタンスを使用したいということです (したがって、クラス インスタンスごとに新しいロガーを作成する必要はありません)。彼らは、それが作成されてから変更されていないことを確認したいと考えています (読み取り専用)。また、派生クラスで仮想関数を使用している場合は、基本クラスを誤って使用しないようにしたいと考えています (プライベート)。

于 2009-06-09T08:52:45.843 に答える
1

readonly変数は、値が有効期間を通じて一定であるという点で const に非常によく似ています。違いは、読み取り専用変数は実行時に初期化され、const はコンパイル時に初期化されることです。staticは、素人の言葉で言えば、変数のインスタンスが、それが宣言されているオブジェクトのインスタンスに依存しないことを意味します。その有効期間は、関数呼び出しから関数呼び出しまで持続します。静的変数は、その記憶域がプログラムの全期間にわたって割り当てられたままになるため、より高速にアクセスできます。これを知っているので、あなたの質問に戻ることができます。

「ロガー」が静的メンバーなのはなぜですか? それは設計上の決定です。この質問に答えるために、あなたがそれをどのように使用しているかを知る必要があります。なぜ読み取り専用なのですか?一度初期化され、そのインスタンスがずっと使用されているように見えるためです。logger を初期化した直後に「読み取り専用」にすることで、他の誰も logger の値を改ざんしないようにすることができます。

于 2009-06-09T04:59:24.353 に答える
1

プライベート変数に readonly フラグを設定する理由は、変数が常に同じオブジェクトを参照することを宣言するためです。プライベートであるとクラス外の誰からも見えなくなるのは事実ですが、このようにして、次のように書くことで、変数を新しいオブジェクトで誤って上書きしないようにすることができます

logger = LogManager.GetLogger(typeof(AdminClient));

私たちのクラスのどこかに。readonly を使用すると、コンパイルされません (以前に初期化されておらず、(静的) コンストラクターにいる場合を除きます)

于 2009-06-09T09:03:03.873 に答える
1

静的変数は「クラス変数」のカテゴリに分類されます。クラス変数は、クラスオブジェクトではなくクラスに関連付けられている変数です。一方、インスタンス変数は、クラスオブジェクトに関連付けられている変数であり、クラスオブジェクトが初期化されるたびにこのオブジェクトを意味しますその「インスタンス変数」(非静的)の独自のコピーを持ちますが、静的変数は、リンクリストのサイズなど、実行中のプログラムのクラスのすべてのオブジェクト間で共有されます。読み取り専用は、変数を読み取り専用にするために使用されるC#キーワードであり、Javaはそうではありませんそのような機能を提供するには、調整したくない変数にアクセスするためのパブリック メソッドを作成する必要があります。

于 2009-09-09T18:06:26.923 に答える
0

申し訳ありませんが、これはすでに回答されており、非常に古いことは知っていますが、この記事に出くわした人に、これが「シングルトン」パターンのセットアップ方法であることを知らせたいと思いました. 質問のコード例について詳しく知りたい人は、Singleton とその使用方法 (メディエーター、ロガー、非同期コールバックなど) について詳しく知ることで恩恵を受ける可能性があります。

// シングルトンに関するマザーシップ関連
http://msdn.microsoft.com/en-us/library/ff650316.aspx
http://msdn.microsoft.com/en-us/library/ff650849.aspx

// それらについてのすばらしい SO ディスカッション
シングルトンの何が悪いのでしょうか?

于 2013-06-07T14:03:30.237 に答える