初识c#---委托



委托:
            A委托B做一件事情,做事情的是B
            在程序里的体现形式:
            A类委托B类做一件事情(方法),做事情的还是B
            委托实际上就是存储了方法的地址
            委托的语法格式:
            public delegate 方法的返回值类型 委托名(方法的形参列表);
委托代表方法,返回值类型以及参数都要与代表的方法相对应
委托
            第一种关联委托的方法--绑定
class A
{
    A定义了一个委托
    public delegate void BuyDelegate();
    static int Main(string[] args)
    {
        B b = new B();
        第一种委托关联的方式,在初始化委托的时候
    传入需要关联的方法(委托代表哪个方法)
    BuyDelegate bd = new BuyDelegate(b.BuyThings);
        调用委托
     bd();
        第二种关联方法--动态绑定
        BuyDelegate bd;
        bd = b.BuyThings;//第一次绑定
        bd += b.BuyThings2;//再次绑定
                           //使用+=的前提是委托不能是空的
        bd -= b.BuyThings;//取消第一次的委托绑定
        bd();
        Console.ReadKey();
        return 0;
    }
}
class B
{
    public void BuyThings() { Console.WriteLine("A委托B去买一些东西"); }
    public void BuyThings2() { Console.WriteLine("A委托B再买一些东西"); }
}

namespace _0815_ClassCode
{
    public delegate void delegateDemo();//不带参数不带返回值的
    public delegate void delegateDemo(int x);//带参数不带返回值
    public delegate int delegateDemo(int x);//带参数带返回值
    public delegate int delegateDemo(int x, int y);
    public delegate int delegateDemo();//不带参数带返回值
    class Button2
    {
        public static void Click()
        {
            Console.WriteLine("---------");
        }
    }
    class Block
    {
        static int Main(string[] args)
        {
            常规创建委托以及调用方式
            delegateDemo dm;
            dm = Button2.Click;
            dm.Invoke();
            利用匿名函数
            dm = delegate ()
             {
                 Console.WriteLine("按钮被点击了!~" + x);
                 return 100;
             };
            Console.WriteLine(dm());
            bool isClick = false;
            if (isClick)
            {
                dm.Invoke(100);
            }
            创建委托的几种方式;
            常规创建(两种方式)
            利用匿名函数
            利用lambda表达式(匿名方法的简写形式)
            利用系统内置委托
            lambda表达式
            Func<int, int> f = a => 32;//Lambda表达式的参数只有一个的时候,可以不加括号,
            当函数体只有一句话的时候,可以不加上大括号也可以不加上return语句
             1.不带参数不带返回值的委托
            dm = () =>
            {
                Console.WriteLine("这是浪漫的表达式");
            };
            dm();
            //2.带参数不带返回值
            dm = (x) => { Console.WriteLine(x); };
            dm(10);
            3.带参数带返回值
            dm = (a, b) =>
            {
                return a + b;
            };
            Console.WriteLine(dm(10, 10));
            浪漫的表达式: 开启线程的时候
             Thread th = new Thread((x) => { Console.WriteLine("下载完成!"); });
            th.Start();
            List<string> list = new List<string>();
            list.AddRange(new string[] { "C#课程1", "unity课程", "lua课程" });
            List<string> books = list.FindAll((str) =>
              {
                  return str.EndsWith("课程");
              });
            List<string> books = list.FindAll((str) => str.EndsWith("课程"));
            foreach (var item in books)
            {
                Console.Write("{0}\t", item);
            }
            Console.ReadKey();
            return 0;
        }
    }
}
匿名方法:本质上是一个方法,只是没有名字,任何使用委托变量的地方都可以使用匿名方法赋值
Func<int,int,int> plus= delegate (int args1, int args2)
{
    return args1 + args2;
};
----------------------------------------------------------------------------------------------------------------------------
//模拟书店
using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

//模拟书店
//1.书籍
//2.管理书籍的数据库
namespace BookStore
{
    //定义一个委托
    public delegate void BookDelegate(Book book);

    //书籍类,包括一些书籍的信息以及书的状态(借出或者没借出)
    public class Book
    {
        public string Tittle { get; set; }   //书名
        public string Author { get; set; }   //作者
        public decimal Price { get; set; }   //单价
        public bool isBack;                  //用来记录书籍的状态

        public Book(string title, string author, decimal price, bool isBack)
        {
            this.Tittle = title;
            this.Author = author;
            this.Price = price;
            this.isBack = isBack;
        }
    }

    //管理书籍的数据库
    public class BookDB
    {
        ArrayList list = new ArrayList();
        //添加书籍到数据库
        public void AddBook(string title, string author, decimal price, bool isBack)
        {
            list.Add(new Book(title, author, price, isBack));
        }

        //利用委托来实现业务逻辑
        public void ProcessPaperbackBooks(BookDelegate processBook)
        {
            foreach (Book b in list)
            {
                if (b.isBack)
                {
                    processBook(b);
                }
            }
        }

    }
}

//客户端
namespace Client
{
    using BookStore;
    class PriceTotaller
    {
        int countBook = 0;         //书籍的总数
        decimal priceBooks = 0.0m; //书籍的总价

        //internal:跨程序集不可访问,只有当前程序可以访问
        //internal是类的默认修饰符
        //统计书籍的总数量
        internal void AddBookToTotal(Book book)
        {
            countBook += 1;
            priceBooks += book.Price;
        }

        //返回书籍的平均价格
        internal decimal AveragePrice()
        {
            return priceBooks / countBook;
        }
    }

    class Text
    {
        //输出作者
        public static void PrintTitle(Book b)
        {
            Console.WriteLine("   {0}", b.Author);
        }

        public static void AddBooks(BookDB db)
        {
            db.AddBook("射雕英雄传", "金庸", 19.95m, true);
            db.AddBook("三少爷的贱", "古龙", 39.95m, true);
            db.AddBook("Lua程序设计", "李小龙", 1999.95m, false);
            db.AddBook("c#从入门到放弃", "赵宁", 0.95m, true);
        }

        static int Main(string[] args)
        {
            //1.初始化书籍数据库
            BookDB bookDB = new BookDB();
            //2.添加书籍到数据库
            AddBooks(bookDB);
            //3.利用委托输出书的名字
            bookDB.ProcessPaperbackBooks(PrintTitle);

            PriceTotaller pt = new PriceTotaller();
            //4.利用委托输出平均还回来的书籍价格
            bookDB.ProcessPaperbackBooks(pt.AddBookToTotal);
            Console.WriteLine("平均还回来的书的价格为:" + pt.AveragePrice());

            Console.Read();
            return 0;
        }
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值