关于什么是委托,委托如何使用,我在这里就不说了。
需要说的:
委托是函数指针链
委托的 BeginInvoke
委托如果出现异常,会如何
<!--more-->
<!-- csdn -->
如果不知道函数指针,可以继续往下看,我来告诉大家,为何需要委托。
假如在写游戏,有一个人物,他会升级,那么在他升级的时候,需要给他添加潜力值,而判断升级是经验类需要写的。
先写一个经验类。
核心
如果当前经验大于最大经验,升级。
但是升级是在经验类里,经验类外的人物不会知道已经升级了,那么如何让人物知道升级?
这时可以使用委托。
如果当前经验大于最大经验
调用函数升级
那么函数 升级 如何让人物知道,可以使用一个委托
升级
调用委托
于是人物可以添加函数到经验。
经验.升级=人物.升级
这样,经验的升级就是使用人物的升级,可以使用其他类的函数。
上面没有代码,现在来说个有代码的。
假如需要去寄快递,那么需要找邮递,把东西给他
假设有个邮递,可以寄快递
class 邮递
{
public static Action 寄快递;
}
委托最好用Action
这里定义委托是,不知道会是哪个快递员会去寄快递,在实际,谁也不知道最后是哪个,快递员可能说不想干了,实际快递太辛苦,大家多体谅。所以不能写函数说,快递A 给 小明去寄,因为不知道小明是不是今天上班。
来写一个 主角 张 ,他需要去寄快递。
class MrZhang
{
public void 寄快递()
{
邮递.寄快递();
}
}
不知道是谁上班,但是我可以寄快递。
最后,今天来上班的快递员
快递员 a = new 快递员();
邮递.寄快递 = a.寄快递;
class 快递员
{
public void 寄快递()
{
}
}
就是快递,所以这就是委托使用。
使用一个函数,不知道他是谁用的,可以使用委托。
如果使用的委托是 多播,那么小心用 BeginInvoke
如果使用 同步,那么多个方法是可以运行
static void Main(string[] args)
{
Action m = M1;
m += M2;
m.Invoke();
}
private static void M1()
{
p();
}
private static void M2()
{
p();
}
private static void p()
{
Console.WriteLine("线程ID为:{0}", Thread.CurrentThread.ManagedThreadId);
}
如果使用的BeginInvoke,那么在委托多播使用 BeginInvoke 会报异常 System.ArgumentException:“The delegate must have only one target.”
在一个线程不能同时执行多个方法,使用 BeginInvoke 必须在多个线程,所以可以使用 获得所有方法,然后执行
static void Main(string[] args)
{
Action m = M1;
m += M2;
List<IAsyncResult> list=new List<IAsyncResult>();
var invtl = m.GetInvocationList().OfType<Action>().ToList();
foreach (Action temp in invtl)
{
list.Add(temp.BeginInvoke((e) => { }, null));
}
for (int i = 0; i < invtl.Count(); i++)
{
invtl[i].EndInvoke(list[i]);
}
}
private static void M1()
{
p();
}
private static void M2()
{
p();
}
private static void p()
{
Console.WriteLine("线程ID为:{0}", Thread.CurrentThread.ManagedThreadId);
}
有两个需要知道:
m.GetInvocationList()
得到 Delegate 不能直接执行。
需要转类型,定义是知道他是什么类型,上面使用的是 Action ,所以可以转 Action ,如果是自定义的,那么使用自定义的。
第二,如果使用 BeginInvoke ,在等待时,需要拿到 IAsyncResult 才可以。
var temp = m.BeginInvoke((e) => { }, null);
m.EndInvoke(temp);
上面代码:如果要使用 BeginInvoke ,小心 Delegate 是多个函数,不是一个函数,所以使用时,建议使用
var invtl = m.GetInvocationList().OfType<Action>().ToList();
foreach (Action temp in invtl)
{
list.Add(temp.BeginInvoke((e) => { }, null));
}
需要把类型换自己的类型。
如果委托发生异常
如果委托方法里没有 try catch,那么如果使用 invoke, 委托是函数指针链,所以会在执行异常退出。
如果使用 BeginInvoke ,那么会在 EndInvoke 退出。
static void Main(string[] args)
{
Action m = M1;
m += M2;
List<IAsyncResult> list=new List<IAsyncResult>();
var invtl = m.GetInvocationList().OfType<Action>().ToList();
foreach (Action temp in invtl)
{
list.Add(temp.BeginInvoke((e) => { }, null));
}
}
private static void M1()
{
p();
throw new ArgumentException();
}
private static void M2()
{
p();
throw new ArgumentException();
}
private static void p()
{
Console.WriteLine("线程ID为:{0}", Thread.CurrentThread.ManagedThreadId);
}
上面代码没有 EndInvoke 不会有异常,异常发生在别线程,所以不会在Main函数异常。
如果使用 EndInvoke 会在 Main 异常
static void Main(string[] args)
{
Action m = M1;
m += M2;
List<IAsyncResult> list=new List<IAsyncResult>();
var invtl = m.GetInvocationList().OfType<Action>().ToList();
foreach (Action temp in invtl)
{
list.Add(temp.BeginInvoke((e) => { }, null));
}
for (int i = 0; i < invtl.Count(); i++)
{
invtl[i].EndInvoke(list[i]);
}
}
private static void M1()
{
p();
throw new ArgumentException();
}
private static void M2()
{
p();
throw new ArgumentException();
}
private static void p()
{
Console.WriteLine("线程ID为:{0}", Thread.CurrentThread.ManagedThreadId);
}
事件
如果事件使用 BeginInvoke 和 委托一样
_event += (s, e) => M1();
_event += (s, e) => M2();
_event?.BeginInvoke(null, null, (e) => { }, null);
private static EventHandler _event;
异常:System.ArgumentException:“The delegate must have only one target.”
需要和 委托 一样,获得函数指针,执行,如果方法里有异常,那么不会在 Main 方法异常,如果没有使用 End 。
foreach (var temp in _event.GetInvocationList().OfType<EventHandler>())
{
temp.BeginInvoke(null, null, (e) => { }, null);
}
本文还没写好,如果有问题,请联系我
本文内容属于大量抄袭,代码是自己写,但是抄了代码大神写的,于是羞愧放下他的博客:
http://www.cnblogs.com/free722/archive/2011/04/04/2005275.html
http://stackoverflow.com/questions/25979264/understanding-the-wpf-dispatcher-begininvoke
本文会经常更新,请到原文:http://lindexi.oschina.io/lindexi//post/C-%E5%A7%94%E6%89%98
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
相关推荐
本文将深入探讨C#委托的概念、用途、类型以及如何使用`DynamicInvoke`方法。 ### 1. 委托的基本概念 委托是C#中的一个类,它封装了指向方法的引用。换句话说,委托就像一个指针,但它指向的是方法而不是内存地址。...
在C#编程语言中,委托和事件是两个非常重要的概念,它们构成了事件驱动编程的基础。...在实际项目中,结合文档《C#委托与事件.doc》的详细分析,初学者将更好地掌握这些概念,并能够在实践中得心应手。
本文将深入探讨C#委托的概念、用法及其在实际开发中的应用。 一、什么是委托 委托在C#中是一种类型,类似于指针,但更加安全和灵活。它封装了一个或多个方法的引用,可以看作是“方法的句柄”。委托类型由系统定义...
详解 C# 委托、事件与回调函数 委托是 C# 中一种非常重要的概念,它可以将方法作为参数传递给其他方法,也可以将方法作为返回值返回给其他方法。委托的定义是:delegate 返回类型 委托名(参数列表);例如:...
例如,`C#委托详解.pdf` 可能详细解释了委托的基本概念、用法以及如何结合匿名委托实现某些功能。而`委托与匿名委托.zip`可能包含了一些示例项目,你可以运行并查看其工作原理。 总的来说,掌握C#中的委托和匿名...
C#委托的概念类似于其他语言中的函数指针,但它更安全、类型安全,并且支持多播,即一个委托可以同时引用多个方法。 首先,我们来深入理解什么是委托。委托在C#中是一种引用类型,它定义了一种方法签名,这个签名...
在C#编程语言中,委托(Delegate)是一种强大的特性,它允许我们把方法作为参数传递,或者存储在变量中...在`DelegateDemo`这个示例项目中,你可能会看到如何在实际代码中应用这些概念,从而加深对C#委托和事件的理解。
在C#编程语言中,委托是一种强大的特性,它允许我们传递方法作为参数或者将方法存储在变量中。这个“C# 委托简单实例”是理解委托概念的基础教程,特别适合初学者入门。该实例的核心是通过委托来实现温度监控,包括...
本示例代码将深入探讨C#委托的使用及其重要性。 首先,理解委托的基本概念是至关重要的。在C#中,委托是一种类型,它封装了指向静态或实例方法的指针。这使得我们可以将方法当作其他方法的参数,或者存储在类的字段...
C#委托技术有很多作用,以下是一个简单的实例完成C#委托解决不同对象之间的传值或者方法调用的问题: 假设想想实现以下功能: 从主窗体中创建2个子窗体,想把2个子窗体的信息发送到主窗体中,并在主窗体中显示,在子...
### C#委托及事件委托的理解 #### 一、委托的基础概念 在C#中,委托是一种类型,它允许我们封装方法引用。通过这种方式,可以在不同的上下文中调用这些方法,而无需硬编码调用的位置。这类似于C++中的函数指针,但...
本教程将深入探讨C#委托的基本概念、用法及其在实际编程中的应用。 一、委托的定义与声明 在C#中,委托是一种类型,它代表了一个或多个方法的集合。委托的声明类似于类或接口,但使用`delegate`关键字。例如,我们...
本文将深入探讨C#委托实例,尤其是关于`SimpleDelegate`的使用和`MultiCall`方法的重复调用。 首先,我们要了解什么是委托。在C#中,委托是一个类,它继承自`System.Delegate`,用于封装一个或多个具有相同签名的...
标题“c#委托的使用简单例子”暗示我们将探讨如何在实际代码中应用委托。在C# 2005环境下,你可以创建一个Windows应用程序项目,然后使用委托来实现一些功能。虽然这里提到的是VS2005,但同样的概念也适用于后续版本...
本文将深入探讨C#委托的使用,特别关注传统委托和多播委托的实例。 首先,让我们理解什么是委托。委托在C#中相当于一个对象,可以引用一个或多个具有相同签名的方法。它们是类型安全的,因为每个委托类型都与特定的...
本文将深入探讨C#委托的使用实例,帮助初学者理解并掌握这一核心概念。 首先,理解委托的基本概念是至关重要的。在C#中,委托是一种类型,它代表了一个方法的签名。这意味着,当创建一个委托实例时,我们实际上是...
接下来,我们将基于提供的代码片段深入分析C#委托的另一种实现方式,并讨论其实现原理及其应用场景。 ### 委托的基本概念 委托在C#中是一种引用类型的数据结构,它定义了方法的类型,使得可以将方法当作另一个方法...
### C#委托使用方法 #### 一、委托概念与作用 在C#中,委托是一种引用类型的数据结构,它允许将方法作为参数进行传递。简而言之,委托就是对函数的引用,它使得代码能够更加灵活地处理回调、事件驱动等场景。通过...
### 详解C#委托,事件,Observer设计模式 在C#编程中,了解并掌握委托、事件以及Observer设计模式对于构建高效、灵活的应用程序至关重要。本文将深入探讨这些概念,并通过具体的示例来帮助理解。 #### 1. 将方法...