コールバックとは何ですか?どのようにC#で実装されますか?
コールバックとは何ですか?どのようにC#で実装されますか?
回答:
コンピュータプログラミング、コールバックは、実行可能コードとして渡される引数他のコードです。
C#にはそのためのデリゲートがあります。イベントは多くのアタッチされたデリゲート(イベントハンドラー)を自動的に呼び出すことができるので、それらはeventsで頻繁に使用されます。
私はあなたに会ったばかりで
、これはクレイジーですが、
ここに私の番号(代理人)
があり
ます。
コールバックは、特定のタスクを実行するプロセスが完了したときに呼び出される関数です。
コールバックの使用は通常、非同期ロジックです。
C#でコールバックを作成するには、関数のアドレスを変数内に格納する必要があります。これは、delegate
または新しいラムダセマンティックFunc
またはを使用して実現されAction
ます。
public delegate void WorkCompletedCallBack(string result);
public void DoWork(WorkCompletedCallBack callback)
{
callback("Hello world");
}
public void Test()
{
WorkCompletedCallBack callback = TestCallBack; // Notice that I am referencing a method without its parameter
DoWork(callback);
}
public void TestCallBack(string result)
{
Console.WriteLine(result);
}
今日のC#では、これは次のようなラムダを使用して行うことができます。
public void DoWork(Action<string> callback)
{
callback("Hello world");
}
public void Test()
{
DoWork((result) => Console.WriteLine(result));
}
コールバックは、他のコードに引数として渡される実行可能なコードです。
// Parent can Read
public class Parent
{
public string Read(){ /*reads here*/ };
}
// Child need Info
public class Child
{
private string information;
// declare a Delegate
delegate string GetInfo();
// use an instance of the declared Delegate
public GetInfo GetMeInformation;
public void ObtainInfo()
{
// Child will use the Parent capabilities via the Delegate
information = GetMeInformation();
}
}
Parent Peter = new Parent();
Child Johny = new Child();
// Tell Johny from where to obtain info
Johny.GetMeInformation = Peter.Read;
Johny.ObtainInfo(); // here Johny 'asks' Peter to read
リンク集
ASP.Netコールバックを参照する場合:
ASP.NET Webページの既定のモデルでは、ユーザーはページを操作してボタンをクリックするか、ポストバックが発生するその他のアクションを実行します。ページとそのコントロールが再作成され、ページコードがサーバーで実行され、新しいバージョンのページがブラウザーにレンダリングされます。ただし、場合によっては、ポストバックを実行せずにクライアントからサーバーコードを実行すると便利です。ページ内のクライアントスクリプトが状態情報(ローカル変数値など)を保持している場合、ページをポストして新しいコピーを取得すると、その状態が破壊されます。さらに、ページポストバックにより、処理のオーバーヘッドが発生し、パフォーマンスが低下し、ユーザーがページが処理されて再作成されるのを待たなければなりません。
クライアントの状態が失われないようにし、サーバーのラウンドトリップの処理オーバーヘッドが発生しないようにするには、ASP.NET Webページをコーディングして、クライアントのコールバックを実行できるようにします。クライアントコールバックでは、クライアントスクリプト関数がASP.NET Webページにリクエストを送信します。Webページは、通常のライフサイクルの変更されたバージョンを実行します。ページが開始され、そのコントロールと他のメンバーが作成され、特別にマークされたメソッドが呼び出されます。このメソッドは、コーディングした処理を実行してから、別のクライアントスクリプト関数で読み取ることができる値をブラウザーに返します。このプロセス全体を通じて、ページはブラウザに表示されます。
ソース:http : //msdn.microsoft.com/en-us/library/ms178208.aspx
コードでコールバックを参照している場合:
多くの場合、コールバックは、特定の操作が完了したとき、またはサブアクションを実行したときに呼び出されるメソッドのデリゲートです。非同期操作でよく見かけます。これは、ほとんどすべてのコーディング言語で見つかるプログラミングの原則です。
詳細はこちら:http : //msdn.microsoft.com/en-us/library/ms173172.aspx
LightStrikerへの献身:
サンプルコード:
class CallBackExample
{
public delegate void MyNumber();
public static void CallMeBack()
{
Console.WriteLine("He/She is calling you. Pick your phone!:)");
Console.Read();
}
public static void MetYourCrush(MyNumber number)
{
int j;
Console.WriteLine("is she/he interested 0/1?:");
var i = Console.ReadLine();
if (int.TryParse(i, out j))
{
var interested = (j == 0) ? false : true;
if (interested)//event
{
//call his/her number
number();
}
else
{
Console.WriteLine("Nothing happened! :(");
Console.Read();
}
}
}
static void Main(string[] args)
{
MyNumber number = Program.CallMeBack;
Console.WriteLine("You have just met your crush and given your number");
MetYourCrush(number);
Console.Read();
Console.Read();
}
}
コードの説明:
上記の返信の1つで、LightStrikerによって提供された面白い説明を実装するコードを作成しました。デリゲート(数値)をメソッド(MetYourCrush
)に渡します。メソッド(MetYourCrush
)でInterest(イベント)が発生すると、メソッドの参照を保持していたデリゲート(番号)が呼び出されますCallMeBack
。したがって、CallMeBack
メソッドが呼び出されます。基本的に、コールバックメソッドを呼び出すためにデリゲートを渡します。
ご不明な点がありましたらお知らせください。
おそらくディクショナリ定義ではありませんが、コールバックは通常、特定のオブジェクトの外部にある関数を参照し、保存されてから特定のイベントで呼び出されます。
たとえば、UIボタンが作成されたときに、アクションを実行する関数への参照が格納されます。アクションはコードの別の部分で処理されますが、ボタンが押されるとコールバックが呼び出され、アクションを呼び出して実行します。
C#では、「コールバック」という用語を使用するのではなく、「イベント」と「デリゲート」を使用します。デリゲートについて詳しくは、こちらをご覧ください。
コールバックの作業手順:
1)ICallbackEventHandler
インターフェイスを実装する必要があります
2)クライアントスクリプトを登録します。
String cbReference = Page.ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context");
String callbackScript = "function UseCallBack(arg, context)" + "{ " + cbReference + ";}";
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "UseCallBack", callbackScript, true);
1)EXのUI呼び出しOnclientクリック呼び出しJavaScript関数から: builpopup(p1,p2,p3...)
var finalfield = p1、p2、p3;
UseCallBack(finalfield, "");
UseCallBackを使用してサーバー側に渡されるクライアントからのデータ
2) public void RaiseCallbackEvent(string eventArgument)
eventArgumentで、渡されたデータを取得します//サーバー側の操作を実行し、「callbackResult」に渡されます
3) GetCallbackResult()
//このメソッドを使用すると、データがclient(ReceiveServerData()関数)側に渡されます
callbackResult
4)クライアント側でデータを
ReceiveServerData(text)
取得します。テキストサーバーレスポンスでは、取得します。
デリゲートは、C ++のインターフェイスベースのコールバックと同じことを行います(COMはこれらを使用します)が、はるかに簡単に使用できます。
MicrosoftはデリゲートをそのJava実装(J ++)に入れましたが、Sunはデリゲートを好みません[java.sun.com]ので、Javaの公式バージョンですぐに見られるとは期待しないでください。私はプリプロセッサーをハッキングしてC ++で使用できるようにしたので、C#や.NETプラットフォーム(つまり、Managed C ++またはVisual Basic.NET)でプログラミングしていない場合でも見落とされないでください。
Cでポインターを関数化するのに慣れている場合、デリゲートは基本的に1つのポインターのペアが1つにまとめられたものです。
つまり、静的メソッドであるか、オブジェクトに関連付けられているかに関係なく、1つのデリゲートがプログラム内の関数を見つけるために必要なすべての情報を渡します。
C#で次のように定義します。
public delegate void FooCallbackType( int a, int b, int c );
それらを使用する場合は、呼び出す関数からデリゲートを作成します。
class CMyClass
{
public void FunctionToCall( int a, int b, int c )
{
// This is the callback
}
public void Foo()
{
FooCallbackType myDelegate = new FooCallbackType(
this.FunctionToCall );
// Now you can pass that to the function
// that needs to call you back.
}
}
デリゲートが静的メソッドを指すようにしたい場合は、同じように見えます。
class CMyClassWithStaticCallback
{
public static void StaticFunctionToCall( int a, int b, int c )
{
// This is the callback
}
public static void Foo()
{
FooCallbackType myDelegate = new FooCallbackType(
CMyClass.StaticFunctionToCall );
}
}
全体として、C ++のインターフェイスベースのコールバックと同じことを行いますが、関数の名前付けやヘルパーオブジェクトの作成について心配する必要がなく、メソッドからデリゲートを作成できるため、少し問題が少なくなります。彼らはより柔軟です。