2010-12-10 7 views
2

私は現在、どのアプリケーションからも独立した小さなテクニカルフレームワークを開発中です。ビジネスコードはこのフレームワークを参照しています。C#内部デリゲートとパブリックイベント

この記事によれば:http://msdn.microsoft.com/en-us/library/5z57dxz2.aspx(例2)、カスタムイベントの代理人を用意する必要があります。

問題は、ビジネスコードであっても私のハンドラを呼び出すことができます(イベントを発生させることができます)。それは私にとっては論理的ではないため、カスタムイベントを呼び出すための最良の方法は、 「内部」のみで「公的」ではない

ありがとうございました。

答えて

6

私はそれが正しいかどうかわかりません。私はあなたがあなたのカスタムイベントのために公開Delegateタイプを提供するように感じる、誰もそのイベントを発生させることができるように感じると思う。

まあ、そうではありません。カスタムイベントを定義するクラスのみがそれを呼び出すことができます。これが問題ならば、心配しないでください。

+0

はい、そのままです。私は混乱していました... :-( –

+0

クラスAで代理人をパブリックとして宣言すると、クラスAのオブジェクトを作成する他のクラスは代理人にアクセスできます。安全のためにプライベート – helloworld

2

デリゲートは、イベントの「署名」を記述する型宣言に過ぎません。これは公開されている必要があります。実際にイベントを呼び出すには、OnEventというメソッドを実装します(ここでは、をClickまたはClosedなどと置き換えます)。このメソッドは、クラス内でプライベート(または保護)にする必要があります。

イベントよりも「見えにくい」デリゲートを使用してイベントを宣言することはできません。

2

イベントが属するクラス外のイベントを呼び出すことはできません。あなたのイベントには、+=-=の演算子しか使用できません。クラス内でのみ、イベントを呼び出すことができます。それはイベントと通常のデリゲートの違いです。

public Data 
{ 
    public event EventHandler OnSave 
    public EventHandler OnLoad; 

    private void Load() 
    { 
     if (OnLoad!=null) OnLoad(); 
     //other operations 
    } 
    private void Save() 
    { 
     if (OnSave!=null) OnSave(); 
     //other operations 
    } 
} 

とクラス外:それはある

Data data = new Data(); 
data.OnLoad += (s,e) => {}; 
data.OnSave += (s,e) => {}; 
data.OnLoad = (s,e)=>{}; 
//data.OnSave = (s,e)=>{}; //invalid 
data.OnLoad(); 
//data.OnSave(); //invalid 
1

一つ、それを行う方法:

代わりの公開イベント、手動でご希望のデリゲートをサブスクライブします方法、およびストアを作成します`private List _delegates 'フィールドに追加します。

次に、「内側」から、望むときにそれぞれを呼び出します。

public class Framework 
{ 
    public delegate void Method(); 
    public void AttachEvent(Method M) 
    { 
     _methods.Add(M); 
    } 
    private List<Method> _methods; 
    private FireMethods() 
    { 
     _methods.Foreach(x=>x.Invoke()); 
    } 
} 

それとも、あなたは彼らが公にInvoke() -ableではありませんイベントの特徴「デザインによって」受け入れることができます。

は:)

+1

あなたはちょうど存在しない問題を解決しました;) –

+0

ええ、私は他の投稿を見ました - まあ、時にはあなたは無意味な行為をしなければなりません:) –

1

問題があり、誰でも真実ではありません、私のビジネスコード

で、私のハンドラを呼び出します(その後、イベントを発生させる)ことができます。 (-=)(+=)外部コードはイベントで行うことができます唯一の事は、それに加入している

public event FooEventHandler Foo; 

、またはそれからの退会:あなたは次のようにイベントを宣言します。コンパイラによってプライベートフィールドとして生成された実際のデリゲートにはアクセスできません。つまり、このコードは無効になります。

SomeClass x = new SomeClass(); 
x.Foo(x, new FooEventArgs()); // compilation error here 

イベントは実際には一対のメソッド(追加と削除)であることを忘れないでください。あなたが見ることができるように

private FooEventHandler _foo; 

public event FooEventHandler Foo 
{ 
    add { _foo += value; } 
    remove { _foo -= value; } 
} 

(生成されたコードは、スレッドの安全性を確保するために、いくつかのロックで、実際にはもう少し複雑です)

_fooフィールド:コンパイラは、これらの線に沿って何かにイベント宣言を書き換えプライベートなので、クライアントコードはアクセスできません。イベントのaddremoveアクセサのみアクセスできます。

+0

Merci Thomas :) –

+0

Tiens、tu es le Arnaud F 。de Developpez.com? –

関連する問題