[英]Enhancing C# syntactic sugar (or getting around “Cannot use ref or out parameter”)
請忽略這樣的模式實際上是否是一個好主意。 理由是我想捕獲引發的錯誤,或插入/更新/刪除的記錄數不匹配。 我不想重復這種邏輯,當時,這種自定義感覺像是它將應用於不超過大約四個長的“腳本”方法。
我的第一步是使用匿名函數。
public void DoSqlAction(Func<bool> f, string task, string ctx, ref bool cont, List<ResultInfo> resultInfo) {
if (cont) {
bool ret = false;
try {
if (f.Invoke()) {
resultInfo.Add(new ResultInfo(seq, task, "Success", ctx, true));
cont = true;
} else {
resultInfo.Add(new ResultInfo(seq, task, "Fail", ctx, false));
cont = false;
}
} catch (Exception ex) {
resultInfo.Add(new ResultInfo(seq, task, "Error: " + ex.Message, ctx, false));
cont = false;
}
}
}
如果我嘗試使用此:
DoSqlAction(() => 1 == cx.Execute(someSql, anonymousTypeWithClassInstanceInside), "add item", refinfo.ToString(),ref cont, resultInfo);
AnonymousTypeWithClassInstanceInside <-錯誤源
錯誤出現:
無法在匿名方法,lambda表達式或查詢表達式中使用ref或out參數'abc'
解決方案是擺脫委托Func<bool> f
。 我正在寫此條目(也許應該是博客文章?),因為它認為生成編譯時錯誤有點困難。
在這篇文章中,我找到了Eric文章的鏈接:
這里
在看到foreach是如何實現的之后,我被帶到了……嗯……也許我正在尋求可定制的語法糖。
現在在C#4中可以嗎? C#5是否有可能? 這使我考慮在將來的某個時候研究http://nemerle.org ,但我真的很想留在C#中。
孤立地,編寫此代碼的一種更好的方法是:
public ResultInfo DoSqlAction(Func<bool> f, string task, string ctx) {
try {
if (f.Invoke()) {
return new ResultInfo(seq, task, "Success", ctx, true);
} else {
return new ResultInfo(seq, task, "Fail", ctx, false);
}
} catch (Exception ex) {
return new ResultInfo(seq, task, "Error: " + ex.Message, ctx, false);
}
}
在外面:
while (/* there's stuff to do */) {
var result = DoSqlAction(/* the next stuff */);
infos.Add(result);
if (!result.Succeeded)
break;
}
或同等學歷。 這樣就消除了奇特的副作用函數,ref參數等。而且它更短。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.