委托:
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;
}
}
}