这合法吗?它是否包含隐藏的错误或缺陷?Visual Studio不会给出任何错误或警告,但ReSharper会:
/// <summary>
/// immutable tuple for two
/// </summary>
public class Pair<TValue1, TValue2> : Singleton<TValue1>
{
public TValue2 Value2 { get; private set; }
public Pair(TValue1 value1, TValue2 value2, Func<Pair<TValue1, TValue2>, String> toStringFunc)
: this(value1, value2, () => toStringFunc(this)) { } //Red light
}2> : Singleton<TValue1>
Run Code Online (Sandbox Code Playgroud) 标题有点说明了一切.通常的SOS命令!没有名字,bpmd没有很多好处.
我有一些想法:
我的团队中有一位同事在Delphi开发的项目中广泛使用了闭包.个人,我不喜欢这个,因为是使代码难于阅读,我认为,只有当你需要他们倒闭应该被使用.
在另一方面,我读过有人可以向我解释匿名方法吗?和其他相关的链接,这一点,我在考虑,也许我错了,所以我要你给我一些例子时,最好改为使用"老时尚"的方式关闭的(不使用闭包).
在查找这个问题的答案时:" 为什么在匿名方法中不允许使用out参数? "我对lambda表达式和匿名方法实际上如何工作有点遗憾.
在评论中,JaredPar声称"想象一下,例如out参数引用堆栈上的局部变量.lambda可以在将来的任意点执行,因此可以在堆栈帧不再有效时执行".
我指出,如果不是任何其他变量的情况......这基本上让我想知道我对lambda表达式的真正了解.
我想到的是这样的事情:
public void Foo(ComplexObject val, out SomeDelegate outDelegate)
{
ComplexObject obj = new ComplexObject(val)
SomeDelegate = delegate(int other) { return (obj.value * other); }
}
public void Bar()
{
SomeDelegate MyDel = null;
Foo(5, out MyDel);
int finalRes = MyDel(100);
// Whatever
}
Run Code Online (Sandbox Code Playgroud)
在那种情况下,我真的不知道发生了什么.obj是堆栈上的引用,它在方法返回时不再有效,因此匿名方法应该能够(如果可行)实际知道它是引用类型并复制引用而不是值,如果它...如果"用例"或多或少相同,为什么不参考params工作呢?
我希望能够定义一个内联匿名选择器,选择器只需要一个选择器作为参数.
这是可能的,还是我必须吮吸它并定义一个方法?
背景:在我的iPhone应用程序中,我需要从另一个线程更新我的UI.要做到这一点,我使用performSelectorOnMainThread:withObject:waitUntilDone:但是,我希望能够获得此功能,而无需定义整个其他方法.
public static void Main(string[] args)
{
Action a = () => Console.WriteLine(MethodInfo.GetCurrentMethod().Name);
a();
}
Run Code Online (Sandbox Code Playgroud)
这段代码将返回一个不起眼的字符串,如下所示:<Main>b__0.
有没有办法忽略匿名方法并获得更易读的方法名称?
我想公开一个可以采用可选匿名方法的函数:
type
TParamsProc = reference to procedure(Params: TSQLParams);
TFieldsProc = reference to procedure(Fields: TSQLResult);
TDbController = class
...
public
procedure Select(const SQL: sting; ParamsProc: TParamsProc; FieldsProc: TFieldsProc);
end;
implementation
procedure TDbController.Select(const SQL: sting; ParamsProc: TParamsProc; FieldsProc: TFieldsProc);
var
Q: TUIBQuery;
begin
Q := TUIBQuery.Create(nil);
try
Q.Database := FDatabase;
Q.Transaction := FTransaction;
Q.SQL.Text := SQL;
ParamsProc(Q.Params);
Q.Open;
while not Q.Eof do
begin
FieldsProc(Q.Result);
Q.Next;
end;
finally
Q.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
有时我没有传递给SQL查询的参数,我想让ParamsProc可选.
这段代码不起作用:
if ParamsProc <> nil then ParamsProc(Q.Params);
Run Code Online (Sandbox Code Playgroud)
也不是这个:
if @ParamsProc <> …Run Code Online (Sandbox Code Playgroud) 我尝试使用Delphi的匿名方法语法:
type
fun = reference to function(): Integer;
Run Code Online (Sandbox Code Playgroud)
Fpc显示语法错误:
Error: Identifier not found "reference"
Run Code Online (Sandbox Code Playgroud)
什么是免费Pascal相当于Delphi的匿名方法,如果有的话?
此单元无法在XE2 Update 3中编译,并显示错误"内部错误:SY6315".在XE中没有这样的问题.
unit Test;
interface
uses
SysUtils;
var
Proc: TProc;
implementation
initialization
Proc := procedure
var ByteArr: array of Byte;
begin
SetLength(ByteArr, 10);
end;
end.
Run Code Online (Sandbox Code Playgroud)
有没有人有这个问题的经验?
更新:我已提交质量控制报告:QC#102888.
关于立即启动计时器的一个很好的答案,我可以看到以下代码:
timer.Elapsed += timer_Elapsed;
ThreadPool.QueueUserWorkItem((_) => DoWork());
...
void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {
DoWork();
}
void DoWork() {
// etc...
}
Run Code Online (Sandbox Code Playgroud)
我自己尝试了,我碰到了这一行,我认为匿名委托构造中有一个错字:
What?
|
V
ThreadPool.QueueUserWorkItem((_) => DoWork());
Run Code Online (Sandbox Code Playgroud)
哪个隐藏规则使得下划线"_"可以作为匿名委托中的参数名称接受?
c# ×5
delphi ×4
lambda ×3
closures ×2
.net ×1
debugging ×1
delegates ×1
delphi-2010 ×1
freepascal ×1
iphone ×1
objective-c ×1
reflection ×1
selector ×1
sos ×1
windbg ×1