2

これに対する答えはデリゲートにあると思いますが、デリゲートの概念を理解するのに苦労しています。主な問題は、私がこれまでに読んだデリゲートのすべての説明と例は、デリゲートなしで達成できる何かを行う方法について常に丸められているため、何も教えてくれないということです. 実世界の例を見て学ぶのが一番です。

それが邪魔にならないようになったので、ここに私が達成したいことがあります。多数のストアド プロシージャを含むデータ コンテキスト (.dbml) があります。また、まったく同じ 20 行のコードを使用してテーブル内の 1 つの列を更新する状況が複数ありますが、異なるデータグリッドを使用する以外の唯一の違いは、ストアド プロシージャが呼び出されることです。使用するコードの量を減らすために、ストアド プロシージャの呼び出しをデータ コンテキスト オブジェクトからパラメーターとして渡す方法が必要でした。そうすれば、すべてのコードを 1 つの再利用可能な関数に移動できます。これは可能ですか?Visual Studio 2008 と C# を使用しています。

ご指導ありがとうございます。

4

1 に答える 1

1

SQL/ストアド プロシージャの側面についてはお手伝いできませんが、少なくとも C# の観点からデリゲートについて説明することはできます。

通常、関数はクラスの一部として宣言します (そのため、関数はクラスに強く関連付けられます) が、変数に入れたい場合もあります。これを行ったら、他の変数の場合と同じように、それを渡すことができます。

したがって、文字列はテキストを挿入する一種の変数であることがわかります。それに続いて、デリゲートは、関数を貼り付ける一種の変数です。ただし、C# はコード内で名前を付ける方法と一貫性がなく、明確でないため、これは非常に紛らわしいものです。観察:

public void WriteText() {
  Console.WriteLine("Hello");
}

...
Action x = WriteText;
x(); // will invoke the WriteText function

ロジックがコードが読み取る必要があることを意味する「アクション」を使用していることに注意してくださいdelegate x = WriteText。この余分な混乱が必要な理由は、「デリゲート」自体がSystem.Object. 情報は含まれておらず、すべての背後にある「基本クラス」のようなものです。実際に使用したい場合は、いくつかの Type 情報を添付する必要があります。ここでAction出番です。 の定義Actionは次のとおりです。

public delegate void Action();

このコードは、「Action という名前の新しいデリゲートを宣言しています。これはパラメーターをとらず、void を返します」と述べています。その後、パラメーターを取らずに void を返す関数がある場合は、それらを type の変数に入れますAction

これで、通常の関数をデリゲートに貼り付けることができますが、「匿名」関数をデリゲートに貼り付けることもできます。「匿名」関数はインラインで宣言するものであるため、既に宣言されている関数をアタッチするのではなく、WriteText次のようにコードの途中で新しい関数を構築できます。

Action x = () => { Console.WriteLine("Hello"); };
x(); // invoke our anonymous function.

これが行っていることは、C# の「ラムダ構文」を使用して新しい無名関数を宣言することです。関数の一部として (関数を呼び出したときに) 実行されるコードはConsole.WriteLine.

それで

すべてをまとめるには、「SaveData」関数を作成し、デリゲートに渡すことができます。20 行のテーブル構築を行い、そのテーブルをデリゲートに渡すと、デリゲートは適切なストアド プロシージャを呼び出すことができます。簡単な例を次に示します。

public void SaveData(Action<Table> saveFunc){
    var t = new Table();
    ... 20 lines of code which put stuff into t ...
    saveFunc(t);
}

SaveData( t => StoredProc1.Invoke(t) ); // save using StoredProc1
SaveData( t => StoredProc37.Invoke(t) ); // save using StoredProc37

それで

そのすべてを言った。これは、私が実際に問題を解決する方法ではありません。デリゲートを savedata 関数に渡すよりも、単に SaveData 関数がテーブルを返すようにする方が理にかなっており、デリゲートをまったく必要とせずに適切な StoredProc を呼び出すことができます。

于 2009-02-26T20:17:39.533 に答える