コールバックとは何ですか?


139

コールバックとは何ですか?どのようにC#で実装されますか?


ASP.Netコールバックまたはデリゲートコールバックパラメーターを参照していますか?
SLaks

8
それは多くのことを意味する可能性があります-あなたはそれをどのような文脈で聞いたことがありますか?
UpTheCreek

1
彼は非同期について話していると思います。コールバック
ジョージジョンストン

8
-1質問が不明確である(詳細が不十分)。
serhio

1
あなたは決定的な質問のためにグーグルに尋ねるべきです。
Ozgur Dogus

回答:


123

コンピュータプログラミング、コールバックは、実行可能コードとして渡される引数他のコードです。

ウィキペディア:コールバック(コンピューターサイエンス)

C#にはそのためのデリゲートがあります。イベントは多くのアタッチされたデリゲート(イベントハンドラー)を自動的に呼び出すことができるので、それらはeventsで頻繁に使用されます


10
実際には、コールバックは、他のコードへの引数として渡される実行可能コードへのポインターです...ページはレビューが必要です
Gianluca Ghettini

8
@G_G:ポインタでなければならないということは何もありません。これは通常、データセグメントが実行可能ではないためですが、技術的には実装の詳細です。
ジョーイ

Joey:そうです、実装の詳細ですが、コールバックも実装の詳細です。単一のコールバックを使用せずにコードを書き直すことができます。「while」と「for」のようなものです。
ジャンルカゲッティーニ2014

1053

私はあなたに会ったばかりで
、これはクレイジーですが、
ここに私の番号(代理人)
があり
ます。


33
完全にクールな説明。私は誰かが尋ねるときはいつでもこの説明を使います、私がそれを使う権利を得ることができることを望みますか?
ニコラダビド

15
+1:大好きです。それは歌を台無しに、それは読んでください`しかし、ここで私の電話番号と電話(代表者)の特定のタイプを使用するための指示」だ
ゴーンコーディング

8
笑顔でデリゲートを学びましょう:-)
Aakash 2013年

8
史上最高の説明!
zhengtonic 2014

3
その説明を他の人にデリゲートを教えることだけで良いの振り付けで動作すること:)注
セバスチャン・Sevrin

87

コールバックは、特定のタスクを実行するプロセスが完了したときに呼び出される関数です。

コールバックの使用は通常、非同期ロジックです。

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));
    }

49

定義

コールバックは、他のコードに引数として渡される実行可能なコードです。

実装

// 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

リンク集


2
こんにちは@serhio回答ありがとうございます。それはまだ私には少しあいまいです:正確にコードが引数として他のコードに渡される場所は、Peter.Readメソッドを子のデリゲートに追加しているように見えますか?
BKSpurgeon

1
@serhioリンクが死んでいる。
ジュード

10

コールバックは、別の関数に渡す関数ポインターです。呼び出している関数は、完了時に他の関数を「コールバック」(実行)します。

このリンクをチェックしください。


2
コールバックはメソッドへのデリゲートとして実装できますが、そのインターフェイスでコールバックメソッドをサポートするオブジェクトを渡すことはコールバックであると言うこともできます。
Joe

Array.Sort(arrayObject); arrayObjectの要素でobj.CompareTo(anotherObj)を呼び出すことは、.Netのインターフェイス(ICompareable)を使用したコールバックの典型的な例です。
Ron5504

8

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


4

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メソッドが呼び出されます。基本的に、コールバックメソッドを呼び出すためにデリゲートを渡します。

ご不明な点がありましたらお知らせください。


これは質問に十分に答えることができません。コードが何をしているか、コールバックがどのように機能するか、C#でどのように実装されているかを説明できますか。
アダム

こんにちはアダム、返信ありがとうございます。LightStrikerが提供する面白い説明を実装するコードを作成しました。デリゲート(数値)をメソッド(MetYourCrush)に渡します。Interest(イベント)がメソッド(MetYourCrush)で発生した場合、CallMeBackメソッドの参照を保持していたデリゲート(番号)を呼び出します。したがって、CallMeBackメソッドが呼び出されます。基本的に、コールバックメソッドを呼び出すためにデリゲートを渡します。ご不明な点がありましたらお知らせください。
マニ

1

おそらくディクショナリ定義ではありませんが、コールバックは通常、特定のオブジェクトの外部にある関数を参照し、保存されてから特定のイベントで呼び出されます。

たとえば、UIボタンが作成されたときに、アクションを実行する関数への参照が格納されます。アクションはコードの別の部分で処理されますが、ボタンが押されるとコールバックが呼び出され、アクションを呼び出して実行します。

C#では、「コールバック」という用語を使用するのではなく、「イベント」と「デリゲート」を使用します。デリゲートについて詳しくは、こちらをご覧ください


0

コールバックを使用すると、実行可能コードを引数として他のコードに渡すことができます。CおよびC ++では、これは関数ポインターとして実装されます。.NETでは、デリゲートを使用して関数ポインタを管理します。

いくつかの用途には、エラーの通知や、機能が動作するかどうかの制御などがあります。

ウィキペディア


0

コールバックの作業手順:

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) 取得します。テキストサーバーレスポンスでは、取得します。


0

デリゲートは、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 ++のインターフェイスベースのコールバックと同じことを行いますが、関数の名前付けやヘルパーオブジェクトの作成について心配する必要がなく、メソッドからデリゲートを作成できるため、少し問題が少なくなります。彼らはより柔軟です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.