delegate委托
三个概念:
C# 中的委托类似于 C 或 C++ 中的函数指针。
委托是面向对象、类型安全的,并且是安全的。
委托和接口的类似之处是:它们都允许分隔规范和实现。
一个原则:
被托管函数的返回和参数必须和声明的托管相同;
namespace Bookstore
{
using System.Collections;
//1 声明Book
public struct Book
{
public string Title; // 书名
public string Author; // 作者
public decimal Price; // 价格
public bool Paperback; // 简装
//构造函数
public Book(string title, string author, decimal price, bool paperBack)
{
Title = title;
Author = author;
Price = price;
Paperback = paperBack;
}
}
//2 托管声明:注意参数是Book,返回值void
public delegate void ProcessBookDelegate(Book book);
//3 书库
public class BookDB
{
ArrayList list = new ArrayList();
public void AddBook(string title, string author, decimal price, bool paperBack)
{
list.Add(new Book(title, author, price, paperBack));
}
public void ProcessPaperbackBooks(ProcessBookDelegate processBook)
{
foreach (Book b in list)
{
if (b.Paperback)
//12.processBook,他的调用和在运行是调用的就是PrintTitle()
processBook(b);
}
}
}
}
namespace BookTestClient
{
using Bookstore;
class PriceTotaller
{
int countBooks = 0;
decimal priceBooks = 0.0m;
//internal 修饰符使类、接口或成员仅在当前包中可见。
//当前包之外的代码不能访问 internal 成员。
//在全局范围内,internal 修饰符与 public 修饰符相同
internal void AddBookToTotal(Book book)
{
countBooks += 1;
priceBooks += book.Price;
}
{
return priceBooks / countBooks;
}
}
class Test
{
// 打印书名
static void PrintTitle(Book b)
{
Console.WriteLine(" {0}", b.Title);
}
static void Main()
{
//构造书库,这不必细说,从BookDB可以看很明白
BookDB bookDB = new BookDB();
AddBooks(bookDB);
Console.WriteLine("Paperback Book Titles:");
// 11.关键点到了,新建了一个托管对象,参数是Test.PrintTitle
// 什么意思呢?先看PrintTitle(),他的参数和返回值和声明的托管
//要求的一致,我得理解是把这个函数的引用或者函数指针封装之后,当作参数
//交给函数ProcessPaperbackBooks 向上到12
bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(PrintTitle));
PriceTotaller totaller = new PriceTotaller();
Console.WriteLine("Average Paperback Book Price: ${0:#.##}",
totaller.AveragePrice());
}
static void AddBooks(BookDB bookDB)
{
bookDB.AddBook("The C Programming Language",
"Brian W. Kernighan and Dennis M. Ritchie", 19.95m, true);
bookDB.AddBook("The Unicode Standard 2.0",
"The Unicode Consortium", 39.95m, true);
bookDB.AddBook("The MS-DOS Encyclopedia",
"Ray Duncan", 129.95m, false);
bookDB.AddBook("Dogbert's Clues for the Clueless",
"Scott Adams", 12.00m, true);
}
}
}
// compose.cs
using System;
{
public static void Hello(string s)
{
Console.WriteLine(" Hello, {0}!", s);
}
{
Console.WriteLine(" Goodbye, {0}!", s);
}
{
MyDelegate a, b, c, d;
// the method Hello:
a = new MyDelegate(Hello);
// Create the delegate object b that references
// the method Goodbye:
b = new MyDelegate(Goodbye);
// The two delegates, a and b, are composed to form c:
c = a + b;
// Remove a from the composed delegate, leaving d,
// which calls only the method Goodbye:
d = c - a;
a("A");
Console.WriteLine("Invoking delegate b:");
b("B");
Console.WriteLine("Invoking delegate c:");
c("C");
Console.WriteLine("Invoking delegate d:");
d("D");
}
}
转载于:https://blog.51cto.com/programmingart/42955
delegate委托相关推荐
- Strategy模式与Delegate委托
Strategy模式是对算法的封装.即使是一个计算行为,如果其实现有其多样性,为达到易扩展的目的,我们也有必要将其抽象出来,以接口的形式来定义.由于充分利用了面向对象的多态性,在调用该行为时,其具体的 ...
- C# Delegate(委托)与多线程
C# Delegate(委托)与多线程 很多时候写windows程序都需要结合多线程,在.net中用如下得代码来创建并启动一个新的线程. public void ThreadProc(); ...
- 【C#学习】delegate(委托) 和 event(事件)
C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针.委托(Delegate) 是存有对某个方法的引用的一种引用类型变量.引用可在运行时被改变.在C#中方法不能作为参数直接传递,必须 ...
- 转:终于会用c#中的delegate(委托)和event(事件)了
第一个例子: public class DelegateTest {// 声明delegate对象 public delegate void CompareDelegate(int a,int b); ...
- Delegate委托的使用
Delegate委托的使用 委托的说明 委托(delegate)是Cocoa的一个术语,表示将一个对象的部分功能转交给另一个对象. 比如对象A希望对象B知道将要发生或已经发生某件事情,对象A可以把对象 ...
- UE4 C++:Delegate委托
目录 概念 定义 声明委托 单播委托 声明宏 绑定委托 执行函数 用法示例 不带参数Delegate 带参数Delegate 传递有效负载数据 多播委托 声明宏 绑定多播委托 多播执行 动态委托 声明 ...
- C#学习基本概念之关键字---delegate(委托)
委托类型的声明与方法签名相似, 有一个返回值和任意数目任意类型的参数: public delegate void TestDelegate(string message); public deleg ...
- Csharp关键字----delegate(委托)
Delegate类简介 ------------------------ 命名空间:System 程序集:mscorlib(在 mscorlib.dll 中) 委托(Delegate)类是一 ...
- delegate 委托方法
一先定义一个委托方法 ---------第一个类XX //定议委托 public event ordinary Ordinary; //定议委托方法 public delegate void ordi ...
最新文章
- R语言层次聚类(hierarchical clustering):使用scale函数进行特征缩放、hclust包层次聚类(创建距离矩阵、聚类、绘制树状图dendrogram,在树状图上绘制红色矩形框)
- Document,Node,Element,HTMLDocument ,HTMLCollection,HTMLElement,NodeList
- 转载:flash 跨域 crossdomain.xml
- 第14讲:Selenium 的基本使用
- 如何在 C# 中使用 Attribute
- [转载] python异常和错误有什么区别_python的错误和异常
- 软件工程 第三章 需求分析
- 最近十年诞生的6种新编程语言
- Cadence学习之路:什么是PCB工艺的正片与负片
- 魔改大西瓜源码下载之后画面显示只有一半的解决方法
- T语言与快速开发平台之天宇联iOS开发手册
- 给一个朋友创业公司商业计划书的建议
- FPGA中ISE软件调用IP核导入(.coe)文件并绘制正弦函数
- 深度学习100问之提高深度学习模型训练效果(调参经验)
- http://www.yesky.com/424/163424.shtml http://www.yesky.com/424/163424.shtml
- 计算机毕业设计Java大学生学籍管理系统(源码+系统+mysql数据库+lw文档)
- C#开发之Excel录入
- 用 Python 写脚本发送工作周报
- 分享:笔记本电脑有杂音解决技巧
- ip地址在同一网段什么意思
热门文章
- WPF学习笔记——设置ListBox选中项的背景颜色
- 函数作为变量,类型---golang
- IT工程师实战英语之一
- lvds接口屏线安装图解_液晶屏LVDS线类型图文讲解
- 互联网协议 — 互联网的技术发展
- 数据结构 — B+ 树
- VMware 虚拟化编程(13) — VMware 虚拟机的备份方案设计
- 一文详解为什么Serverless比其他软件开发方法更具优势
- 英国EE:启动TechCity 2.0 首期将部署LTE-Advanced Pro
- 部署 instance 到 OVS vlan100 - 每天5分钟玩转 OpenStack(138)