这个c#语法是什么意思?

3

你好,我在理解这种语法方面遇到了一些小问题。

public delegate void DelegateType();
BeginInvoke(new DelegateType(functionName));

有人能告诉我new DelegateType(functionName)的确切含义吗?为什么我需要使用new关键字?
4个回答

6
请查看文档
委托是一种保存方法的类型。您正在创建一个指向现有方法的委托类型的新实例。
C#2添加了从方法组到任何匹配委托类型的隐式转换。但是,由于BeginInvoke 不采用特定的委托类型(例如System.Action ),因此您始终需要显式地创建委托实例。

1

第一条语句声明了一个委托类型,第二条语句实例化了一个新的DelegateType委托。

从相应的MSDN文章中(阅读文章以获取更多信息!):

一旦声明了委托类型,就必须创建一个委托对象并将其与特定方法关联。像所有其他对象一样,使用new表达式创建一个新的委托对象。但是,在创建委托时,传递给new表达式的参数是特殊的-它写得像对方法的调用,但没有方法的参数。


1
 public delegate void DelegateType();

这定义了委托的语法。这是对一个方法的引用,可以是静态方法或实例方法。

当您调用BeginInvoke时,将委托作为参数传递。C#编译器将从任何显式委托类型转换为System.Delegate,但由于参数被定义为接受任何委托(通过System.Delegate),因此必须明确定义类型。

当您指定:

new DelegateType(functionName)

您正在创建一个特定类型(DelegateType)的委托,然后将其传递给函数。

通常,较新的API将使用已知类型,如System.Action(其语法与您的DelegateType相同)。如果方法需要一个“Action”,则您不需要上面的定义,可以这样做:

CallMethodTakingAction(functionName);

很好的回答,您能告诉我内存是如何分配的吗?我猜编译器为委托分配内存,这样对吗? - Sandeep
@Sandeep:唯一真正的内存分配是为委托本身分配的,它只是一个引用。这是非常小的内存量。 - Reed Copsey

0
“DelegateType”只是一种类型的东西,所以像任何其他类型一样,如果你想说“这是该类型的一个实例”,你需要使用“new”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接