说说c#代表

时间:2017-04-19 23:00:45

标签: c# delegates

我现在通过这个视频了解了代表:https://www.youtube.com/watch?v=0nd-tcQcslc&list=PLdbkZkVDyKZVvizO94tJNmTfRzXWGDFZ3&index=2

当他谈到代表时,跟随他作为初学者是非常困惑的,因为他确实将这个词用于两个不同的事情。

他确实将它用于例如Func<T, ..., Tresult> //他确实称这个代表为

delegate(Person p) { return p.ToString(); } //他也将此称为代理人(匿名代表)

谈论代表的正确方法是什么? 我很确定第二个叫做anonymus函数/方法,委托关键字是ony语法,我也认为第一个应该在委托代表谈论委托时引用。

2 个答案:

答案 0 :(得分:0)

Func<T>及其通用的“重载”最准确地说是通用命名委托类型。它们本身并不是“匿名”,但它们可以从与委托类型的方法签名(参数的数量和类型以及返回类型)匹配的匿名委托中分配。 FuncActionComparisonPredicate等类型被命名为委托类型,就像您自己声明的任何自定义委托类型一样,例如对于事件处理程序。< / p>

至少在开始时,区分“委托”和“委托类型”非常重要。委托类型是委托代表在讨论代码中的“对象”时类的实例。类型是定义,实际委托是委托类型的特定实例。

语法delegate(int a){...}是“匿名委托”的原始语法,也就是“函数文字”,在看起来更干净的“lambda语句”(a => ...)成为事物之前。 Lambda语句是匿名委托的一种形式,两种格式是1:1可互换的。这些中的任何一个,以及任何命名方法,也可以被指定为“命名委托”的实例,这是C#指定“函数变量”的原始方式,这是委托在C#中实现的基本概念。 / p>

答案 1 :(得分:0)

  

谈论代表的正确方法是什么?

可以说,可能是一个意见问题。但是,C#规范很明确:

  • “委托”是“委托类型”的实例。也就是说,使用System.Delegate声明的类型的实例,继承了基类 client.on("joinRoom", function(id) { var room = rooms[id]; if (client.id === room.owner) { client.emit("update", "You are the owner of this room and you have already been joined."); } else { room.people.contains(client.id, function(found) { if (found) { client.emit("update", "You have already joined this room."); } else { if (people[client.id].inroom !== null) { //make sure that one person joins one room at a time console.log("User is already in a room"); client.emit("update", "You are already in a room ("+rooms[people[client.id].inroom].name+"), please leave it first to join another room."); } else { room.addPerson(client.id); people[client.id].inroom = id; client.room = room.name; client.join(client.room); //add person to the room user = people[client.id]; socket.sockets.in(client.room).emit("update", user.name + " has connected to " + room.name + " room."); client.emit("update", "Welcome to " + room.name + "."); client.emit("sendRoomID", {id: id}); } } }); } });
  • 没有“委托方法”这样的东西。该短语甚至没有出现在C#语言规范中。相反,你的导师(即视频中的人)称之为“委托方法”,实际上是一种匿名方法(这本身就是一种匿名函数 ...另一种声明匿名函数的方法是使用lambda表达式。)

来自C#5语言规范:

  

委托类型表示对具有特定参数列表和返回类型的方法的引用。委托使得可以将方法视为可以分配给变量并作为参数传递的实体。委托类似于在其他一些语言中找到的函数指针的概念,但与函数指针不同,委托是面向对象的,类型安全的。

请注意,在其他语言(例如Objective-C)的上下文中,术语“委托”具有更常规的含义,与C#上下文中的精确用法略有不同。当然,即使在C#的上下文中,您也会发现人们使用不精确的术语来描述例如委托实例的目标方法,而不是委托实例本身。