Tag: 委托

隐式强制转换对委托类型推断的意外影响

我有一个简单的Money类型,带有decimal的隐式decimal : struct Money { decimal innerValue; public static implicit operator Money(decimal value) { return new Money { innerValue = value }; } public static explicit operator decimal(Money value) { return value.innerValue; } public static Money Parse(string s) { return decimal.Parse(s); } } 我定义了一个Sum()重载来操作这些值: static class MoneyExtensions { public static Money Sum(this IEnumerable source, Func […]

我应该使用EventHandler 和/或EventArgs委托模式吗?

阅读我的C#书,它讨论了在MS喜欢的模式中使用事件/代理(我假设我认为事件相当于没有成员变量访问的公共委托): public delegate Something(object o, EventArgs e) 然后进入有关EventArgs解释,基本上不需要委托声明: public EventHandler events 与(我认为)相同 private delegate Something(object o, SomeEventArgs e); public event Something events; 使用EventHandler是个好主意吗? 我可以看到为什么发送object可能有用,但不是所有时间 – 而且很多时候,EventArgs可能会变得很烦人。

异步多播代理

我最近在一个广泛使用事件的项目上做了一些工作。 我需要做的一件事是在多播委托上异步调用多个事件处理程序。 我认为诀窍是在GetInvocationList中的每个项目上调用BeginInvoke,但看起来好像BeginInvoke不存在。 有没有办法做到这一点,或者我是否需要开始使用ThreadPool.QueueUserWorkItem并以这种方式滚动我自己的解决方案?

如果事件在.NET中作为委托实现,那么.event IL部分的重点是什么?

我在Stack Overflow上看到了一些关于委托,事件和这两个特性的.NET实现的非常好的问题。 特别是一个问题,“ C#Events如何在幕后工作? ”,产生了一个很好的答案,可以很好地解释一些微妙的观点。 上述问题的答案提出了这一点: 当您声明类似字段的事件时……编译器会生成方法和私有字段(与委托类型相同)。 在类中,当您引用ElementAddedEvent时,您指的是该字段。 在课外,你指的是这个领域 从同一个问题(“类字段事件 ”)链接的MSDN文章添加: 引发事件的概念恰好等同于调用事件所代表的委托 – 因此,没有用于引发事件的特殊语言结构。 为了进一步检查,我构建了一个测试项目,以便查看事件和委托编译到的IL: public class TestClass { public EventHandler handler; public event EventHandler FooEvent; public TestClass() { } } 我希望委托字段handler和事件FooEvent编译成大致相同的IL代码,并使用一些其他方法来包装对编译器生成的FooEvent字段的访问。 但是IL产生的不是我预期的: .class public auto ansi beforefieldinit TestClass extends [mscorlib]System.Object { .event [mscorlib]System.EventHandler FooEvent { .addon instance void TestClass::add_FooEvent(class [mscorlib]System.EventHandler) .removeon instance void TestClass::remove_FooEvent(class […]

如何在UML类图中最好地表示c#.net事件构造?

我正在设计一个实体/组件系统,其中实体内部通信的问题由事件消息系统解决。 组件分为两部分,一部分在实体中,一部分在子系统中“实体代理”,通过观察者类型系统保持同步。 我正在尝试使用事件和代理进行实现。 我试图模拟我的应用程序的事件/消息系统的结构,我遇到代理问题。 它现在的方式是一个图表(附加),显示系统中的delegate,eventArgs和实​​体,但是它们之间关系的性质仅表示为通用关联。 我还有第二张图显示了系统的接口。 我需要显示在这些对象中引发的事件,因为这是系统中大部分复杂性的地方。 我知道我也需要动态协作和时序图,但我想弄清楚我需要什么样的类型和多少不同的事件支持类以及inheritance结构的样子。 我想给自己一个我知道将一起工作的消息类型的选择。 我想我可以从这些预定义类型中选择EventArgs派生和委托类型,以便在动态图表和组件构建时重用。 我无法弄清楚的主要问题是,是将事件建模为属性还是操作。 我一直在尝试使用委托的关联类和带有事件构造型的OnSomeEvent()类型操作。 我不喜欢这个,因为事件不是一个操作。 我已经使用这个On ****()命名约定在代码中保护了方法。 这种方法并未真正捕获委托签名,多播行为和观察者模式。 其他人用什么方法来表达这些复杂且紧密耦合的类? 对我来说,图表的重点是既要文档又要更全面地理解系统中的接口。 在我的过程的这个阶段,我希望冻结接口并继续实现组件本身。

Winformsmultithreading:每次在UI线程上调用方法时都要创建一个新的委托吗?

我想调用一个操作UI线程控件的方法。 我的代码有效,我想优化。 我指的是MSDN上的这个资源 。 根据那里,我们应该这样做 public delegate void myDelegate(int anInteger, string aString); //… Label1.Invoke(new myDelegate(myMethod), new Object[] {1, “This is the string”}); 这会在每次调用时引入一个孤立的委托对象(内存泄漏)吗? 当我像下面那样使用委托的静态实例时,然后在每次调用时使用此实例来调用: private static _delegateInstance = new myDelegate(myMethod); //… Label1.Invoke(_delegateInstance , new Object[] {1, “This is the string”}); 这是线程安全吗? 我认为这会有更好的性能,因为委托实例只创建一次?

如何使用表达式树创建一个空委托?

使用匿名方法,您可以创建自C#2.0以来的空委托。 public event EventHandler SomeEvent = delegate {}; public event Action OtherEvent = delegate {}; 这对于防止在调用事件时必须进行空检查非常有用 。 如何使用表达式树创建相同的行为? 我现在看到的唯一可能的选择是使用Expression.Lambda() ,但据我所知,这将需要大量的额外工作。

C#中generics类型的命名空间范围别名

让我们举个例子: public class X { } public class Y { } public class Z { } public delegate IDictionary<Y, IList> Bar(IList x, int i); public interface IFoo { // … Bar Bar { get; } } public class Foo : IFoo { // … public Bar Bar { get { return null; //… } } […]

BeginInvoke()是否运行单独的线程?

在我的WPF应用程序中,我想在非UI线程中做一些工作,以避免UI变得无响应。 为此我做了这个: var caller = new AsyncMethodCaller(this.SetPatternType); caller.BeginInvoke(_patterns, null, null); 代表被定义为, public delegate void AsyncMethodCaller(IEnumerable data); 我的问题是: BeginInvoke()是否创建了一个新线程并且回调SetPatternType在其中运行? 如果是这样,这个post能持续多久? 这种方法总的来说好吗? 如果没有,它有什么问题? 我可能面临哪些潜在的问题? 我正在使用C#4.0和Visual Studio 2010。 编辑: 我还需要一些关于这些的指导方针: 当我自己创建一个新线程时,我应该何时使用BeginInvoke() ? 什么时候应该使用DispatcherObject.Dispatcher.BeginInvoke()对象?

委托数组

我正在尝试从委托数组中调用委托函数。 我已经能够创建委托数组,但是如何调用委托? public delegate void pd(); public static class MyClass { static void p1() { //… } static void p2 () { //… } //… static pd[] delegates = new pd[] { new pd( MyClass.p1 ), new pd( MyClass.p2) /* … */ }; } public class MainClass { static void Main() { // Call pd[0] […]