在委托的C# documentation中,它表示“委托是一种可用于封装命名或匿名方法的引用类型。委托类似于C ++中的函数指针;但是,委托属于类型安全且安全“
我的问题是,代表“ 安全 ”是什么意思?
答案 0 :(得分:8)
委托强制对方法进行类型安全调用。这通常通过编译器执行的静态类型检查来工作。但这不是唯一的方法,您可以使用Delegate.DynamicInvoke()
来绕过编译器类型检查。一个例子:
using System;
class Program {
delegate void foo(long arg);
static void Main(string[] args) {
var obj = new Example();
var dlg = Delegate.CreateDelegate(typeof(foo), obj, "Target");
dlg.DynamicInvoke(42);
}
}
class Example {
private long field;
public void Target(long arg) {
field = arg;
}
}
现在开始修改这段代码,你可以采取哪些措施来欺骗类型系统:
DynamicInvoke
调用DynamicInvoke
调用所有这些尝试都会毫无怨言地编译。它们都不会执行,您将获得运行时异常。这就是使委托安全的原因,你不能使用它们来调用一个会使堆栈失衡的方法,或者诱使目标方法访问未初始化的堆栈位置或不是激活帧的一部分。恶意软件劫持代码的传统方式。在C或C ++中不存在这样的运行时检查,它们的编译器仅执行静态检查,并且可以通过简单的转换来绕过它。
答案 1 :(得分:5)
我的问题是,delagate的意思是什么?“安全”?
使用委托调用的函数被赋予调用者的安全上下文,这会阻止委托执行任务而不是 可供较低权限的调用者使用。可以初始化代理 指向在任何地方实现的函数。唯一的 限制是签名。呼叫者在调用时需要小心 包含指向未知源的函数指针的委托 可能是意外的实施。使用代码访问安全性 保护代表。
答案 2 :(得分:2)
在这种情况下,我认为安全意味着代表不能持有无效值。这可能与类型安全部分重叠一点。
答案 3 :(得分:2)
这意味着你不能像在C / C ++中那样“乱七八糟”,使得函数指针指向无效的内存区域,或者更糟糕的是指向恶意代码。
答案 4 :(得分:2)
它正在将它们与C ++中的函数指针进行比较,这可以用来“吹掉你的腿”,就像男人说的那样。