Tag: 代表

代表的目的是什么,在c#中是不可变的?

我正在阅读C#2012中的一本书,在“结合代表”一节中没有注意到这一点? 代表的目的是不可改变的。 组合代理到目前为止,您看到的所有代理在其调用列表中只有一个方法。 可以使用加法运算符“组合”代表。 操作的结果是创建一个新的委托,其中包含一个调用列表,该列表是两个操作数委托的调用列表的副本的串联。 例如,以下代码创建三个委托。 第三个代表是由前两个代表组合而成。 MyDel delA = myInstObj.MyM1; MyDel delB = SClass.OtherM2; MyDel delC = delA + delB; // Has combined invocation list 尽管组合代表这一术语可能会给人一种修改操作数委托的印象,但它们根本没有改变。 事实上,代表是不可改变的。 创建委托对象后,无法更改它。 图15-6说明了上述代码的结果。 请注意,操作数委托保持不变。

委托Generic Property.GetSetMethod

我正在尝试创建一个委托来设置generics的属性值,但我收到一个错误:当我尝试执行以下代码时Error binding to target method : Action setValue = (Action) Delegate.CreateDelegate( typeof(Action), null, property.GetSetMethod()); 这有可能吗?

为什么BeginInvoke不返回AsyncResult类型的引用?

当您调用委托对象的BeginInvoke时,系统会创建AsyncResult类型的对象,但BeginInvoke会返回IAsyncResult类型的引用(指向AsyncResult实例)。 为什么BeginInvoke不返回AsyncResult类型的引用? 感谢名单

隐式方法组转换问题

我想知道为什么给定代码的输出(在LinqPad中执行) void Main() { Compare1((Action)Main).Dump(); Compare2(Main).Dump(); } bool Compare1(Delegate x) { return x == (Action)Main; } bool Compare2(Action x) { return x == Main; } 总是: False True 在这两种情况下,我都天真地期望它是True 。

C# – 无法在方法中声明委托

我真的在这里搞砸了。 我想知道为什么我不能在方法中声明委托类型,而是我必须在类级别执行它。 namespace delegate_learning { class Program { // Works fine public delegate void anon_delgate(int i); static void Main(string[] args) { HaveFun(); Console.Read(); } public static void HaveFun() { // Throws an error :/ //delegate void anon_delgate(int i); anon_delgate ad = delegate(int i) { Console.WriteLine(i.ToString());}; } } } 编辑:我正在研究Lambda表达式,并根据我自己的个人知识对Lambdas之前的表达进行备份。

委托:方法名称预期错误

我正在尝试使用以下简单的Delegate示例。 根据我从中获取的一本书应该没问题,但我得到一个Method name expected错误。 namespace TestConsoleApp { class Program { private delegate string D(); static void Main(string[] args) { int x = 1; D code = new D(x.ToString()); } } } 有帮助吗?

C#中代理的意外性能不佳

我之前发布了关于在C#中动态编​​译代码的问题 ,答案又引出了另一个问题。 一个建议是我使用代表,我尝试过并且它们运行良好。 然而,它们比直接呼叫慢大约8.4 X,这没有任何意义。 这段代码有什么问题? 我的结果,.Net 4.0,64位,直接运行exe:62,514,530 public static int Execute(int i) { return i * 2; } private void button30_Click(object sender, EventArgs e) { CSharpCodeProvider foo = new CSharpCodeProvider(); var res = foo.CompileAssemblyFromSource( new System.CodeDom.Compiler.CompilerParameters() { GenerateInMemory = true, CompilerOptions = @”/optimize”, }, @”public class FooClass { public static int Execute(int i) { […]

Action,Func和Predicate委托 – C#

我试图理解Action, Func and Predicate委托之间的差异,作为我的WPF / MVVM学习的一部分。 我知道Action and Func都采用零到一个+参数,只有Func返回一个值,而Action则没有。 至于Predicate – 我不知道。 因此,我提出了以下问题: Predicate做什么? (欢迎举例!) 如果Action 什么都不返回,那么仅使用void会不会更简单? (或任何其他类型,如果它是我们正在讨论的Func 。) 我希望你在问题中避免使用LINQ / List示例。 我已经看过那些但是它们只是让它变得更加混乱,因为让我对这些代表“感兴趣”的代码与它无关(我想!)。 因此,我想使用我熟悉的代码来获得我的答案。 这里是: public class RelayCommand : ICommand { readonly Action _execute; readonly Predicate _canExecute; public RelayCommand(Action execute) : this(execute, null) { } public RelayCommand(Action execute, Predicate canExecute) { if (execute == null) […]

+运算符如何用于组合代理?

例如: delegate void SomeDelegate(); SomeDelegate a = new SomeDelegate( () => Console.WriteLine(“A”) ); SomeDelegate b = new SomeDelegate( () => Console.WriteLine(“B”) ); SomeDelegate c = a + b; 在最后一行, a + b转化为什么? 我很好奇如何在不使用+运算符的情况下添加它们。

包含实例方法委托的静态字典

我有一个像这样的巨大的switch语句这个方法: public bool ExecuteCommand(string command, string args) { bool result = false; switch (command) { case “command1”: result = Method1(args); break; case “command2”: result = Method2(args); break; // etc. } return result; } private bool Method1(string args) {…} 现在我想用Func委托的字典替换它,这样我就可以消除switch语句: private Dictionary<string, Func> _commands = new …; public MyClass() { _commands.Add(“command1”, Method1); // etc: } public […]