C#中委托用法实例详解
作者:pythoner 发布时间:2022-11-02 23:24:40
标签:C#,委托
本文实例讲述了C#中委托用法。分享给大家供大家参考。具体分析如下:
这里演示了如何使用匿名委托来计算员工的薪水奖金。使用匿名委托简化了程序,因为无需再定义一个单独的方法。
(-:The data for each employee is stored in an object containing personal details as well as a delegate that references the algorithm required to calculate the bonus.)=100%(每个员工的数据都存储在一个对象中,该对象中包含了个人的详细信息和一个引用了计算奖金所需算法的委托。:-) 通过以委托的方式定义算法,可以使用相同的方法来执行奖金计算,而与实际计算方式无关。另外需要注意的是,一个局部变量 multiplier 变成了已捕获的外部变量,因为它在委托计算中被引用了。
// 版权所有 (C) Microsoft Corporation。保留所有权利。
using System;
using System.Collections.Generic;
using System.Text;
namespace AnonymousDelegate_Sample
{
// 定义委托方法。
delegate decimal CalculateBonus(decimal sales);
// 定义一个 Employee 类型。
class Employee
{
public string name;
public decimal sales;
public decimal bonus;
public CalculateBonus calculation_algorithm;
}
class Program
{
// 此类将定义两个执行计算的委托。
// 第一个是命名方法,第二个是匿名委托。
// 首先是命名方法。
// 该方法定义“奖金计算”算法的一个可能实现。
static decimal CalculateStandardBonus(decimal sales)
{
return sales / 10;
}
static void Main(string[] args)
{
// 奖金计算中用到的值。
// 注意:此局部变量将变为“捕获的外部变量”。
decimal multiplier = 2;
// 将此委托定义为命名方法。
CalculateBonus standard_bonus = new CalculateBonus(CalculateStandardBonus);
// 此委托是匿名的,没有命名方法。
// 它定义了一个备选的奖金计算算法。
CalculateBonus enhanced_bonus = delegate(decimal sales) { return multiplier * sales / 10; };
// 声明一些 Employee 对象。
Employee[] staff = new Employee[5];
// 填充 Employees 数组。
for (int i = 0; i < 5; i++)
staff[i] = new Employee();
// 将初始值赋给 Employees。
staff[0].name = "Mr Apple";
staff[0].sales = 100;
staff[0].calculation_algorithm = standard_bonus;
staff[1].name = "Ms Banana";
staff[1].sales = 200;
staff[1].calculation_algorithm = standard_bonus;
staff[2].name = "Mr Cherry";
staff[2].sales = 300;
staff[2].calculation_algorithm = standard_bonus;
staff[3].name = "Mr Date";
staff[3].sales = 100;
staff[3].calculation_algorithm = enhanced_bonus;
staff[4].name = "Ms Elderberry";
staff[4].sales = 250;
staff[4].calculation_algorithm = enhanced_bonus;
// 计算所有 Employee 的奖金
foreach (Employee person in staff)
PerformBonusCalculation(person);
// 显示所有 Employee 的详细信息
foreach (Employee person in staff)
DisplayPersonDetails(person);
}
public static void PerformBonusCalculation(Employee person)
{
// 此方法使用存储在 person 对象中的委托
// 来进行计算。
// 注意:此方法能够识别乘数局部变量,尽管
// 该变量在此方法的范围之外。
//该乘数变量是一个“捕获的外部变量”。
person.bonus = person.calculation_algorithm(person.sales);
}
public static void DisplayPersonDetails(Employee person)
{
Console.WriteLine(person.name);
Console.WriteLine(person.bonus);
Console.WriteLine("---------------");
}
}
}
希望本文所述对大家的C#程序设计有所帮助。


猜你喜欢
- 1.使用List集合方式用list保存activity实例,然后逐一干掉import java.util.LinkedList;import
- 本文实例为大家分享了Unity shader百叶窗展示的具体代码,供大家参考,具体内容如下1.将图片划分为水平N栏,代码如下:Shader
- 分析Github 3000个开源项目,粗略统计如下。括号内的数字是使用频率 0-3000. 下面的列表显示不全,完整的请看完整列表。1.ja
- 1 Get请求数据项目地址:https://github.com/Snowstorm0/learn-get-post1.1 Controll
- 一、前言使用动态配置的原因: properties 和 yaml 是写到项目中的,好多时候有些配置需要修改,每次修改就要重新启动项目,不仅增
- Quartz是一款开源的定时任务调度框架,Quartz的官网是:http://www.quartz-s
- 目录一、内部类1.什么是内部类?1.类作为形参和返回值:2.内部类的几种形式二、Lambda表达式(强调做什么,而不是以什么形式去做)1.L
- 本文实例讲述了Android观察者模式。分享给大家供大家参考。具体分析如下:一、环境:主机:WIN8开发环境:Eclipse二、说明:1.打
- 前言Spring5带来了新的响应式web开发框架WebFlux,同时,也引入了新的HttpClient框架WebClient。WebClie
- 泛型中 T 类型变量 和 ? 通配符 区别定义不同 :T 是类型变量,? 是通配符使用范围不同:? 通配符用作 参数类型、字段类型、局部变量
- 前言在 Java 中通常对一些方法进行一些注解操作,但是很多注解在 Java 代码上没有问题,如果切换到 Kotlin 上时,如果继续使用这
- 数据适配DataAdapter 对象是DataSet 和数据源之间的桥梁,可以建立并初始化数据表(即DataTable),对数据源执行SQL
- 1. 问题的提出Struts2中如果实现了ModelDriven<model>接口就可以将传来的参数注入到model中了,就可以
- @Profile注解详解@Profile:Spring为我们提供的可以根据当前环境,动态的激活和切换一系列组件的功能;开发环境develop
- 示例1:public static String hello() { String s = "商务&qu
- 本文实例讲述了Java Spring开发环境搭建及简单入门示例。分享给大家供大家参考,具体如下:前言虽然之前用过Spring,但是今天试着去
- Kotlin定义变量一般有如下写法lateinit var name: String var age: String? = null那么用l
- Android 自定义标题栏的实例详解开发 Android APP 经常会用到自定义标题栏,而有多级页面的情况下还需要给自定义标
- 本文实例讲述了Java二维数组。分享给大家供大家参考,具体如下:一 点睛1 每行的元素个数不同的二维数组Java定义二维数组更加灵活,允许二
- 本文实例为大家分享了Android App获取屏幕旋转角度的具体代码,供大家参考,具体内容如下一、获取屏幕旋转角度的方法是:int rota