• C# 委托和泛型


    委托定义:

    委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

    • 委托是一个类:因此声明委托可以在类的外面声明,形式与声明类一样,例如
        //定义一个委托
        public delegate void EventHandler(Dictionary<string,string> dic);

    我的理解:委托可以把方法当做参数传递给另一个方法,这在异步操作中非常常见

    例如在JS中,通过Ajax获取数据时需要传递一个回调函数

    而C#属于强类型语言,声明函数参数时必须给定类型,所以这才有了委托

    举个栗子

        //定义一个委托
        public delegate void EventHandler(Dictionary<string,string> dic);
    
        public class User
        {
            //这个方法的作用是从异步从 数据库/文件 中获取用户数据,然后在处理,因为是异步的,所以只能采用回调的形式,所以这里必须使用委托
            public void getUserInfo(EventHandler del) {
                //模拟从数据库读取数据
                Dictionary<string, string> user = new Dictionary<string, string>();
                user.Add("name", "张三");
                user.Add("age", "30");
                //使用委托
                del(user);
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                User user = new User();
                //这里使用匿名函数的形式 函数签名必须与委托保持一致
                user.getUserInfo(data =>
                {
                    foreach (KeyValuePair<string,string> kv in data)
                    {
                        Console.WriteLine(kv.Key + ':' + kv.Value);
                    }
                    Console.ReadLine();
                });
            }
        }

    什么是泛型:

    我们在编写程序时,经常遇到两个模块的功能非常相似,只是一个是处理int数据,另一个是处理string数据,或者其他自定义的数据类型,但我们没有办法,只能分别写多个方法处理每个数据类型,因为方法的参数类型不同。有没有一种办法,在方法中传入通用的数据类型,这样不就可以合并代码了吗?泛型的出现就是专门解决这个问题的

    简而言之:泛型是一段代码适配多种类型的解决方案

    例如:获取数组中最大的值,数组可能是 int数组 string数组...

        class Program
        {
            static void Main(string[] args)
            {
                int[] arr = new int[] { 1, 2, 3, 4, 5, 6 };
                int maxNumber = getMax<int>(arr, (n1, n2) => {
                    return n1 - n2;
                });
    
                string[] arr1 = new string[] { "a", "ab", "abc", "abcd" };
                string maxString = getMax<string>(arr1, (s1, s2) =>
                {
                    return s1.Length - s2.Length;
                });
    
                Console.Read();
            }
    
            public static T getMax<T>(T[] arr ,Max<T> del)
            {
                T max = arr[0];
                foreach (T item in arr)
                {
                    if (del(max, item) < 0) {
                        max = item;    
                    }
                }
                return max;
            }
    
        }
  • 相关阅读:
    android 使用广播监听网络状态
    Android获取文件目录路径
    android实现布局重叠
    文件存储到getfilesdir和getcache中的解析问题,原来是权限问题
    CodeForces 1047C Enlarge GCD(数论)题解
    html 空白汉字占位符&#12288;
    js 将json字符串转换为json兑现
    为什么jQuery要返回jQuery.fn.init对象
    transform和transition
    自适应网页设计/响应式Web设计
  • 原文地址:https://www.cnblogs.com/xiaoliwang/p/9515480.html
Copyright © 2020-2023  润新知