簡単なマシンを用いた静的なクラスのクライアントまで、フルのC#の通知その他の契約者経由でのイベント
-
18-09-2019 - |
質問
っていくシンプルな静的クラスの状態機械のための私の通知を行うアプリケーション他のコントロールとコードがシステムの状態を変化します。と思っていますが、私は走る小さな発行しているところなどです。
こちらのコード:
// An enum denoting the 3 States
public enum Status { Error = -1, Working, Ready }
// The main state change class
public static class Sys
{
// system status
private static Status state;
// delegate and event
public static delegate void StateChangeHandler(object sys, SysInfoEventArgs sysStateInfo);
public static event StateChangeHandler OnStateChange;
public static Status State
{
get { return state; }
set
{
SysInfoEventArgs sysInfo = new SysInfoEventArgs(state, value);
state = value;
OnStateChange(this, sysInfo);
}
}
}
/// <summary>Contains previous and current state info</summary>
public class SysInfoEventArgs : EventArgs
{
public readonly Status oldState;
public readonly Status newState;
public SysInfoEventArgs(Status oldState, Status newState)
{
this.oldState = oldState;
this.newState = newState;
}
}
問題はいていますがこのライン:
OnStateChange(this, sysInfo);
具体的には、"これ"ることは違法である。しか:これについては、自己のインスタンスを生成オブジェクトは静的クラス)
私は望んでいて静的なクラスのための私の状態機械ではなく私のインスタンスを生成でき複数のコピーです。ないなど悪いものがもうとして指を切りそうになったのコードクリーナーを静的クラスです。)
定できるようになりましたかの働きか。
更新:
フォローアップとして、選択したJon Skeetの答えとして、正しいたくなるので問題はあまりのアプローチした、より技術の失敗しました.がんその他のすべての答え以下をサポートチームを取り扱った。
奇しくも、といった見直しのワールドカップ-ワーカーのアプリに書いた、との指摘のプログラムで、トラックの両方の状態をサーバー接続などの状態で作業を行っています。("Yes"、バージニアることが必要で2状態機械...エルゴの削除、すべての"静"をキーワードから上記のコードでは通常のクラスのスマートアプローチ.)
今後も、みなさん。
解決
だいたい静止。この 状態 機械では 状態 これは当然のこを用いた静的クラスです。でも、いつでもできる静的変数を参考にして単一のインスタンスでだいたしました。
基本的には、本能が誤った私の意見を持つ通常のクラスということは、コードクリーナーより静的ます。静授業は非常に珍しい状態でもキャッシュは行なっているので、怪しげ)、またはカウンターのための診断を目的等みいと考えてい オブジェ よ 授業.意味はあって二つの別々の状態機械の異なる状況も異なるイベントハンドラ?この場合、これで新規インスタンスを作成。(でもできる独立した試験走行を行なった。) この状態でのインスタンス機械はこのため、自然にフィットするように
あの人があると考えられるべき no 静方法 no 静授業等それでいいんじゃないで、コンビニが近くにございますのでご注意下さい常に少なくとも 検討 のtestability影響の導入統計情報に
他のヒント
使用できません"この"からアップする場合、その内の静的な範囲などの静的クラスまたは静的な方法です。
いつのオプションです。とすることができます null
は"sys"パラメータとします。本当に、このパラメータの場合には静的なクラスは本当に役に立たなら"送信者"はいつもの静的クラスです。
或いは、も考えておいた方がよいでしょうお状態、notifier シングルトン.ることもできるので単一のインスタンスの非staticクラスです。この利用しやすくなってい転移への不実施の場合、未来を変更します。
また、ともいうべよって実行されていることを確認ある加入者の事前の向上のためこのイベントです。ない原因になりの問題:
public static Status State
{
get { return state; }
set
{
SysInfoEventArgs sysInfo = new SysInfoEventArgs(state, value);
state = value;
var handler = OnStateChange;
if (handler != null)
handler(null, sysInfo);
}
}
変更delegate:
:
public static delegate void StateChangeHandler(object sys, SysInfoEventArgs sysStateInfo);
:
public static delegate void StateChangeHandler(SysInfoEventArgs sysStateInfo);
私はこのコード:
public static delegate void StateChangeHandler(object sys, SysInfoEventArgs sysStateInfo);
public static event StateChangeHandler OnStateChange;
:
public static event Action<SysInfoEventArgs> OnStateChange;
また、静的クラスのセマンティクス object sender
, の適切なもを通す typeof(Sys)
.このものに類似している(オレ)ロック音に関し、クラスです。
っているpedanticでのイベントハンドラが使用する値は、実際に null
い作品で代用することもできます。