0

私はこのコードに出くわしました:

pc = new PendingCommands(pause, wait);
PendingCommands.ProcessCommands = true;

私は2つのことを疑問に思います:

1) コーダーは pc.ProcessCommands = true と書くつもりでしたか?

2) なぜその 2 行目も許可されているのですか? PendingCommands は静的とマークされていません...

「pc」を右クリックして「定義に移動」または「宣言に移動」を選択すると、ここ(同じクラス/ファイル内)に移動します。

public static PendingCommands pc = null;

「PendingCommands」(いずれかの場所から) を右クリックし、「Go to Definition」または「Go To Declaration」を選択すると、ここ (別のクラス/ファイル) に移動します。

public class PendingCommands : IDisposable

「ProcessCommands」メンバーは、「PendingCommands」クラス内で次のように定義されます。

public volatile static bool ProcessCommands = true;

何か不足していますか?

4

4 に答える 4

2

Look at this:

public volatile static bool ProcessCommands = true;

Notice how ProcessCommands is static. That means it's related to the type (PendingCommands), not an instance of the type.

それはほぼ間違いなく良い設計ではありません (パブリック フィールドはめったにありません、静的な可変フィールドはめったにありません、揮発性フィールドはめったにそうではありません) が、それがなぜ書くのが良いのかを説明していますPendingCommands.ProcessCommands = true;

それが本当に静的であることを意図していたのか、それとも単なるバグなのか、残念ながらそれ以上の情報なしでそのように設計されたのかを知ることは困難です. (そのフィールドだけでこのクラスを使うのは緊張しますが...)

PendingCommands「静的とマークされていません」と言及していることに注意してください-静的である必要があるのはクラスではありません。静的クラスは、静的メンバーのみを持ち、インスタンス化できない (または変数型などとして使用できない) 単なるクラスです。重要なのは、アクセスしているメンバーです。

于 2013-02-27T20:15:27.163 に答える
1

staticクラス自体が でなくても、クラス名を介して任意のクラスのフィールドにアクセスできますstatic

于 2013-02-27T20:16:23.223 に答える
1

1) これは間違いですか?コーダーは次のように書くつもりでした: pc.ProcessCommands = true?

おそらく - に関する完全なドキュメントがなければ知る方法はありませんPendingCommands

2) なぜその 2 行目も許可されているのですか? PendingCommands は静的とマークされていません...

PendingCommandsクラスは としてマークされていない可能性がありますが、プロパティはマークされていstaticますProcessCommands

于 2013-02-27T20:16:36.810 に答える
1

ProcessCommandsですのでアクセス可能ですstatic。キーワードを削除するstaticと、クラスのインスタンスに関連してのみアクセスできるようになります。すなわちpc

PendingCommands.ProcessCommands = truePendingCommandsシングルトンとして使用することを意図していない限り、間違いかもしれません。つまり、クラスのインスタンスは 1 つだけであることを意図しているため、静的メソッドProcessCommandsはその唯一のインスタンスのすべての「コマンド」を処理します。

于 2013-02-27T20:16:46.490 に答える