簡體   English   中英

增強C#語法糖(或解決“不能使用ref或out參數”)

[英]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文章的鏈接:

C#不能在匿名方法主體中使用ref或out參數

這里

http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx

在看到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM