GVKun编程网logo

C#Polymorphysm:重载函数,接受委托Action和Func?(c#中的重载)

22

如果您想了解C#Polymorphysm:重载函数,接受委托Action和Func?的相关知识,那么本文是一篇不可错过的文章,我们将对c#中的重载进行全面详尽的解释,并且为您提供关于Action和Fu

如果您想了解C#Polymorphysm:重载函数,接受委托Action和Func?的相关知识,那么本文是一篇不可错过的文章,我们将对c#中的重载进行全面详尽的解释,并且为您提供关于Action和Func、Asp.Net中的Action和Func委托实现、c – std :: optional和polymorphism、c# – 是否可以重载具有相同名称的Func和Func?的有价值的信息。

本文目录一览:

C#Polymorphysm:重载函数,接受委托Action和Func?(c#中的重载)

C#Polymorphysm:重载函数,接受委托Action和Func?(c#中的重载)

这是一个简单的代码,我尝试实现某种多态性.

您可以看到重载的Invoker函数,接受Func< T,R>和动作< T>作为一个论点.

如果使用Invoker方法,编译器说由于模糊不清而无法编译:

class Program
{
    static void Invoker(Action<XDocument> parser)
    {
    }

    static void Invoker(Func<XDocument,string> parser)
    {
    }

    static void Main(string[] args)
    {
        Invoker(Action);
        Invoker(Function);
    }

    static void Action(XDocument x)
    {
    }

    static string Function(XDocument x)
    {
        return "";
    }
}

我得到3(!)错误,但我无法解释.他们来了:

Error 1 The call is ambiguous between the following methods or properties: ‘ConsoleApplication3.Program.Invoker(System.Action)’ and ‘ConsoleApplication3.Program.Invoker(System.Func)’ c:\users\i.smagin\documents\visual studio 2010\Projects\ConsoleApplication3\ConsoleApplication3\Program.cs 21 4 ConsoleApplication3

Error 2 The call is ambiguous between the following methods or properties: ‘ConsoleApplication3.Program.Invoker(System.Action)’ and ‘ConsoleApplication3.Program.Invoker(System.Func)’ c:\users\i.smagin\documents\visual studio 2010\Projects\ConsoleApplication3\ConsoleApplication3\Program.cs 22 4 ConsoleApplication3

Error 3 ‘string ConsoleApplication3.Program.Function(System.Xml.Linq.XDocument)’ has the wrong return type c:\users\i.smagin\documents\visual studio 2010\Projects\ConsoleApplication3\ConsoleApplication3\Program.cs 22 12 ConsoleApplication3

有任何想法吗?

解决方法

static void Action(XDocument x)

static string Function(XDocument x)

有相同的方法签名.

返回值不是方法签名的一部分.因此,只有不同的返回类型将无法正常工作.它们必须具有不同数量的参数或参数类型必须不同.

因为,编译器无法确定使用哪一个(采用Action的方法或采用Func的方法),您必须明确指定它:

Invoker(new Action<XDocument>(Action));
Invoker(new Func<XDocument,String>(Function));

解决歧义.

Action<T>和Func<T>

Action和Func

  1. Action<T>和Func<T>都是泛型委托。
  2. Action<T>表示委托可以引用一个viod返回类型的方法,至于方法是带几个参数,什么类型的参数,由后面的泛型决定。(Action<string, string>则表示,委托可以引用一个带有两个string类型的参数,并且返回类型为viod的方法)。
  3. Func<T>表示委托可以引用一个有返回值得方法,例如Func<string, double>,该委托表示,可以引用一个带string类型的参数,并且返回一个double类型的返回值的方法。(Func<T1, T2, T3, ...>最后一个参数表示委托可以引用的方法的返回类型)。

Asp.Net中的Action和Func委托实现

Asp.Net中的Action和Func委托实现

前言

最近在阅读某开源框架源码的时候,发现作者在其中运用了很多 Action委托 和 Func委托 ,虽然我之前在项目中也有一些对委托的实操,但还是免不了长时间的不用,当初消化的一些委托基础都遗忘了。。。索性,趁热打铁,借助这次分享的机会,也帮自己重新巩固下.Net中关于委托的一些基础用法。

直奔主题

从.Net Framework1.0开始就为我们提供了委托的功能使用。那个时候.Net内置委托Action和Func还没有问世,那么,我们先来看看1.0版本时候的委托。委托从字面上来理解就是“帮别人干活”,具体干活的内容交给了“方法”,所以通俗点理解—— 委托通常被用来表示对一个方法的调用 。具体怎么用,我们接着往下看。

声明委托

格式:

  • 用关键字“ delegate ”修饰委托
  • 委托的 返回值 和 参数 要和被委托的方法 保持一致

形如:

/// <summary>
  /// 声明委托
  /// </summary>
  public delegate void BuyGoodsDelegate(string Name);
  /// <summary>
  /// 委托的方法
  /// </summary>
  public void BuyGoods(string Name)
  {
   Console.WriteLine($"小明让我去买{Name}");
  }

委托和方法关联

在声明了委托和定义好方法之后,我们需要将委托和方法进行关联,这样委托才能知道自己要调用的是哪个方法。

//委托和方法关联
BuyGoodsDelegate buyGoods = new BuyGoodsDelegate(BuyGoods);

委托调用方法

将委托和方法进行关联之后,我们就可以直接操作委托实例来进行方法的调用,调用方式和直接调用方法差不多。

//调用方式1
buyGoods("鞋子");
//调用方式2
buyGoods.Invoke("衣服");

4.效果

有了上面的使用之后,我们会发现委托基本都是根据具体方法来声明的,如果不同的方法有3个,4个或者更多的参数,显然,我们需要分别声明不同参数个数的委托,不经意间多了一道“声明委托”的门槛。于是,在.Net Framework3.5版本之后发布了.Net自带的内置委托Action和Func。我们 不用再做“声明委托”的工作 ,直接可以使用。

Action委托

Action委托 提供无参数、有参数方法,但不提供返回类型 ,具有Action、Action<T>、Action<T1,T2>、Action<T1,T2,T3>……Action<T1,……T16>多达16个参数的形式,其中传入参数均采用泛型T,涵盖了几乎所有可能存在的无返回值的委托类型。

Func委托

Func委托 提供无参数、有参数方法,同时提供返回类型 ,具有Func<TResult>、Func<T,Tresult>……Func<T1,T2,T3……,Tresult>17种类型重载,T1……T16为参数,Tresult为返回类型。

前面我们说,Action委托和Func委托不用再声明,便可直接使用,除了这一点,它们还支持 匿名函数、lamda表达式形式 。

普通函数调用

其中,Student是入参类型,string为返回参数类型

//委托和方法关联
  Func<Student, string> funcNew = FuncTestDelegate;

  /// <summary>
  /// string返回类型方法
  /// </summary>
  /// <param name="student"></param>
  /// <returns></returns>
  public string FuncTestDelegate(Student student)
  {
   return student.StudentName;
  }

我们可以看到Func委托使用的时候,不用声明便可以直接使用。

匿名函数

匿名函数需要用关键字“delegate”声明

//Func 匿名函数 
   Func<int,int,string> func3 = delegate(int num1,int num2)
   {
    return $"Func:总和:{num1+ num2}";
   };
   //调用
   var result = func3(10, 20);

lamda表达式

//Func lamda表达式 无参数
   Func<string> func1 = () =>
   {
    return "Func:你好";
   };
   var result = func1();

   //Func lamda表达式 有参数
   string aa = "ABC";
   string bb = "DEF";
   Func<string, string, string> func2 = (p1, p2) =>
   {
    return $"Func:{p1},你好{p2}";
   };
   result = func2(aa, bb);

Action委托实例

Action委托和Func委托的 唯一区别就是没有返回类型 ,其他用法都一样,当不需要返回类型的时候,直接用Action委托。

//Action lamda表达式
   Action<string, string> action = (p1, p2) =>
   {
    Console.Write($"Action:{p1},你好{p2}");
   };
   action("ABC", "DEF");

小结

本文中,主要介绍了自定义委托以及.Net内置委托Action和Func的基础用法,以及他们之间的一些区别。总体上来看还是比较简单的,稍微动动手自己写一遍就能感受到其中的魅力。不多说了,希望充足自己的同时也能给更多的小伙伴的生活中加点盐。

到此这篇关于Asp.Net中的Action和Func委托的文章就介绍到这了,更多相关Asp.Net中的Action和Func委托内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

您可能感兴趣的文章:
  • C#内置泛型委托之Action委托
  • C#关于Func和Action委托的介绍详解
  • C#中的Action、Func和Predicate如何使用
  • C#中Action和Func的区别
  • 使用.NET中的Action及Func泛型委托深入剖析
  • C#内置泛型委托之Func委托

c – std :: optional和polymorphism

c – std :: optional和polymorphism

我在许多帖子中都读过Stack Overflow,当使用指针(用于参数或返回值)并允许nullptr(使其成为可选)时,通常最好使用std :: optional.

但是,如果指针指的是多态类型怎么办?最好使用std :: optional或指针吗?

解决方法

optional不适用于多态类型.它是一个值类型,多态基类在可选项中不起作用.就像将多态基类放在向量或类似容器中一样不起作用.

返回一个指针.这个建议通常被称为“一般”是有原因的.

c# – 是否可以重载具有相同名称的Func和Func?

c# – 是否可以重载具有相同名称的Func和Func?

首先,我知道我可以定义两个重载的辅助方法来做我需要的东西(或者甚至只是用不同的名称定义两个Func<>),但这些只用于一个公共方法,所以我正在探索通过使用相同的名称来定义两个也过载的本地Func<>的方法.举个例子:

string displayValue(int value)
{ return displayValue(value,val => val.ToString()); }

string displayValue(int value,Func<int,string> formatter)
{ return (value < 0) ? "N/A" : formatter(value); }

我需要在我的公共方法中多次调用一个或另一个版本来自定义格式化特殊值,所以我想我可以将上面的“翻译”成这样的东西:

Func<int,string>,string> displayValue =
    (value,formatter) => (value < 0) ? "N/A" : formatter(value);

Func<int,string> displayValue =
    value => displayValue(value,val => val.ToString());

即使在我输入它时,我也知道我无法声明两个具有相同名称的委托标识符,即使它们是不同的类型.这比使用Func<> s实现超载的死机更具学术性,但我猜他们不能做任何事情,对吧?

而且我想你不能做这样的事情:

Func<string,params object[],string> formatArgs =
    (format,args) => string.Format(format,args);

解决方法

不,你不能超载变量.这是你想要做的.

它仅仅来自用例:

displaywWithoutFormatter(displayValue);
 displaywWithFormatter(displayValue);

由于没有涉及参数,编译器无法可靠地区分这两者.

我们今天的关于C#Polymorphysm:重载函数,接受委托Action和Func?c#中的重载的分享已经告一段落,感谢您的关注,如果您想了解更多关于Action和Func、Asp.Net中的Action和Func委托实现、c – std :: optional和polymorphism、c# – 是否可以重载具有相同名称的Func和Func?的相关信息,请在本站查询。

本文标签: