24

私はlog4netのためにいくつかのコードを検討していました、そして、私はこれに遭遇しました。

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

私はなぜあなたがプライベートな静的読み取り専用を持つ必要があるのだろうかと思っています。

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

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

readonlyとは、値から読み取ることしかできず、代入できないことを意味します。

だから、私はこのコードを書いた人だと思っています。クラス外で使用したくないので静的に宣言し、静的にしてファイル外で使用したくないようにします。ただし、getプロパティがあると、静的にこの形式の作成が妨げられます。

私はreadonlyを理解することができると思います、そして、値はただ読まれることであり、設定されることではありません。

アドバイスをありがとう


  • この特定のパターンについての興味深いさておき:私はかつてこれをと宣言したprotected static readonlyそしてそれは私に"を獲得しました。CA2104:読み取り専用の変更可能な参照型を宣言しないでください。 VS Code Analysisからの警告です。述べたようにここに「Aprotected readonlyフィールドはそれほど明確ではありません。としてprotectedあなたは、派生クラスがフィールドを初期化できることを期待するかもしれません。宣言をに変更private static readonlyこれを修正しました。 - CrazyPyro

9 답변


45

  • 非公開他のクラスがあなたのクラス名でログインするためにあなたのロガーを使うことができないならば、誰もクラスの外で(サブクラスでさえ)ロガーフィールドを使うべきではありません。
  • 静的属性は添付それはしないようにクラスに繰り返すクラスの各インスタンスで。これを設定しないと、システムがオブジェクトを構成するすべてのインスタンスで、logger属性がメモリ内の余分なスペースを占有します(これを誤解しています)。
  • 読み取り専用ロガーフィールドは変更しないでください。



9

静的だと誤解していると思います。静的とは、「ファイルの外部では使用できない」という意味ではありません。静的な意味:クラスごとに1つあります。この宣言が行うことは、一度だけ割り当てられ(静的)、クラスでのみ利用可能(派生クラスでも利用不可能)(プライベート)、初期化を超えて書き込むことができない(読み取り専用)ロガーを作成することです。

でもいい質問ですね。


6

静的なではないstaticキーワードは、ロガーオブジェクトがインスタンス変数ではなくクラス変数であることを意味します。そのため、そのクラスの異なるオブジェクトからアクセスした場合でも、それらはすべて参照します。同じロガーオブジェクト


2

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


2

開発者が言っているのは、このクラスの任意のインスタンスでlogger.Info(...)を呼び出すときに、共通の(静的)インスタンスを使用したいということです(したがって、クラスインスタンスごとに新しいロガーを作成する必要はありません)。彼らはそれが作成されてから変更されていないことを確信したいのですが(readonly)そして派生クラスの中で仮想関数の中にいたら私は間違ってベースクラスを使わないようにしたいです(private)。


1

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

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


1

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

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

私たちのクラスのどこかで。 readonlyではそれはただコンパイルされません(以前に初期化されていなかったのでなければ、そして我々は(静的)コンストラクタにいる)


1

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


0

すみません、私はこれがすでに答えられて、そしてそれが本当に古くなっているのを知っています、しかし私はこの記事に出くわす誰かにこれがあなたが設定する方法であることを知らせたいですシングルトン"パターン。問題のコード例についてもっと知りたい人は、シングルトンとその使い方(調停者、ロガー、非同期コールバックなど)についてもっと知ることが有益でしょう。

//シングルトンに関するマザーシップのもの

http://msdn.microsoft.com/en-us/library/ff650316.aspx

http://msdn.microsoft.com/en-us/library/ff650849.aspx

//それらについてのとても素晴らしいディスカッション

シングルトンの悪いところは何ですか?

リンクされた質問


関連する質問

最近の質問