Gọi lại là gì và nó được triển khai như thế nào trong C #?
Gọi lại là gì và nó được triển khai như thế nào trong C #?
Câu trả lời:
Trong lập trình máy tính , một cuộc gọi lại là mã thực thi được truyền dưới dạng đối số cho mã khác.
C # có đại biểu cho mục đích đó. Chúng được sử dụng nhiều với các sự kiện , vì một sự kiện có thể tự động gọi một số đại biểu đính kèm (xử lý sự kiện).
Tôi vừa mới gặp bạn,
Và điều này thật điên rồ,
Nhưng đây là số của tôi (đại biểu),
vậy nếu có chuyện gì xảy ra (sự kiện), hãy
gọi cho tôi, có thể (gọi lại)?
Gọi lại là một chức năng sẽ được gọi khi một quá trình được thực hiện thực hiện một nhiệm vụ cụ thể.
Việc sử dụng một cuộc gọi lại thường là trong logic không đồng bộ.
Để tạo một cuộc gọi lại trong C #, bạn cần lưu trữ một địa chỉ hàm bên trong một biến. Điều này đạt được bằng cách sử dụng một delegate
hoặc ngữ nghĩa lambda mới Func
hoặc 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);
}
Trong C # ngày nay, điều này có thể được thực hiện bằng lambda như:
public void DoWork(Action<string> callback)
{
callback("Hello world");
}
public void Test()
{
DoWork((result) => Console.WriteLine(result));
}
Một cuộc gọi lại là mã thực thi được truyền dưới dạng đối số cho mã khác.
// 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
Liên kết
Một cuộc gọi lại là một con trỏ hàm mà bạn chuyển đến một chức năng khác. Hàm bạn đang gọi sẽ 'gọi lại' (thực thi) chức năng khác khi nó đã hoàn thành.
Kiểm tra liên kết này .
Nếu bạn đề cập đến các cuộc gọi lại ASP.Net:
Trong mô hình mặc định cho các trang Web ASP.NET, người dùng tương tác với một trang và nhấp vào nút hoặc thực hiện một số hành động khác dẫn đến hậu quả. Trang và các điều khiển của nó được tạo lại, mã trang chạy trên máy chủ và một phiên bản mới của trang được hiển thị cho trình duyệt. Tuy nhiên, trong một số trường hợp, rất hữu ích khi chạy mã máy chủ từ máy khách mà không thực hiện việc gửi lại. Nếu tập lệnh máy khách trong trang đang duy trì một số thông tin trạng thái (ví dụ: giá trị biến cục bộ), đăng trang và nhận bản sao mới của nó sẽ phá hủy trạng thái đó. Ngoài ra, postback trang giới thiệu chi phí xử lý có thể làm giảm hiệu suất và buộc người dùng phải chờ trang được xử lý và tạo lại.
Để tránh mất trạng thái máy khách và không phải chịu chi phí xử lý của máy chủ khứ hồi, bạn có thể mã hóa trang web ASP.NET để nó có thể thực hiện các cuộc gọi lại máy khách. Trong một cuộc gọi lại máy khách, một chức năng kịch bản lệnh máy khách sẽ gửi một yêu cầu đến một trang web ASP.NET. Trang web chạy phiên bản sửa đổi của vòng đời bình thường. Trang được bắt đầu và các điều khiển của nó và các thành viên khác được tạo, và sau đó một phương thức được đánh dấu đặc biệt được gọi. Phương thức thực hiện việc xử lý mà bạn đã mã hóa và sau đó trả về một giá trị cho trình duyệt có thể được đọc bởi một hàm script khách hàng khác. Trong suốt quá trình này, trang này nằm trong trình duyệt.
Nguồn: http://msdn.microsoft.com/en-us/l Library / ms178208.aspx
Nếu bạn đang đề cập đến các cuộc gọi lại trong mã:
Các cuộc gọi lại thường được ủy quyền cho các phương thức được gọi khi hoạt động cụ thể đã hoàn thành hoặc thực hiện một hành động phụ. Bạn sẽ thường tìm thấy chúng trong các hoạt động không đồng bộ. Đó là một nguyên tắc lập trình mà bạn có thể tìm thấy trong hầu hết mọi ngôn ngữ mã hóa.
Thêm thông tin ở đây: http://msdn.microsoft.com/en-us/l Library / ms173172.aspx
Cống hiến cho LightStriker:
Mã mẫu:
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();
}
}
Giải thích mã:
Tôi đã tạo mã để thực hiện lời giải thích hài hước do LightStriker cung cấp trong một trong những câu trả lời ở trên. Chúng tôi đang chuyển đại biểu (số) cho một phương thức ( MetYourCrush
). Nếu sự quan tâm (sự kiện) xảy ra trong phương thức ( MetYourCrush
) thì nó sẽ gọi đại biểu (số) đang giữ tham chiếu của CallMeBack
phương thức. Vì vậy, CallMeBack
phương thức sẽ được gọi. Về cơ bản, chúng tôi đang thông qua đại biểu để gọi phương thức gọi lại.
Hãy cho tôi biết nếu bạn có bất cứ thắc mắc nào.
Có lẽ không phải là định nghĩa từ điển, nhưng một cuộc gọi lại thường đề cập đến một chức năng, bên ngoài một đối tượng cụ thể, được lưu trữ và sau đó được gọi theo một sự kiện cụ thể.
Một ví dụ có thể là khi nút UI được tạo, nó lưu tham chiếu đến một chức năng thực hiện một hành động. Hành động được xử lý bởi một phần khác của mã nhưng khi nhấn nút, cuộc gọi lại được gọi và điều này gọi hành động để thực hiện.
C #, thay vì sử dụng thuật ngữ 'gọi lại' sử dụng 'sự kiện' và 'đại biểu' và bạn có thể tìm hiểu thêm về các đại biểu tại đây .
Một cuộc gọi lại cho phép bạn chuyển mã thực thi làm đối số cho mã khác. Trong C và C ++, điều này được thực hiện như một con trỏ hàm. Trong .NET, bạn sẽ sử dụng một ủy nhiệm để quản lý các con trỏ hàm.
Một vài cách sử dụng bao gồm báo hiệu lỗi và kiểm soát xem một chức năng có hoạt động hay không.
các bước làm việc gọi lại:
1) chúng ta phải thực hiện ICallbackEventHandler
Giao diện
2) Đăng ký tập lệnh máy khách:
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) từ cuộc gọi UI Onclient bấm vào chức năng gọi javascript cho EX: - builpopup(p1,p2,p3...)
var Finalfield = p1, p2, p3;
UseCallBack(finalfield, "");
dữ liệu từ máy khách được chuyển đến phía máy chủ bằng cách sử dụng UseCallBack
2) public void RaiseCallbackEvent(string eventArgument)
Trong eventArgument, chúng tôi nhận được dữ liệu đã truyền // thực hiện một số thao tác phía máy chủ và được chuyển đến "callbackResult"
3) GetCallbackResult()
// sử dụng phương thức này, dữ liệu sẽ được chuyển đến phía máy khách (hàm receiveServerData ())
gọi lại
4) Nhận dữ liệu ở phía máy khách :
ReceiveServerData(text)
, trong phản hồi của máy chủ văn bản, chúng tôi sẽ nhận được.
Các đại biểu thực hiện tương tự như các cuộc gọi lại dựa trên giao diện trong C ++ (COM sử dụng các lệnh này), mặc dù sử dụng đơn giản hơn nhiều.
Lưu ý rằng Microsoft đưa các đại biểu vào triển khai Java (J ++) nhưng Sun không thích họ [java.sun.com] vì vậy đừng mong đợi được gặp họ trong phiên bản chính thức của Java bất cứ lúc nào. Tôi đã hack cùng một bộ tiền xử lý để cho phép bạn sử dụng chúng trong C ++, vì vậy đừng cảm thấy bị bỏ rơi nếu bạn không lập trình trong C # hoặc trên nền tảng .NET (tức là trong Managed C ++ hoặc Visual Basic.NET).
Nếu bạn đã sử dụng chức năng con trỏ trong C, đại biểu về cơ bản là một cặp con trỏ được cuộn thành một:
Điều đó có nghĩa là một đại biểu duy nhất chuyển tất cả thông tin cần thiết để định vị một chức năng trong chương trình của bạn, cho dù đó là phương thức tĩnh hay được liên kết với một đối tượng.
Bạn định nghĩa chúng như thế này trong C #:
public delegate void FooCallbackType( int a, int b, int c );
Khi bạn muốn sử dụng chúng, bạn thực hiện ủy nhiệm ngoài chức năng bạn muốn gọi:
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.
}
}
Nếu bạn muốn tạo một đại biểu để trỏ đến một phương thức tĩnh, nó chỉ trông giống như sau:
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 );
}
}
Nói chung, chúng thực hiện tương tự như các cuộc gọi lại dựa trên giao diện trong C ++, nhưng gây ra một chút rắc rối vì bạn không cần phải lo lắng về việc đặt tên các chức năng của mình hoặc tạo các đối tượng trợ giúp và bạn có thể tạo ra các đại biểu từ bất kỳ phương thức nào. Chúng linh hoạt hơn.