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
是如何在这里工作的?我知道这不是任何代码的错误,但我想更多地了解委托是如何工作的?检查listofHandlers
是null
是扔我…
定义委托
在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中:(注意,当myHandler
是null
时,result
将是null
)
string result = myHandler?.Invoke(i, s);
为什么代表?
如果您想使用相同的代码调用不同的方法,您可以传递一个委托,该委托指向要调用的方法,作为对象中的参数或字段。这就是。net中事件的实现方式,也是LINQ工作的原因。
空检查是因为您可能没有listofHandlers
,如果您没有,它将是null
。就像调用值为null
的类的方法是非法的一样,调用值为null
的委托也是不允许的。
listOfHandlers
就像一个引用变量,除了方法之外。
现在你不想调用listOfHandlers
包含的任何方法,如果它甚至不包含一个方法,所以你先检查确保它不是null
。
一个null
委托是一个委托,还没有为它定义一个方法
委托是。net中的一种引用类型,像所有其他引用类型一样,初始化值为null
。null
检查只是看它是否已经初始化为一个值。如果没有监听器,那么调用委托