与匿名方法一样,我宣布使用“delegate”关键字的代表是匿名代表吗?
namespace Test
{
public delegate void MyDelegate();
class Program
{
static void Main(string[] args)
{
DelegateTest tst = new DelegateTest();
tst.Chaining();
Console.ReadKey(true);
}
}
class DelegateTest
{
public event MyDelegate del;
public void Chaining()
{
del += delegate { Console.WriteLine("Hello World"); };
del += delegate { Console.WriteLine("Good Things"); };
del += delegate { Console.WriteLine("Wonderful World"); };
del();
}
}
}
答案 0 :(得分:23)
没有“匿名委托”这样的东西(或者更确切地说,这不是C#规范中的公认术语,或者我所知道的任何其他与.NET相关的规范)。
有匿名函数,包括匿名方法和lambda表达式。
您的代码显示了简单的旧匿名方法 - 尽管 使用一个功能,但lambda表达式没有:当您不关心它们时,根本不能表达参数。
答案 1 :(得分:19)
示例中的委托集合指向了许多匿名方法。委托是“只是方法指针”。如果它指向真实方法或匿名方法并不重要。
请参阅http://msdn.microsoft.com/en-us/library/0yw3tz5k(VS.80).aspx
答案 2 :(得分:4)
这是正确的,您已为事件分配了许多匿名方法。
如果你使用的是较新版本的c#,你也可以使用lambdas做类似的事情。例如:
class DelegateTest
{
public event Action del;
public void Chaining()
{
del += () => Console.WriteLine("Hello World");
del += () => Console.WriteLine("Good Things");
del += () => Console.WriteLine("Wonderful World");
del();
}
}
答案 3 :(得分:2)
是的,他们是匿名代表(或者更具体地说,delegates calling an anonymous method)。
答案 4 :(得分:2)
是。匿名委托不能直接通过名称引用,因此使用delegate(){}
语法意味着它们是匿名的。
答案 5 :(得分:2)
您的代表不是匿名的。它被称为MyDelegate。 CLR中的委托是一个派生自System.MulticastDelegate的类,在您的情况下,它称为MyDelegate。 你无法直接从MulticastDelegate派生,C#编译器会阻止你。
在将代理分配给del的代码中,代理的类型/名称由编译器推断,因为您将del声明为MyDelegate类型的事件。
答案 6 :(得分:1)
他们是匿名方法的代表。这是制作匿名方法的一种方法,自.NET 2.0以来就可以使用。使用.NET 3.0,您还可以使用更简单的lambda表达式(但编译为相同的代码)。我想这就是你用“anonymouse方法”的意思。但实际上,它们是同一回事。