从C#与Net4高级编程复制来的——委托注意事项
2013-11-20 16:56
323 查看
委托允许内存中的对象进行双向对话。从头使用委托会有一些重复代码(定义委托,声明必要的成员变量记忆创建自定义的注册/注销方法来保护封装等)
除了时间之外,这样使用委托来作为应用程序的回调机制会有另一个问题:如果没有把委托成员变量定义为私有的,调用者就可以直接访问委托对象。这样调用者就可以把变量重新赋值为新的委托对象(实际上,也就是删除了当前要调用的方法列表),更糟糕的是,调用者可以直接调用委托的调用列表。
公共的委托成员打破了封装,不仅会导致代码难以维护和调试,还会导致应用程序的安全风险。
namespace SimpleCarDelegate
{
internal class Car
{
public delegate void CarEngineHandler(string msgForCaller);
//
public CarEngineHandler listOfHandlers;
//
public void Accelerate(int delta)
{
if (listOfHandlers != null)
listOfHandlers("Sorry ,This Car is dead……");
}
}
class Program
{
static void Main(string[] args)
{
Car myCar = new Car();
myCar.listOfHandlers = new Car.CarEngineHandler(CallWhenExploded);
myCar.Accelerate(10);
myCar.listOfHandlers = new Car.CarEngineHandler(CallHereToo);
myCar.Accelerate(10);
myCar .listOfHandlers.Invoke("QQQQQQQQQQQQQQQQQ");
Console.ReadLine();
}
static void CallWhenExploded(string msg)
{
Console.WriteLine(msg);
}
static void CallHereToo(string msg)
{
Console.WriteLine(msg);
}
}
}
除了时间之外,这样使用委托来作为应用程序的回调机制会有另一个问题:如果没有把委托成员变量定义为私有的,调用者就可以直接访问委托对象。这样调用者就可以把变量重新赋值为新的委托对象(实际上,也就是删除了当前要调用的方法列表),更糟糕的是,调用者可以直接调用委托的调用列表。
公共的委托成员打破了封装,不仅会导致代码难以维护和调试,还会导致应用程序的安全风险。
namespace SimpleCarDelegate
{
internal class Car
{
public delegate void CarEngineHandler(string msgForCaller);
//
public CarEngineHandler listOfHandlers;
//
public void Accelerate(int delta)
{
if (listOfHandlers != null)
listOfHandlers("Sorry ,This Car is dead……");
}
}
class Program
{
static void Main(string[] args)
{
Car myCar = new Car();
myCar.listOfHandlers = new Car.CarEngineHandler(CallWhenExploded);
myCar.Accelerate(10);
myCar.listOfHandlers = new Car.CarEngineHandler(CallHereToo);
myCar.Accelerate(10);
myCar .listOfHandlers.Invoke("QQQQQQQQQQQQQQQQQ");
Console.ReadLine();
}
static void CallWhenExploded(string msg)
{
Console.WriteLine(msg);
}
static void CallHereToo(string msg)
{
Console.WriteLine(msg);
}
}
}
相关文章推荐
- C#2005 .NET3.0高级编程学习笔记————编程规则
- C#_06_高级编程
- C# 6 与 .NET Core 1.0 高级编程
- C# 6 与 .NET Core 1.0 高级编程
- C# 6 与 .NET Core 1.0 高级编程_0
- 【Objective-C高级编程】iOS与OS X多线程和内存管理(七) __block 从栈上复制到堆
- C# 6 与 .NET Core 1.0 高级编程 - 41 ASP.NET MVC(中)
- C#高级编程笔记 Day 5, 2016年9月 13日 (泛型)
- C#.NET:高级编程之系统内置委托(有Func/无返回值Action)
- C#2005高级编程11Chapter内存管理和指针
- C# 6 与 .NET Core 1.0 高级编程
- 【Objective-C高级编程】iOS与OS X多线程和内存管理(八) __block 从栈上复制到堆 截获对象 数组
- 2_C# 高级编程(第六版)学习笔记——第2章 C# 基础
- 6_C# 高级编程(第六版)学习笔记——第6章 运算符和类型强制转换
- C#2008与.NET 3.5 高级程序设计读书笔记(4)--C#核心编程结构II
- Wrox的C#高级编程第三版第一部分第一章(16~18页)
- C#2005 .NET3.0高级编程学习笔记————结构,部分类,静态类,Object类
- C# 6 与 .NET Core 1.0 高级编程
- 4_C# 高级编程(第六版)学习笔记——第5章 继承
- C#2005 .NET3.0高级编程学习笔记———.NET体系结构