Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 委托职能_C#_Delegates_Func - Fatal编程技术网

C# 委托职能

C# 委托职能,c#,delegates,func,C#,Delegates,Func,我遇到了一行我似乎无法理解的代码 让我解释一下 我所理解的是,通过下面的一行,我定义了一种名为“myDelegate”的委托类型。此类型可以保存指向签名为int(int,int)的函数的指针 我没有得到的是下面这行: public delegate T Func<T>(T a, T b); 公共委托T函数(ta,tb); 我的意思是,为什么我要定义一个名为Func的类型,而这个类型已经在.NET framework中定义了?好吧,当框架中有一个具有相同名称和数量的泛型类型参数的委

我遇到了一行我似乎无法理解的代码

让我解释一下

我所理解的是,通过下面的一行,我定义了一种名为“myDelegate”的委托类型。此类型可以保存指向签名为int(int,int)的函数的指针

我没有得到的是下面这行:

public delegate T Func<T>(T a, T b);
公共委托T函数(ta,tb);

我的意思是,为什么我要定义一个名为Func的类型,而这个类型已经在.NET framework中定义了?

好吧,当框架中有一个具有相同名称和数量的泛型类型参数的委托可用时,声明自己的委托显然是个坏主意,但它不是无效的。我建议,如果这是您自己的代码,您可以适当地重命名它。请注意,它与
Func
不同,因为它对输入和输出都使用
T
。您可能希望调用它
BinaryOperator
或类似的名称(尽管二进制运算符不必具有相同的操作数类型,也不必具有相同的返回值类型)。

,当框架中有一个具有相同名称和数量的泛型类型参数的委托时,声明自己的委托显然是个坏主意,但它不是无效的。我建议,如果这是您自己的代码,您可以适当地重命名它。请注意,它与
Func
不同,因为它对输入和输出都使用
T
。您可能希望将其称为
BinaryOperator
或类似的名称(尽管二进制运算符不必具有相同的操作数类型,返回值也不必具有相同的类型)。

Func语法是为了方便起见而存在的,通常最好对它们提供的IMHO进行标准化


Func和Action既方便又容易记住。相比之下,我发现委托语法有点笨拙。

Func语法是为了方便起见而存在的,通常最好将它们提供的IMHO标准化

Func和Action既方便又容易记住。相比之下,我发现委托语法有点笨拙。

与.NET
Func
不同:

T Func<T>();
T2 Func<T1, T2>(T1 arg);
T3 Func<T1, T2, T3>(T1 arg1, T2 arg2);
.. etc
T Func();
T2-Func(T1-arg);
T3功能(T1 arg1,T2 arg2);
.. 等
委托定义没有错误,是命名会与.NET版本混淆。

与.NET
函数不同:

T Func<T>();
T2 Func<T1, T2>(T1 arg);
T3 Func<T1, T2, T3>(T1 arg1, T2 arg2);
.. etc
T Func();
T2-Func(T1-arg);
T3功能(T1 arg1,T2 arg2);
.. 等

委托定义没有错,它的命名会与.NET版本混淆。

此外,由于OP说他们“遇到了这段代码”,我想它可能是在.NET 3.5引入
System.Func
之前编写的。@Sven:True。我总是忘记.NET2中存在哪些
Action
Func
重载。只是
Action
Action
出现在.NET2.0中
Action
(非泛型)和
Func
(及其泛型重载)不是。可能有人试图“扩展”框架中可用的泛型委托。我知道这不是一个好主意,但如果我用[var]替换Func,这也是一个保留字,它也可以工作,但如果我用[int]替换Func或者[尽管]它不起作用。你能解释一下吗?另外,因为OP说他们“遇到了这段代码”,我想这可能是在.Net 3.5引入
System.Func
之前编写的。@Sven:True。我总是忘记.NET2中存在哪些
Action
Func
重载。只是
Action
Action
出现在.NET2.0中
Action
(非泛型)和
Func
(及其泛型重载)不是。可能有人试图“扩展”框架中可用的泛型委托。我知道这不是一个好主意,但如果我用[var]替换Func,这也是一个保留字,它也可以工作,但如果我用[int]替换Func或者[尽管]它不起作用。你能解释一下吗?
Func
不是“语法”——它只是一系列框架提供的委托。当你说“发现委托语法有点笨拙”时,你是指声明新委托类型的语法吗?是的,这就是我的意思。只是我更喜欢看到他们这样表达。不,这不是C#语法,但您可以将提供的委托合并到您的样式中。不过,您的区别很有用。
Func
不是“语法”——它只是一系列框架提供的委托。当你说“发现委托语法有点笨拙”时,你是指声明新委托类型的语法吗?是的,这就是我的意思。只是我更喜欢看到他们这样表达。不,这不是C#语法,但您可以将提供的委托合并到您的样式中。不过你的区别很有用。