c#委托教程工作

本文关键字:工作 教程 | 更新日期: 2023-09-27 18:02:27

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

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

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

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是如何在这里工作的?我知道这不是任何代码的错误,但我想更多地了解委托是如何工作的?检查listofHandlersnull是扔我…

c#委托教程工作

定义委托

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

定义一个委托类型,该委托类型可以指向一个以(int, string)为参数类型并返回string的方法。

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

MyHandler myhandler;

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

创建新委托

给定一个方法:

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

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

myHandler = new MyHandler(X);

或者,由于语法糖,您可以使用以下更短的语法:

myHandler = X;

调用委托

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

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

为什么代表?

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

空检查是因为您可能没有listofHandlers,如果您没有,它将是null。就像调用值为null的类的方法是非法的一样,调用值为null的委托也是不允许的。

委托提供了一种抽象方法调用的方法。在Java中,你使用一个接口来定义一个方法,c#只允许你直接使用委托。

listOfHandlers就像一个引用变量,除了方法之外。

现在你不想调用listOfHandlers包含的任何方法,如果它甚至不包含一个方法,所以你先检查确保它不是null

一个null委托是一个委托,还没有为它定义一个方法

委托是。net中的一种引用类型,像所有其他引用类型一样,初始化值为nullnull检查只是看它是否已经初始化为一个值。如果没有监听器,那么调用委托

就没有什么可报告的