Tag: 委托

运算符’=>’在C#中意味着什么?

这句话中的’=>表示什么? del = new SomeDelegate(() => SomeAction()); 以上声明是否与此相同? del = new SomeDelegate(this.SomeAction); 谢谢。

如何使用reflection将事件处理程序附加到事件?

我知道EventInfo.AddEventHandler(…)方法,它可以用来将处理程序附加到事件。 但是,如果我甚至无法定义事件处理程序的正确签名,应该怎么做,因为我甚至没有引用处理程序所期望的事件args? 我将用正确的代码解释问题。 //当我在我的解决方案中提供一切可用的场景时,Zero Reflection Scenario。 internal class SendCommentsManager { public void Customize(IRFQWindowManager rfqWindowManager) { rfqWindowManager.SendComment += HandleRfqSendComment; } private void HandleRfqSendComment(object sender, SendCommentEventArgs args) { args.Cancel = true; } } 现在,我希望通过使用reflection来实现相同的目标。 我已经能够弄清楚它的大部分但是当我将一个委托附加到事件时(使用AddEventHandler )它会抛出”Error binding to target method.” 例外。 我理解这个exception背后的原因,将错误的委托附加到事件中。 但必须有一些方法来实现这一目标。 internal class SendCommentsManagerUsingReflection { public void Customize(IRFQWindowManager rfqWindowManager) { EventInfo eventInfo = rfqWindowManager.GetType().GetEvent(“SendComment”); eventInfo.AddEventHandler(rfqWindowManager, […]

代表用法:业务应用程序

背景 鉴于“大多数”开发人员是业务应用程序开发人员,我们最喜欢的编程语言的function将用于我们正在使用它们的上下文中。 作为C#/ ASP.NET应用程序开发人员,我倾向于在处理UI事件时仅使用委托。 事实上(这是我缺乏经验的一部分),我甚至不知道除了使用代表的事件之外的良好背景! 这非常可怕; 但是我知道在同一条船上还有其他开发商。 注意 :答案应该与.NET 2.0有关。 .NET 3.0将代理完全带到了不同的级别,这可能是一个单独的问题。 题: 除了事件,委托有多大用处,以及哪些业务应用程序上下文最有用? 更新 : Jarrod Dixon 有助于链接到关于委托使用的MSDN文档,我必须承认我最喜欢的设计模式书根本没有提出代表,所以除了UI事件之外我还没有真正看到它们的使用。 要扩展这个问题(只是一点点!),您可以为业务应用程序(或者实际上,任何必须处理相关问题的应用程序)提供哪些示例,以便更容易地消化关于该主题的MSDN文档?

delegate.Invoke是如何工作的?

如果我在我的代码中创建一个委托,如: delegate void dostuff (string o); 这将生成一个派生自System.MulticastDelegate的类,该类实现三个方法Invoke , BeginInvoke和EndInvoke 。 如果我查看已编译的IL for Invoke我看到的是: .method public hidebysig newslot virtual instance void Invoke(string o) runtime managed { } // end of method dostuff::Invoke 该方法不包含代码。 调用它确实有效 – 代理被调用,但我看不出它是如何做到的。 调用Invoke的伏都教在哪里实际调用委托来自哪里?

C#:更改数组中每个项的值

我想知道是否有内置的.NETfunction来根据提供的委托的结果更改数组中的每个值。 例如,如果我有一个数组{1,2,3}和一个返回每个值的平方的委托,我希望能够运行一个接受数组和委托的方法,并返回{1,4,9} 。 有这样的事情吗?

C#中出错:“非静态字段,方法或属性需要对象引用”

我在WPF中编写代码。 首先,我编写了一个单独的项目来测试使用COM端口设备的工作,它运行良好。 接下来我决定将它集成到另一个项目中,但是我收到了一个错误。 我没有改变代码; 我只是将它复制到一个新的代码文件中。 这段代码效果很好: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.IO.Ports; using System.Windows.Threading; namespace WpfApplication2 { /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window { public MainWindow() […]

C#事件:如何以并行方式处理事件

我有一个我希望以并行方式处理的事件。 我的想法是将每个回调添加到ThreadPool,effectivley有每个注册由ThreadPool处理的事件的方法。 我的试用代码如下所示: Delegate[] delegates = myEvent.GetInvocationList(); IAsyncResult[] results = new IAsyncResult[ delegates.Count() ]; for ( int i = 0; i < delegates.Count(); i++ ) { IAsyncResult result = ( ( TestDelegate )delegates[ i ] ).BeginInvoke( “BeginInvoke/EndInvoke”, null, null ); results[ i ] = result; } for ( int i = 0; i < delegates.Length; […]

为什么lambda表达式没有“实习”?

字符串是引用类型,但它们是不可变的。 这允许它们被编译器实现; 在出现相同的字符串文字的地方,可以引用相同的对象。 委托也是不可变的引用类型。 (使用+=运算符向多播委托添加方法构成赋值 ;这不是可变性。)而且,就像字符串一样,有一种“文字”方式来表示代码中的委托,使用lambda表达式,例如: Func func = () => 5; 该语句的右侧是一个类型为Func的表达式; 但我没有在任何地方显式调用Func构造函数(也不会发生隐式转换)。 所以我认为这基本上是一个文字 。 我在这里误解了我对“文字”的定义吗? 无论如何,这是我的问题。 如果我有两个变量,比如Func类型,我将两个相同的lambda表达式分配给: Func x = () => 5; Func y = () => 5; …什么阻止编译器将它们视为相同的Func对象? 我问,因为C#4.0语言规范的第6.5.1节明确指出: 将具有相同(可能为空)的捕获的外部变量实例集的语义相同的匿名函数转换为相同的委托类型是允许(但不是必需的)返回相同的委托实例。 这里使用语义相同的术语来表示在所有情况下,在给定相同参数的情况下,匿名函数的执行将产生相同的效果。 当我读到它时,这让我感到惊讶; 如果明确允许这种行为,我希望它能够实现。 但似乎并非如此。 事实上,这已经让很多开发人员陷入困境,尤其是 当lambda表达式用于成功附加事件处理程序而不能删除它们时。 例如: class EventSender { public event EventHandler Event; public void Send() { EventHandler handler = […]

委托任何方法类型 – C#

我想要一个将执行任何外部方法的类,如下所示: class CrazyClass { //other stuff public AnyReturnType Execute(AnyKindOfMethod Method, object[] ParametersForMethod) { //more stuff return Method(ParametersForMethod) //or something like that } } 这可能吗? 是否有代理人采用任何方法签名?

代表可以导致内存泄漏吗? GC.TotalMemory(true)似乎表明了这一点

码 using System; internal static class Test { private static void Main() { try { Console.WriteLine(“{0,10}: Start point”, GC.GetTotalMemory(true)); Action simpleDelegate = SimpleDelegate; Console.WriteLine(“{0,10}: Simple delegate created”, GC.GetTotalMemory(true)); Action simpleCombinedDelegate = simpleDelegate + simpleDelegate + simpleDelegate; Console.WriteLine(“{0,10}: Simple combined delegate created”, GC.GetTotalMemory(true)); byte[] bigManagedResource = new byte[100000000]; Console.WriteLine(“{0,10}: Big managed resource created”, GC.GetTotalMemory(true)); Action bigManagedResourceDelegate […]