ylbtech-LanguageSamples-Delegates(委托)
ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-Delegates(委托) |
1.A,示例(Sample) 返回顶部 |
“委托”示例
本示例演示了委托类型。它演示了如何将委托映射到静态方法和实例方法,以及如何组合它们以创建多路广播委托。
安全说明 |
---|
提供此代码示例是为了阐释一个概念,它并不代表最安全的编码实践,因此不应在应用程序或网站中使用此代码示例。对于因将此代码示例用于其他用途而出现的偶然或必然的损害,Microsoft 不承担任何责任。 |
在 Visual Studio 中生成并运行“委托”示例
打开解决方案 (Delegates.sln)。
在“解决方案资源管理器”中,右击“Delegates1”项目并单击“设为启动项目”。
在“调试”菜单上单击“开始执行(不调试)”。
对于 Delegates2,请重复前面的步骤。
从命令行生成并运行“委托”示例
使用“更改目录”命令转到“Delegates1”目录。
键入以下命令:
csc bookstore.cs
bookstore使用“更改目录”命令转到“Delegates2”目录。
键入以下命令:
csc compose.cs
compose
1.B,示例代码(Sample Code)返回顶部 |
1.B.1, bookstore.cs
// 版权所有(C) Microsoft Corporation。保留所有权利。
// 此代码的发布遵从
// Microsoft 公共许可(MS-PL,http://opensource.org/licenses/ms-pl.html)的条款。
//
//版权所有(C) Microsoft Corporation。保留所有权利。 // bookstore.cs
using System; // 用于处理书店的一组类:
namespace Bookstore
{
using System.Collections; // 描述图书列表中的一本书:
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;
}
} // 声明一个用于处理书的委托类型:
public delegate void ProcessBookDelegate(Book book); // 维护一个图书数据库。
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)
// 调用该委托:
processBook(b);
}
}
}
} // 使用 Bookstore 类:
namespace BookTestClient
{
using Bookstore; // 计算图书总价格和平均价格的类:
class PriceTotaller
{
int countBooks = ;
decimal priceBooks = 0.0m; internal void AddBookToTotal(Book book)
{
countBooks += ;
priceBooks += book.Price;
} internal decimal AveragePrice()
{
return priceBooks / countBooks;
}
} // 测尝试书数据库的类:
class Test
{
// 打印书名。
static void PrintTitle(Book b)
{
Console.WriteLine(" {0}", b.Title);
} // 下面开始执行。
static void Main()
{
BookDB bookDB = new BookDB(); // 用一些书初始化数据库:
AddBooks(bookDB); // 打印所有平装本的书名:
Console.WriteLine("Paperback Book Titles:");
// 创建一个与静态方法 Test.PrintTitle 关联的
// 新委托对象:
bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(PrintTitle)); // 使用 PriceTotaller 对象
// 获取平装本的平均价格:
PriceTotaller totaller = new PriceTotaller();
// 创建一个与对象 totaller 的非静态方法
// AddBookToTotal 关联的新委托对象:
bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(totaller.AddBookToTotal));
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);
}
}
}
1.B.2,
1.B,示例代码2(Sample Code)返回顶部 |
1.B.1, compose.cs
// 版权所有(C) Microsoft Corporation。保留所有权利。
// 此代码的发布遵从
// Microsoft 公共许可(MS-PL,http://opensource.org/licenses/ms-pl.html)的条款。
//
//版权所有(C) Microsoft Corporation。保留所有权利。 // compose.cs
using System; delegate void MyDelegate(string s); class MyClass
{
public static void Hello(string s)
{
Console.WriteLine(" Hello, {0}!", s);
} public static void Goodbye(string s)
{
Console.WriteLine(" Goodbye, {0}!", s);
} public static void Main()
{
MyDelegate a, b, c, d; // 创建引用 Hello 方法的
// 委托对象 a:
a = new MyDelegate(Hello);
// 创建引用 Goodbye 方法的
// 委托对象 b:
b = new MyDelegate(Goodbye);
// a 和 b 两个委托组成 c,
// c 将按顺序调用这两个方法:
c = a + b;
// 从组合委托中移除 a 而保留 d,
// 后者仅调用 Goodbye 方法:
d = c - a; Console.WriteLine("Invoking delegate a:");
a("A");
Console.WriteLine("Invoking delegate b:");
b("B");
Console.WriteLine("Invoking delegate c:");
c("C");
Console.WriteLine("Invoking delegate d:");
d("D");
}
}
1.B.2,
1.C,下载地址(Free Download)返回顶部 |
作者:ylbtech 出处:http://ylbtech.cnblogs.com/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 |
ylbtech-LanguageSamples-Delegates(委托)的更多相关文章
- 【Xamarin笔记】Events, Protocols and Delegates
Events, Protocols and Delegates 事件.协议和委托 This article presents the key iOS technologies used to re ...
- 浅析C#之委托、Action、Func
一.委托 1.1 委托的定义 delegate(委托)是一种可用于封装命名方法或匿名方法的引用类型, 委托类似于 C++ 中的函数指针: .Net通过委托来提供回调函数机制. 声明一个委托类型 int ...
- 高级C#
使用delegates委托写插件方法: public delegate int Transformer (int x); public class Util { public static void ...
- C# Coding Conventions(译)
C# Coding Conventions C#编码规范 Naming Conventions 命名规范Layout Conventions 布局规范Commenting Conventions 注释 ...
- C# Language Specification 5.0 (翻译)第一章 引言
C#(念作 See Sharp)是一种简单.现代.面向对象并且类型安全的编程语言.C# 源于 C 语言家族,因此 C.C++ 和 Java 工程师们能迅速上手.ECMA 国际[1](ECMA Inte ...
- tomcat启动(五)Catalina分析-service.init
上篇写到StandardService.init() 这个方法做什么呢?一起来看看. 这个类也是实现了Lifecycle 如图.这个图中i表示Interface接口.如Lifecycle,Contai ...
- C# 特性 System.ComponentModel 命名空间属性方法大全,System.ComponentModel 命名空间的特性
目录: System.ComponentModel 特性命名空间与常用类 System.ComponentModel.DataAnnotations ComponentModel - Classes ...
- dotnet 委托的实现解析(2)开放委托和封闭委托 (Open Delegates vs. Closed Delegates)
前言 这是个人对委托的理解系列第二篇,部分翻译自 Open Delegates vs. Closed Delegates – SLaks.Blog,好像还没人翻译过,加上部分个人理解.希望能对大家理解 ...
- C#委托使用详解(Delegates)
摘要 委托是C#编程一个非常重要的概念,也是一个难点.本文将系统详细讲解委托. 1. 委托是什么? 其实,我一直思考如何讲解委托,才能把委托说得更透彻.说实话,每个人都委托都有不同的见解,因为看问题的 ...
- Asynchronous Programming Using Delegates使用委托进行异步编程
http://msdn.microsoft.com/zh-cn/library/22t547yb(v=vs.110).aspx https://github.com/chucklu/Test/tree ...
随机推荐
- django开发项目实例1--建立一个项目并初步运行
1:进入目标目录新建一个项目 D:\>django-admin.py startproject qiweijie 新建完成后,进入项目文件夹查看目录 D:\>cd qiweijie D:\ ...
- elasticsearch索引加别名
curl -XPOST 'http://localhost:9200/_aliases' -d ' { "actions": [ {&qu ...
- Java之CyclicBarrier使用
http://blog.csdn.net/shihuacai/article/details/8856407 1.类说明: 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (commo ...
- LeetCode解题报告—— Reverse Nodes in k-Group && Sudoku Solver
1. Reverse Nodes in k-Group Given a linked list, reverse the nodes of a linked list k at a time and ...
- 【JBPM4】任务节点-任务分配candidate-groups
此分组的意思是,该任务节点为多个人员,当其中之一完成后,流程就进入下一个节点. JPDL <?xml version="1.0" encoding="UTF-8&q ...
- firfox与about:config
¤什么是about:config¤about:config是Firefox的设置页面,Firefox提供了不少高级设置选项在这里以便让你可以更加详细地控制Firefox的运行方式.官方不推荐用户手工修 ...
- ExtJs之组件(window)
Ext.create('Ext.window.Window',{ title:'', width:400, height:300, constrain:true,//限制窗口不 ...
- Noip2015提高组解题报告
Day1 T1神奇的幻方 一道简单异常的小模拟,我们只需要确定数字1的位置,然后根据题意枚举即可,简简单单就A了,什么也不卡. 然而这题,我刚开始学OI的时候,因为当时比较蠢,被这题花式吊打啊.... ...
- python strip() 函数和 split() 函数的详解及实例
strip是删除的意思:split则是分割的意思.strip可以删除字符串的某些字符,split则是根据规定的字符将字符串进行分割. 1.Python strip()函数 介绍 函数原型 声明:s为字 ...
- Failure INSTALL FAILED DUPLICATE PERMISSION
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha Failure [INSTALL_FAILED_DUPLICATE_PERMISSION ...