我没有使用匿名方法.我找到了一个代码,其中列表正在迭代,如代码片段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) 阅读文章"匿名方法"(作为文章系列"C#3.0中的代理和Lambda表达式"的一部分)中的短语:
" 高级主题:无参数匿名方法
...允许匿名方法省略参数列表(delegate { return Console.ReadLine() != ""}例如).这是非典型的,但它确实允许相同的匿名方法出现在多个场景中,即使委托类型可能会有所不同 "*
我变得有点困惑.
IMO(现在找不到但据我记得),类型由参数列表确定,但不是由方法的返回类型确定.这是对的吗?
那么,无参数方法或委托的类型如何不同?
任何(最简单的)代码示例说明了相同的匿名方法的不同无参数委托类型将是值得赞赏的.
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作为参数.
最近主流语言(如perl和C#)对匿名方法/功能的转变是重要的,还是违反OO原则的奇怪功能?
最近的库是最新版本的英特尔的线程构建模块和微软PPL和Linq,依赖于这些东西是不是一件好事?
当前拒绝匿名方法/功能的语言(如Java)在坚持纯粹的OO模型时做出了明智的选择,还是由于缺乏基本的编程功能而落后?
我有一个方法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) 我正在尝试从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附加到文档中,但这看起来有点过于粗糙.还有另一种方法吗?
鉴于以下代码,
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的值?
如何获取匿名方法的源代码?
例如:
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) 最近,我读了"Christian Cage的专业C#5.0和.NET 4.5.1; Jay Glynn; Morgan Skinner"一书.我对此感到困惑:"以防万一,匿名方法的语法比lambda表达式的语法更简单".
第8章中的详细信息:Delegates,Lambdas和Events
LAMBDA EXPRESSIONS"注意lambda表达式的语法比匿名方法的语法简单.在要调用的方法有参数但不需要参数的情况下,匿名方法的语法更简单,因为你不能在这种情况下需要提供参数."
任何人都可以解释/示例为什么匿名方法在这种情况下不需要提供参数?
我正在使用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)
关于这是否正确,我有几个问题:
谢谢你的建议.