标签: anonymous-methods

使用匿名方法

我没有使用匿名方法.我找到了一个代码,其中列表正在迭代,如代码片段1所示.为什么代码片段1优先于2?

    List<String> names = new List<String>(); 

    ... 
    //Code snippet 1
    names.ForEach(delegate(String name)
    {
        Console.WriteLine(name);
    });

    //Code snippet 2
    foreach (string name in names)
    {
        Console.WriteLine(name);
    }
Run Code Online (Sandbox Code Playgroud)

.net c# anonymous-methods

4
推荐指数
1
解决办法
1500
查看次数

什么允许匿名无参数委托类型不同?

阅读文章"匿名方法"(作为文章系列"C#3.0中的代理和Lambda表达式"的一部分)中的短语:

  • " 高级主题:无参数匿名方法

    ...允许匿名方法省略参数列表(delegate { return Console.ReadLine() != ""}例如).这是非典型的,但它确实允许相同的匿名方法出现在多个场景中,即使委托类型可能会有所不同 "*

我变得有点困惑.

IMO(现在找不到但据我记得),类型由参数列表确定,但不是由方法的返回类型确定.这是对的吗?

那么,无参数方法或委托的类型如何不同?

任何(最简单的)代码示例说明了相同的匿名方法的不同无参数委托类型将是值得赞赏的.

c# lambda delegates anonymous-methods anonymous-types

4
推荐指数
1
解决办法
541
查看次数

这还是关闭吗?

testit()方法是一个闭包.aString已超出范围,但testit()仍然可以在其上执行.testit2()使用的是一个没有超出范围(mystring)的变量,但是它也没有传递给testit2().testit2()被认为是封闭吗?

string mystring = "hello world";
Action testit = new Action(delegate { string aString = "in anon method"; Debug.WriteLine(aString); });
testit();

//capture mystring.  Is this still a closure?
Action testit2 = new Action(delegate { Debug.WriteLine(mystring); });
//mystring is still in scope
testit2();
Run Code Online (Sandbox Code Playgroud)

在第二个示例中,mystring可以在方法之外更新,这些更改将反映在testit2()中.这不像普通方法,只能捕获mystring作为参数.

.net c# closures function anonymous-methods

3
推荐指数
1
解决办法
398
查看次数

匿名方法/功能:基本功能还是违反OO原则?

最近主流语言(如perl和C#)对匿名方法/功能的转变是重要的,还是违反OO原则的奇怪功能?

最近的库是最新版本的英特尔的线程构建模块和微软PPL和Linq,依赖于这些东西是不是一件好事?

当前拒绝匿名方法/功能的语言(如Java)在坚持纯粹的OO模型时做出了明智的选择,还是由于缺乏基本的编程功能而落后?

c# java perl anonymous-methods anonymous-function

3
推荐指数
2
解决办法
558
查看次数

使用Func <>参数将Delegate对象传递给方法

我有一个方法Foo4接受类型为Func <>的参数.如果我传递一个匿名类型的参数,我没有错误.但是,如果我创建并传递一个引用具有正确签名的Method的"委托"类型的对象,则会出现编译器错误.在这种情况下,我无法理解为什么我会收到错误.

class Learn6
    {
        delegate string Mydelegate(int a);
        public void Start()
        {
            Mydelegate objMydelegate = new Mydelegate(Foo1);

            //No Error
            Foo4(delegate(int s) { return s.ToString(); });

            //This line gives compiler error.
            Foo4(objMydelegate);

        }

        public string Foo1(int a) { return a.ToString();}



        public void Foo4(Func<int, string> F) { Console.WriteLine(F(42)); }
    }
Run Code Online (Sandbox Code Playgroud)

.net c# delegates anonymous-methods c#-3.0

3
推荐指数
1
解决办法
3582
查看次数

在Javascript匿名函数内部进行范围设计

我正在尝试从ajax调用返回数据,然后我可以使用它.问题是函数本身被许多对象调用,例如:

function ajax_submit (obj)
{   
    var id = $(obj).attr('id');
    var message = escape ($("#"+id+" .s_post").val ());

    var submit_string = "action=post_message&message="+message;

    $.ajax({  
        type: "POST",  
        url: document.location,  
        data: submit_string,  
        success: function(html, obj) {
            alert (html);
        }  
    }); 

    return false;
}
Run Code Online (Sandbox Code Playgroud)

这意味着在匿名'成功'函数内部我无法知道调用obj(或id)实际上是什么.我能想到的唯一方法就是将id附加到文档中,但这看起来有点过于粗糙.还有另一种方法吗?

javascript jquery scope anonymous-methods

3
推荐指数
1
解决办法
681
查看次数

如何在c#中确定匿名函数参数?

鉴于以下代码,

    public T Execute<T>(Func<T> methodParam)
    {
        return methodParam ();
    }

    public void CallMethodsAnonymously<T>()
    {
        T result =  Execute(() => _service.SomeMethod1());
        T result1 = Execute(() => _service.SomeMethod2(someParm1));
        T result2 = Execute(() => _service.SomeMethod3( someParm1, someParm2));
    }
Run Code Online (Sandbox Code Playgroud)

从Execute方法,是否可以检查"methodParam"并提取或确定匿名函数体内的参数数量?例如,是否可以从Execute方法中确定someParam1和someParam2的值?

c# delegates anonymous-methods func

3
推荐指数
1
解决办法
1485
查看次数

匿名方法的源代码

如何获取匿名方法的源代码?

例如:

Func<Boolean> func = (() => DateTime.Now.Seconds % 2 == 0);

Console.WriteLine(GetSourceCode(func)); // must: DateTime.Now.Seconds % 2 == 0

String GetSourceCode<T>(Func<T> f) - ???
Run Code Online (Sandbox Code Playgroud)

.net c# reflection anonymous-methods

3
推荐指数
1
解决办法
266
查看次数

关于以防万一,C#匿名方法的语法比lambda表达式的语法简单.书:Professional C#5.0和.NET 4.5.1

最近,我读了"Christian Cage的专业C#5.0和.NET 4.5.1; Jay Glynn; Morgan Skinner"一书.我对此感到困惑:"以防万一,匿名方法的语法比lambda表达式的语法更简单".

第8章中的详细信息:Delegates,Lambdas和Events

LAMBDA EXPRESSIONS"注意lambda表达式的语法比匿名方法的语法简单.在要调用的方法有参数但不需要参数的情况下,匿名方法的语法更简单,因为你不能在这种情况下需要提供参数."

任何人都可以解释/示例为什么匿名方法在这种情况下不需要提供参数?

.net c# lambda anonymous-methods

3
推荐指数
1
解决办法
214
查看次数

我可以将Delphi TThread.Synchronize()本地移动到VCL表单以从主线程或工作线程调用吗?

我正在使用CreateAnonymousThread作为工作任务,当我开始使用它时,我在整个声明中使用了Synchronize,根据文档示例,例如:

procedure Txxx.RunWorker;
begin
     FExecutionThread := TThread.CreateAnonymousThread(procedure ()
     begin

        TThread.Synchronize (TThread.CurrentThread,
          procedure ()
          begin
            // Here before worker stuff
            NotifyBeforeWorkerStuff; 

          end);

        // Do worker stuff

        TThread.Synchronize (TThread.CurrentThread,
          procedure ()
          begin
            // Here after worker stuff
            NotifyAfterWorkerStuff;
          end);
      end);

      FExecutionThread.Start;
    end;
end;
Run Code Online (Sandbox Code Playgroud)

如您所见,在此线程中,我向我的应用程序的各个部分启动事件通知,包括VCL表单(NotifyBeforeWorkerStuff等).后来,我看到我可以将Synchronize()更多地本地移动到每个VCL表单,接近实际需要它更新(非安全)VCL控件的点:

    procedure TSomeVCLForm.ReceiveNotification;
    begin
      TThread.Synchronize (TThread.CurrentThread,
          procedure ()
          begin
            Label1.Caption := GetSomeStringFunction;
          end);
     end;
Run Code Online (Sandbox Code Playgroud)

只要我接收来自主线程或工作线程的通知,工作线程就会变得更简单:

   procedure Txxx.RunWorker;
   begin
     FExecutionThread := TThread.CreateAnonymousThread(procedure ()
       begin

         NotifyBeforeWorkerStuff; 

         // Do worker stuff

         NotifyAfterWorkerStuff;

       end);

     FExecutionThread.Start;
   end;
Run Code Online (Sandbox Code Playgroud)

关于这是否正确,我有几个问题:

  1. 我的通知可能来自工作线程,也来自主线程(例如,从按下按钮导出).因此,当从主线程调用VCL表单上的"ReceiveNotification"时,是否允许如上所述调用TThread.Synchronize?在该XE8文档意味着没有了,但是检查System.Classes这看起来不错,它工作正常.
  2. 当Label1.Caption从GetSomeStringFunction中获取字符串时,在"ReceiveNotification"内,是否正确,即使调用来自工作线程,也绝对不需要在该函数中进行锁定?

谢谢你的建议.

delphi multithreading anonymous-methods thread-safety

3
推荐指数
1
解决办法
2897
查看次数