Tag: 委托

.NET 4.0和C#4.0中的事件和委托逆转

在调查这个问题时,我对C#4.0中新的协方差/逆变特性将如何影响它感到好奇。 在Beta 1中,C#似乎不同意CLR。 回到C#3.0,如果你有: public event EventHandler Click; ……然后你在其他地方: button.Click += new EventHandler(button_Click); …编译器会barf因为它们是不兼容的委托类型。 但是在C#4.0中,它编译得很好,因为在CLR 4.0中,类型参数现在标记为in ,因此它是逆变的,因此编译器假定多播委托+=将起作用。 这是我的测试: public class ClickEventArgs : EventArgs { } public class Button { public event EventHandler Click; public void MouseDown() { Click(this, new ClickEventArgs()); } } class Program { static void Main(string[] args) { Button button = new Button(); […]

c#中有函数指针吗?

我正在尝试学习一些c#编码,并想知道函数指针的c ++概念是否包含在c#中。 我看到有代表这样的事情。 它们是相同的概念吗? 或者他们在更基础的层面上有所区别?

在C#中附加事件处理程序的两种不同方式是否存在实际差异?

在C#中,引擎盖之间有任何真正的区别(除语法之外): myButton.Click += new EventHandler(myMemberMethod); 和 myButton.Click += myMemberMethod; ?

委派任务并在完成时收到通知(在C#中)

从概念上讲,我想完成以下操作,但却无法理解如何在C#中正确编码: SomeMethod { // Member of AClass{} DoSomething; Start WorkerMethod() from BClass in another thread; DoSomethingElse; } 然后,当WorkerMethod()完成时,运行以下命令: void SomeOtherMethod() // Also member of AClass{} { … } 任何人都可以举一个例子吗?

为异步执行排队操作/代理

框架中是否有某些东西允许我异步执行委托队列? 我的意思是我希望代表按照排队的顺序一次执行一个但我希望整个过程以异步方式运行。 队列也不固定,会定期添加其他委托,并且一旦到达队列顶部就应该处理。 我不需要特别使用Queue ,这就是我如何描述所需的行为。 我可以自己写一些东西去做,但如果有内置的东西,我可以使用,而不是更好。 我简要地查看了ThreadPool.QueueUserWorkItem因为它允许按顺序执行,但是可以找到一种令人满意的方法来防止一次执行多个执行。

委托可以有一个可选参数吗?

我有下面的代码工作正常,直到我尝试添加bool NetworkAvailable = true部分。 现在我在下面第4行得到一个Method name expected编译时exception。 void NetworkStatus_AvailabilityChanged(object sender, NetworkStatusChangedArgs e) { var networkAvailable = e.IsAvailable; SetUpdateHUDConnectedMode d = new SetUpdateHUDConnectedMode(UpdateHUDConnectedMode(networkAvailable)); this.Invoke(d); } delegate void SetUpdateHUDConnectedMode(bool NetworkAvailable = true); private void UpdateHUDConnectedMode(bool NetworkAvailable = true) { … } 无可否认,我是Delegates和Optional Parameters新手,所以我将不胜感激。 谢谢。

使用“Control.CheckForIllegalCrossThreadCalls = false”是不错的主意

我有一个从serialport接收数据的类。 我使用action delegate将数据传递到文本框中显示的表单。 事情是我无法访问textbox控件,因为它说: Cross-thread operation not valid: Control accessed from a thread other than the thread it was created on 。 所以我设置Control.CheckForIllegalCrossThreadCalls = false ,它正在工作。 这样做是个好主意吗? 或者有更好的方法。 谢谢

我可以定义具有相同名称但不同参数的2个代理吗?

我试图在Int32和IntPtr之间定义一个委托覆盖。 为什么以下超载非法? public delegate int EnumWindowsCallback (System.IntPtr hWnd, int lParam); public delegate int EnumWindowsCallback (System.IntPtr hWnd, System.IntPtr lParam); 这看起来很奇怪。 它们都是结构但是不同并且从不同的接口实现。 想想看,我从来没有尝试过代理过代表。 它甚至是合法的,如果是的话,为什么? 更新:在完成答案和更多SOpost之后,我感到困惑的是,即使使用不同数量的参数也无法声明代表。 我仍然想知道为什么在运行时无法解决这个问题。

为什么C#三元运算符不能与代理一起使用?

分支选择函数时,使用三元运算符选择函数可能是有意义的,但这是不可能的。 为什么? public class Demo { protected bool branch; protected void demo1 () {} protected void demo2 () {} public Action DoesntWork() { return branch ? demo1 : demo2; } } 编译器产生以下错误: Cannot implicitly convert type `method group’ to `System.Action’

离散匿名方法共享一个类?

我在这里和Eric Lippert的Ref课一起玩。 我注意到在IL中看起来两个匿名方法都使用相同的生成类,即使这意味着类有一个额外的变量。 虽然只使用一个新的类定义似乎有点合理,但令我感到奇怪的是,只创建了一个c__DisplayClass2实例。 这似乎意味着Ref两个实例都引用相同的c__DisplayClass2并不意味着在收集vart1之前无法收集y ,这可能比joik返回后发生得晚得多? 毕竟,不能保证一些白痴不会写一个函数(直接在IL中)直接访问y通过vart1 joik返回。 也许这甚至可以用reflection而不是疯狂的IL来完成。 sealed class Ref { public delegate T Func(); private readonly Func getter; public Ref(Func getter) { this.getter = getter; } public T Value { get { return getter(); } } } static Ref joik() { int[] y = new int[50000]; int x = 5; Ref vart1 […]