gpt4 book ai didi

C# 委托(delegate)教程工作

转载 作者:行者123 更新时间:2023-11-30 13:38:43 25 4
gpt4 key购买 nike

我以前没有使用过委托(delegate),我正在尝试按照我书中的教程弄清楚它们。

到目前为止,我已经了解到委托(delegate)可以与类的方法一起使用,这些方法返回相同类型的对象,并且重载了与进行调用的委托(delegate)相同的对象(如果我错了,请纠正我).

在我正在编写的教程中,将以下代码添加到汽车类:

public delegate void CarEngineHandler(string msgForCaller);

private CarEngineHandler listOfHandlers;

public void RegisterWithCarEngine(CarEngineHandler methodToCall)
{
listOfHandlers = methodToCall;
}

在控制台应用程序的 Main 中调用以下代码:

static void Main(string[] args)
{
Car c1 = new Car("Slugbug", 100, 10);

c1.RegisterWithCarEngine(new Car.CarEngineHandler(OnCarEngineEvent));

Console.WriteLine("**** Speeding Up ******");
for (int i = 0; i < 6; i++)
c1.Accelerate(20);
Console.ReadLine();
}

public static void OnCarEngineEvent(string msg)
{
Console.WriteLine("\n***** Message From Car Object *****");
Console.WriteLine("=> {0}", msg);
Console.WriteLine("*************************************\n");
}

这是 Accelerate 方法:

public void Accelerate(int delta)
{
if (carIsDead)
{
if (listOfHandlers != null)
listOfHandlers("Sorry, this car is dead...");
}
else
{
CurrentSpeed += delta;

if (10 == (MaxSpeed - CurrentSpeed) && listOfHandlers != null)
{
listOfHandlers("Careful buddy! Gunna Blow!");
}
}

if (CurrentSpeed >= MaxSpeed)
carIsDead = true;
else
Console.WriteLine("CurrentSpeed = {0}", CurrentSpeed);
}

我对 listofHandlers 在这里的实际工作方式感到困惑?我知道这不是任何代码的错误,但我想更多地了解委托(delegate)的实际工作方式?检查 listofHandlers 是否为 null 让我失望了...

最佳答案

定义委托(delegate)

在 C# 中,您可以创建指向方法的指针。这样的指针称为 Delegate。委托(delegate)只是一个带有方法的普通对象。它只能指向具有匹配参数类型和匹配返回类型的方法。

delegate string MyHandler(int value1, string value2);

Defines a delegate type that can point to a method that has (int, string) as the parameter types and returns a string.

您可以将这样的委托(delegate)(指向方法的指针)存储在字段中。

MyHandler myhandler;

这个委托(delegate)只是一个对象,所以像任何对象一样,它可以是null

创建一个新委托(delegate)

给定一个方法:

string X(int v1, string v2) { /* ... */ }

您可以创建一个指向该方法的新委托(delegate):

myHandler = new MyHandler(X);

或者,多亏了语法糖,你可以使用这个更短的语法:

myHandler = X;

调用委托(delegate)

在以后的任何时候,您都可以调用委托(delegate)指向的方法。

int i = 10;
string s = String.Empty;
string result = myHandler.Invoke(i, s);

或者,再次感谢语法糖:

int i = 10;
string s = String.Empty;
string result = myHandler(i, s);

当然,myHandler 可以是 null,因此您需要先检查它,否则您将得到一个 NullReferenceException。毕竟,您不能在 null 上调用实例方法。

myHandler = null;
myHandler.Invoke(10, "");

因此,他们会检查:

string result;
if (myHandler != null)
result = myHandler(i, s);

或者几乎等效,在 C# 6 中:(请注意,当 myHandlernull 时,result 将为 null .)

string result = myHandler?.Invoke(i, s);

为什么要委托(delegate)?

如果你想使用相同的代码调用不同的方法,你可以传递一个指向要调用的方法的委托(delegate)作为对象中的参数或字段。这就是事件在 .NET 中的实现方式,也是 LINQ 起作用的原因。

关于C# 委托(delegate)教程工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15228785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com