精华内容
下载资源
问答
  • c#泛型委托
    2018-12-22 19:45:52

    C#泛型委托是指系统预制的委托类型

    更多相关内容
  • C#泛型委托

    2022-08-26 10:20:21
    从中我们可以看到where和自定义的NewWhere,功能是一样的,也就是说where也是用了泛型委托。所以,我们可以传递一个类型的数据进去,然后再传递一个方法进去,自动就加工返回值了。可以看到都是where的功劳,现在...

    泛型委托,可以分开看,是泛型和委托的组合。

    泛型:

    对于泛型的使用之前的文章已经写了,可以参考C#之泛型_故里2130的博客-CSDN博客,不清楚的可以先看一看。

    委托:

    这个比较简单,从delegate关键字到匿名委托方法,再到Action和Func,Action是无返回值的委托,Func是有返回值的委托,现在基本上都是基于Action和Func来写委托的,有些和业务逻辑连接起来写匿名委托方法。

    现在我们看一个案例

    1.建立一个控制台程序,建立student类

     

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApp4
    {
        public class Student
        {
            public int ID { get; set; }
    
            public string name { get; set; }
    
            public int age { get; set; }
    
            public string sex { get; set; }
    
            public string grade { get; set; }
        }
    }
    

    2.我们初始化数据后,分别进行查询操作

    进行3次查询后,然后分别输出对应的名字,这样是我们平时的做法,一点错误都没有。可以看到都是where的功劳,现在我们可以使用泛型委托自己自定义一个和where一样的功能。

    只要遇到代码有重复的逻辑,就可以使用委托

    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    namespace ConsoleApp4
    {
        static class Program
        {
            static void Main(string[] args)
            {
                List<Student> student = new List<Student>();
                student.Add(new Student() { age = 20, grade = "一班", ID = 1, name = "张三", sex = "男" });
                student.Add(new Student() { age = 21, grade = "一班", ID = 2, name = "李四", sex = "女" });
                student.Add(new Student() { age = 22, grade = "二班", ID = 3, name = "王五", sex = "女" });
                student.Add(new Student() { age = 23, grade = "二班", ID = 4, name = "老六", sex = "男" });
    
                var stu = student.Where(s => s.grade == "一班");
                foreach (var item in stu)
                {
                    Console.WriteLine(item.name);
                }
    
                Console.WriteLine("==============分界线==============");
                var stu1 = student.Where(s => s.sex == "男");
                foreach (var item in stu1)
                {
                    Console.WriteLine(item.name);
                }
    
                Console.WriteLine("==============分界线==============");
                var stu2 = student.Where(s => s.sex == "男" && s.age > 20);
                foreach (var item in stu2)
                {
                    Console.WriteLine(item.name);
                }
            }
        }
    }
    

    3. 结果

    4. 建立一个WhereNew类,表示泛型委托类

    特别要注意,Invoke是执行方法,传入参数,返回bool值

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApp4
    {
        public static class WhereNew
        {
            public static IEnumerable<T> NewWhere<T>(this IEnumerable<T> items, Func<T, bool> func)
            {
                List<T> ls = new List<T>();
                foreach (var item in items)
                {
                    if (func.Invoke(item)) //执行方法,传入参数,返回bool值
                    {
                        ls.Add(item);
                    }
                }
                return ls;
            }
        }
    }
    

    5.使用

    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    namespace ConsoleApp4
    {
        static class Program
        {
            static void Main(string[] args)
            {
                List<Student> student = new List<Student>();
                student.Add(new Student() { age = 20, grade = "一班", ID = 1, name = "张三", sex = "男" });
                student.Add(new Student() { age = 21, grade = "一班", ID = 2, name = "李四", sex = "女" });
                student.Add(new Student() { age = 22, grade = "二班", ID = 3, name = "王五", sex = "女" });
                student.Add(new Student() { age = 23, grade = "二班", ID = 4, name = "老六", sex = "男" });
    
                //var stu = student.Where(s => s.grade == "一班");
                IEnumerable<Student> stu = student.NewWhere(s => s.grade == "一班");
                foreach (var item in stu)
                {
                    Console.WriteLine(item.name);
                }
    
                Console.WriteLine("==============分界线==============");
                //var stu1 = student.Where(s => s.sex == "男");
                IEnumerable<Student> stu1 = student.NewWhere(s => s.sex == "男");
                foreach (var item in stu1)
                {
                    Console.WriteLine(item.name);
                }
    
                Console.WriteLine("==============分界线==============");
                //var stu2 = student.Where(s => s.sex == "男" && s.age > 20);
                IEnumerable<Student> stu2 = student.NewWhere(s => s.sex == "男" && s.age > 20);
                foreach (var item in stu2)
                {
                    Console.WriteLine(item.name);
                }
            }
        }
    }
    

    6.效果,和之前where的效果是一样的

      

    从中我们可以看到where和自定义的NewWhere,功能是一样的,也就是说where也是用了泛型委托。泛型就是T,委托就是func。所以,我们可以传递一个类型的数据进去,然后再传递一个方法进去,自动就加工返回值了。

      public static IEnumerable<T> NewWhere<T>(this IEnumerable<T> items, Func<T, bool> func)
            {
                List<T> ls = new List<T>();          //T就是泛型,委托就是func
                foreach (var item in items)
                {
                    if (func.Invoke(item)) //执行方法,传入参数,返回bool值
                    {
                        ls.Add(item);
                    }
                }
                return ls;
            }

     

     

     

     

     

     

     

     

    展开全文
  • 主要介绍了C#泛型委托的用法,以实例形式较为详细的分析了C#委托的功能与相关使用技巧,需要的朋友可以参考下
  • 泛型委托是基于委托之上,可以利用重载和泛型进行。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/202012141640018.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9...
    泛型委托是基于委托之上,可以利用重载和泛型进行。
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/202012141640018.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzUwODIxMDc1,size_16,color_FFFFFF,t_70)
    

    在这里插入图片描述
    利用泛型可以将委托在函数中进行重载和返回值同时利用get进行输出,并返回值。重载中用大写T、U、M、K等代表数值类型,在数值真正传入之后再真正确认数值类型可以可以方便后续的写代码。当委托用泛型输出的时候,即使有重载也不会有问题,即使如上一样使用一个委托名字也不会有问题,当有返回值的时候再调用委托的时候接收一个返回值,将其输出。
    在定义和输出的时候将定义的时候各个类型对比上,如果定义的时候T为返回值,则在代入函数的时候可以跳过T所在的位置。但剩下的一定都要按原位置进行代入。

    展开全文
  • C# 泛型 委托

    2019-08-01 19:49:41
    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;...namespace 泛型委托 { class Program { static void Main(string[] args) ...
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace 泛型委托
    {
        class Program
        {
            static void Main(string[] args)
            {
                //1.需要保存一个无参数,无返回值的一个方法
                //无需自己定义委托 直接用Action
                //非泛型版本
                Action action1 = new Action(M1);
                action1();
                Console.ReadKey();
    
                //泛型版本,就是一个无返回值,但是参数都可以变化的委托
                //action都没有返回值
                Action<int, int> a1 = (x, y) => { Console.WriteLine(x, y)};
    
                a1(100, 100);
    
    
    
    
    
    
                //++++++++++++++++++++++++++++++++
                //Func委托只要有一个泛型版本的,没有非泛型版本的
                Func<int, int, int,int> fun = M2;//最后一个表示返回值
                int n = fun(1, 2, 3);
                Console.WriteLine(n);
                 
            }
    
            private static int M2(int n1, int n2,int n3)
            {
                return n1 + n2 + n3;
            }
    
            private static void M1()
            {
                Console.WriteLine("ok");
            }
        }
    }
    

     

    展开全文
  • c#中的泛型委托详解

    2021-01-20 06:15:16
    今天学习一下c#中的泛型委托。 1.一般的委托,delegate,可以又传入参数(<=32),声明的方法为 public delegate void SomethingDelegate(int a); using System; using System.Collections.Generic; using ...
  • 这是一个泛型委托的示例,主要是让初学者了解泛型委托的用法,虽然很简单,但是代码有注释,我的这个例子是在vs2010中做的,用vs08的朋友们,最好还是转一下,但是绝对能实现(本程序是控制台应用程序,适合初学者)...
  • c#泛型委托

    2019-01-24 15:36:00
     C#提供好了两个泛型委托的模板供我们使用 这两个模板基本上就可以适用于所有的委托 所以其实是不需要我们自定义  1.不带返回类型的泛型委托——Acition<类型1,类型2.....类型n>参数列表时对应的参数...
  • c# 泛型委托 练习

    2021-04-23 12:03:03
    自定义 无参无返回值 委托 using System; namespace ConsoleApp5 { // 声明委托,无参数,无返回值 delegate void MyDele(); class Program { static void Main(string[] args) { // dele1这个变量引用着一个...
  • c#泛型类、泛型方法、泛型接口、泛型委托
  • 1、为什么要使用委托 将一个方法作为参数传递给另一个方法 2、委托概念 声明: public delegate int DelegateName(int a, int b); 声明一个委托类型,可以用访问修饰符修饰,delegate...3、泛型委托 声明: public
  • C#泛型委托实例

    千次阅读 2018-10-04 11:34:08
     委托可以定义它自己的类型参数。  Generic delegates are especially useful in defining events based on the typical design pattern because the sender argument can be strongly typed and no longer h...
  • 泛型(Generic),是将不确定的类型预先定义下来的一种C#高级语法,我们在使用一个类,接口或者方法前,不知道用户将来传什么类型,或者我们写的类,接口或方法相同的代码可以服务不同的类型,就可以定义为泛型。...
  • // 泛型委托 : 多个数据类型 static void Main(string[] args) { // 普通委托例子 Compute compute1 = TestDelegate.Add; Compute compute2 = TestDelegate.Sub; Console.WriteLine(compute1(1, 2)); // 结果为: 3...
  • C# 泛型委托 Action/Func

    千次阅读 2014-10-10 21:53:42
    泛型委托实际上就是.NET Framework预定义的委托,基本涵盖了所有常用的委托,所以一般不用用户重新声明。简洁方便! 【1】无返回值的泛型委托 Action系列泛型委托,是没有返回参数的委托,调用的时候和普通的...
  • C#语言】泛型委托

    2021-03-14 00:34:25
    泛型委托和非泛型委托相似,不过,类型参数,决定了能接受什么样的方法。 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 泛型委托 { //定义泛型委托 ...
  • 泛型类、泛型方法、泛型接口、泛型委托 泛型类、泛型方法、泛型接口、泛型委托
  • /T为占位符,表示一个通用数据类型,使用时用实际类型代替//T可以很多个,以逗号隔开//泛型容器//泛型方法委托是一种全新的面相对象语言特性,运行在.Net平台;基于委托,开发事件驱动将会变得相当方便;委托可以视...
  • C#内置泛型委托:Action委托 1、什么是Action泛型委托 Action<T>是.NET Framework内置的泛型委托,可以使用Action<T>委托以参数形式传递方法,而不用显示声明自定义的委托。封装的方法必须与此委托...
  • 正交性:泛型类型(类/接口/委托/…)、泛型成员(属性/方法/字段/…) 类型方法的参数推断 泛型委托,lambda表达式 泛型全程应该是,泛化的数据类型。是泛泛而谈的,比如我喜欢听音乐,那么音乐就是一个泛型的。而...
  • C#中的泛型委托

    2019-07-24 14:54:38
    C#中的泛型委托为什么使用泛型委托泛型委托的写法LINQ中的泛型委托 为什么使用泛型委托 普通委托有一个问题,由于入口参数类型不同,委托没法使用,就不得不再定义一个委托来代表这个方法,因为类型的数目是无限多的...
  • 1、什么是Func委托 Func委托代表有返回类型的委托 2、Func委托定义 查看Func的定义: using System.Runtime.CompilerServices; namespace System { // // 摘要: // 封装一个方法,该方法具有两个参数,并...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,370
精华内容 6,948
关键字:

c#泛型委托