C#小白来提问(7):委托疑问

booirror 2015-11-09 10:04:06

public delegate void ThreadStart();

然后

ThreadStart ts = new ThreadStart(obj.Foo);

从原理上来说,ThreadStart还应该接受this指针参数。因为成员方法Foo里面可能用到了obj的字段。


C++的回调函数,传成员方法时是一定要带上this指针的。

为什么C#不用传,而C++为什么没有按C#的方式来做。
...全文
442 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
aavjmz 2015-11-12
  • 打赏
  • 举报
回复
为什么要用c#,想过没有,指针这种东西不安全,所以隐藏了。
  • 打赏
  • 举报
回复
嗯,蒙圈了半天,终于绕回来了! 用了大写,红字,还得了搂住30分,爽了吧?单县城小朋友?
引用 29 楼 shingoscar 的回复:
来回答下你5楼的疑问吧 [quote=引用 5 楼 micropentium6 的回复:] += operator是针对event的吧?
不是
引用 5 楼 micropentium6 的回复:
multicast delegate能使用+=吗?
引用 5 楼 micropentium6 的回复:
如果有多个subscribers同时在publisher上register呢? event可以保证synchronization, 但delegate不会。
我又不做多线程有什么问题? [/quote]
  • 打赏
  • 举报
回复
你又是连看都没看吧? 那揍别总拿MSDN出来显眼啦!
引用 28 楼 shingoscar 的回复:
[quote=引用 26 楼 micropentium6 的回复:] 你这个孩子,肿么不虚心!英文写了一遍,中文又给你解释了一遍,还是木有用。说来说去,你揍从来木有认真看过8楼的内容。 网上木有,你自己不会用脑子想吗?非要是美国的,英文的,网上说不行,你才信吗? 好吧,给你, 接着! http://stackoverflow.com/questions/29155/what-are-the-differences-between-delegates-and-events
那小朋友,你贴这个是想告诉我什么?[/quote]
  • 打赏
  • 举报
回复
引用 楼主 booirror 的回复:
public delegate void ThreadStart(); 然后 ThreadStart ts = new ThreadStart(obj.Foo); 从原理上来说,ThreadStart还应该接受this指针参数。因为成员方法Foo里面可能用到了obj的字段。 C++的回调函数,传成员方法时是一定要带上this指针的。 为什么C#不用传,而C++为什么没有按C#的方式来做。
c/c++ 跟 .net 不具有可比性,因为委托跟函数指针有着本质的不同,委托是封装起来的更复杂的对象。c++ 本身是比较低级的,它很少包括复杂的高级的对象,而函数指针的简单性,决定了它一定是混乱的、全靠编程者自己解决的、内置功能很少的。
秋的红果实 2015-11-10
  • 打赏
  • 举报
回复
传this指针这些细节,C#的内部替我们做了。 像GC,还有像委托把一个方法名赋值给委托对象,其实是将该方法添加到委托对象的列表里,用+=其实是调用了委托静态方法Conbine(),但我们不用管这些内部细节,更多时间注重业务,这也是C#的优势吧
  • 打赏
  • 举报
回复
我不原意说,可你这是在逼我说啊:英文不好揍不要给人家引用英文原文! Delegate大写是因为.net framework里真有肿么个类! https://msdn.microsoft.com/en-us/library/system.delegate(v=vs.110).aspx 你自己前面不都写了吗?Delegate.Target! 你看,我是认真阅读了你的回复以后给出的自己的看法。知道为毛说你是喷了吧?
引用 14 楼 shingoscar 的回复:
[quote=引用 12 楼 micropentium6 的回复:] 你说我木有搞清两者的关系,可见你木有认真看偶在8楼的回帖,我说的对吧? 你发给我的那个tutorial能说明啥? Delegates are the basis for Events. 上面是你引用给我看的,那个Events是首字母大写,而且还用了复数!可我说的event都是小写哦!为毛?因为那是keyword event。 麻烦你先去搞搞清楚Events和event的区别吧!
咬文嚼字有意思吗? 你只看到Events是大写,复数,所以它不是值event? 请解释下为什么Delegates也是大写,复数?[/quote]
  • 打赏
  • 举报
回复
说你喷,你还有意见,我在8楼一开始揍写了阿? “你先告诉我event和delegate的区别是啥?event only allows subscribe and unsubscribe, delegate also allows assign and invoke“ 为毛不推荐直接对delegate用+=? 你都是调用链了,又暴露在外的接口,我一个对delegate的赋值,你还multicast个屁啊! 咱还不说县城安全的问题,你非要自己玩multicast,好吧,县城同步的代码也请你实现了吧! 所有这些我在8楼都有说啊?你有看吗?亲!
引用 13 楼 shingoscar 的回复:
[quote=引用 10 楼 micropentium6 的回复:] 麻烦你先看看我前面8楼的回复在喷! +=,-= operator的确可以在delegate上直接用,会调用Delegate.Combine和Delegate.Remove。我木有这么用过,因为揍不该用。
8楼的帖子只是介绍了event为什么是线程安全的 但是你是从哪里看到不推荐delegate使用+=的?[/quote]
Poopaye 2015-11-10
  • 打赏
  • 举报
回复
引用 12 楼 micropentium6 的回复:
你说我木有搞清两者的关系,可见你木有认真看偶在8楼的回帖,我说的对吧? 你发给我的那个tutorial能说明啥? Delegates are the basis for Events. 上面是你引用给我看的,那个Events是首字母大写,而且还用了复数!可我说的event都是小写哦!为毛?因为那是keyword event。 麻烦你先去搞搞清楚Events和event的区别吧!
咬文嚼字有意思吗? 你只看到Events是大写,复数,所以它不是值event? 请解释下为什么Delegates也是大写,复数?
  • 打赏
  • 举报
回复
你说我木有搞清两者的关系,可见你木有认真看偶在8楼的回帖,我说的对吧? 你发给我的那个tutorial能说明啥? Delegates are the basis for Events. 上面是你引用给我看的,那个Events是首字母大写,而且还用了复数!可我说的event都是小写哦!为毛?因为那是keyword event。 麻烦你先去搞搞清楚Events和event的区别吧!
引用 11 楼 shingoscar 的回复:
[quote=引用 10 楼 micropentium6 的回复:] 麻烦你先看看我前面8楼的回复在喷! +=,-= operator的确可以在delegate上直接用,会调用Delegate.Combine和Delegate.Remove。我木有这么用过,因为揍不该用。
先请你告诉我哪句话是在喷? 如果你没用过并且认为不该用,请你先学习下微软提供的关于delegate的教程https://msdn.microsoft.com/en-us/library/ms173172.aspx[/quote]
Poopaye 2015-11-10
  • 打赏
  • 举报
回复
引用 10 楼 micropentium6 的回复:
麻烦你先看看我前面8楼的回复在喷! +=,-= operator的确可以在delegate上直接用,会调用Delegate.Combine和Delegate.Remove。我木有这么用过,因为揍不该用。
8楼的帖子只是介绍了event为什么是线程安全的 但是你是从哪里看到不推荐delegate使用+=的?
Poopaye 2015-11-10
  • 打赏
  • 举报
回复
引用 10 楼 micropentium6 的回复:
麻烦你先看看我前面8楼的回复在喷! +=,-= operator的确可以在delegate上直接用,会调用Delegate.Combine和Delegate.Remove。我木有这么用过,因为揍不该用。
先请你告诉我哪句话是在喷? 如果你没用过并且认为不该用,请你先学习下微软提供的关于delegate的教程https://msdn.microsoft.com/en-us/library/ms173172.aspx
  • 打赏
  • 举报
回复
麻烦你先看看我前面8楼的回复在喷! +=,-= operator的确可以在delegate上直接用,会调用Delegate.Combine和Delegate.Remove。我木有这么用过,因为揍不该用。
引用 9 楼 shingoscar 的回复:
[quote=引用 5 楼 micropentium6 的回复:] += operator是针对event的吧?能指出event可能造成的resource leak很好! https://msdn.microsoft.com/en-us/library/ms366768.aspx multicast delegate能使用+=吗?即便可以,这是推荐的行为吗? 如果有多个subscribers同时在publisher上register呢? event可以保证synchronization, 但delegate不会。
麻烦你先去搞搞清楚两者的关系
delegate void CustomDelegateType();
CustomDelegateType CustomDelegate;
event CustomDelegateType CustomEvent;
void CustomMethod()
{
	CustomDelegate += CustomMethod;
	CustomEvent += CustomMethod;
	Console.WriteLine(CustomDelegate.GetType() == CustomEvent.GetType());
}
引用
Delegates are the basis for Events.
https://msdn.microsoft.com/en-us/library/900fyy8e.aspx[/quote]
Poopaye 2015-11-10
  • 打赏
  • 举报
回复
来回答下你5楼的疑问吧
引用 5 楼 micropentium6 的回复:
+= operator是针对event的吧?
不是
引用 5 楼 micropentium6 的回复:
multicast delegate能使用+=吗?
引用 5 楼 micropentium6 的回复:
如果有多个subscribers同时在publisher上register呢? event可以保证synchronization, 但delegate不会。
我又不做多线程有什么问题?
Poopaye 2015-11-10
  • 打赏
  • 举报
回复
引用 26 楼 micropentium6 的回复:
你这个孩子,肿么不虚心!英文写了一遍,中文又给你解释了一遍,还是木有用。说来说去,你揍从来木有认真看过8楼的内容。 网上木有,你自己不会用脑子想吗?非要是美国的,英文的,网上说不行,你才信吗? 好吧,给你, 接着! http://stackoverflow.com/questions/29155/what-are-the-differences-between-delegates-and-events
那小朋友,你贴这个是想告诉我什么?
  • 打赏
  • 举报
回复
你以为你以为的揍是你以为的啊? 同样是field like event, 从类内部调用和从外部调用,IL实现的是一样的吗?
引用 22 楼 booirror 的回复:
另外,shingoscar说delegate使用了+=之后要使用-=,否则会资源泄露。说明虽然我们没有显式传递this指针,但delegate暗地里引用了实例对象。这里只是为了说明delegate引用了实例对象,而不是说推荐使用多播代理,我想。
引用 2 楼 shingoscar 的回复:
补充一句,正因为Delegate里包含了对象,如果你对Delegate使用了+=而没有使用-=,这个对象就不会回收,造成内存泄漏
  • 打赏
  • 举报
回复
你这个孩子,肿么不虚心!英文写了一遍,中文又给你解释了一遍,还是木有用。说来说去,你揍从来木有认真看过8楼的内容。 网上木有,你自己不会用脑子想吗?非要是美国的,英文的,网上说不行,你才信吗? 好吧,给你, 接着! http://stackoverflow.com/questions/29155/what-are-the-differences-between-delegates-and-events
引用 25 楼 shingoscar 的回复:
[quote=引用 22 楼 booirror 的回复:] 另外,shingoscar说delegate使用了+=之后要使用-=,否则会资源泄露。说明虽然我们没有显式传递this指针,但delegate暗地里引用了实例对象。这里只是为了说明delegate引用了实例对象,而不是说推荐使用多播代理,我想。
我本来只想说下一个内存泄漏常见的坑 delegate用+=完全没问题,我给他看的那个链接https://msdn.microsoft.com/en-us/library/ms173172.aspx,里面也介绍了关于+=的用法,说明微软也是支持这种写法的。网上也没有文章明确反对使用+=,所以我不知道他的言论是怎么来的[/quote]
Poopaye 2015-11-10
  • 打赏
  • 举报
回复
引用 5 楼 micropentium6 的回复:
+= operator是针对event的吧?能指出event可能造成的resource leak很好! https://msdn.microsoft.com/en-us/library/ms366768.aspx multicast delegate能使用+=吗?即便可以,这是推荐的行为吗? 如果有多个subscribers同时在publisher上register呢? event可以保证synchronization, 但delegate不会。
麻烦你先去搞搞清楚两者的关系
delegate void CustomDelegateType();
CustomDelegateType CustomDelegate;
event CustomDelegateType CustomEvent;
void CustomMethod()
{
	CustomDelegate += CustomMethod;
	CustomEvent += CustomMethod;
	Console.WriteLine(CustomDelegate.GetType() == CustomEvent.GetType());
}
引用
Delegates are the basis for Events.
https://msdn.microsoft.com/en-us/library/900fyy8e.aspx
  • 打赏
  • 举报
回复
你先告诉我event和delegate的区别是啥?event only allows subscribe and unsubscribe, delegate also allows assign and invoke field-like event is backed by a private delegate When compiling a field-like event, the compiler automatically creates storage to hold the delegate, and creates accessors for the event that add or remove event handlers to the delegate field. In order to be thread-safe, the addition or removal operations are done while holding the lock (§8.12) on the containing object for an instance event, or the type object (§7.6.10.6) for a static event. 然而,如果你自己定义event的add/remove, the thread safe is on you. 有人说反编译会看到.net framework default的event add/remove handler中的lock。我是木有看过,要不你自己试试?

public void add_MyEvent(EventHandler value)
{
    EventHandler handler2;
    EventHandler myEvent = this.MyEvent;
    do
    {
        handler2 = myEvent;
        EventHandler handler3 = (EventHandler) Delegate.Combine(handler2, value);
        myEvent = Interlocked.CompareExchange<EventHandler>(ref this.MyEvent, handler3, handler2);
    }
    while (myEvent != handler2);
}
引用 7 楼 booirror 的回复:
引用 5 楼 micropentium6 的回复:
+= operator是针对event的吧?能指出event可能造成的resource leak很好! https://msdn.microsoft.com/en-us/library/ms366768.aspx multicast delegate能使用+=吗?即便可以,这是推荐的行为吗? 如果有多个subscribers同时在publisher上register呢? event可以保证synchronization, 但delegate不会。 [quote=引用 2 楼 shingoscar 的回复:] 补充一句,正因为Delegate里包含了对象,如果你对Delegate使用了+=而没有使用-=,这个对象就不会回收,造成内存泄漏
既然event可以保证synchronization,为什么delegate 不能[/quote]
booirror 2015-11-10
  • 打赏
  • 举报
回复
引用 5 楼 micropentium6 的回复:
+= operator是针对event的吧?能指出event可能造成的resource leak很好! https://msdn.microsoft.com/en-us/library/ms366768.aspx multicast delegate能使用+=吗?即便可以,这是推荐的行为吗? 如果有多个subscribers同时在publisher上register呢? event可以保证synchronization, 但delegate不会。
引用 2 楼 shingoscar 的回复:
补充一句,正因为Delegate里包含了对象,如果你对Delegate使用了+=而没有使用-=,这个对象就不会回收,造成内存泄漏
既然event可以保证synchronization,为什么delegate 不能
Poopaye 2015-11-10
  • 打赏
  • 举报
回复
引用 22 楼 booirror 的回复:
另外,shingoscar说delegate使用了+=之后要使用-=,否则会资源泄露。说明虽然我们没有显式传递this指针,但delegate暗地里引用了实例对象。这里只是为了说明delegate引用了实例对象,而不是说推荐使用多播代理,我想。
我本来只想说下一个内存泄漏常见的坑 delegate用+=完全没问题,我给他看的那个链接https://msdn.microsoft.com/en-us/library/ms173172.aspx,里面也介绍了关于+=的用法,说明微软也是支持这种写法的。网上也没有文章明确反对使用+=,所以我不知道他的言论是怎么来的
加载更多回复(12)

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧