【问题标题】:C# and .NET language: Replacing use of C MacroC# 和 .NET 语言:替换 C 宏的使用
【发布时间】:2024-04-12 01:30:02
【问题描述】:

我是 .Net 开发的新手,我正在寻找一些建议。

我有一段代码会引发一些异常。例如,如果我的数据库关闭,则会引发这些异常。我想让用户有能力在失败时重试执行的代码。

这是我的初始代码:

executeRequest();

我在 C 风格中的想法(但无论如何都在 C# 中工作):

do
{
    try
    {
        executeRequest();
        return;
    }
    catch (Exception exception)
    {
        ErrorMessagesUtils.ShowTaskErrorMessage(exception);
    }
} while (MessageBox.Show("Failed : Retry ?", "Error",
                         MessageBoxButtons.YesNo,
                         MessageBoxIcon.Question) == DialogResult.Yes);

它可以工作,但是用其他方法重现它真的很烦人。我想与 executeRequest 一起使用,但 不仅仅是

如果我使用 C 编码,我将使用 #define ASK_USER_TO_RETRY(funcname) ...code...。但是在 C# 中,我还没有找到以这种方式重用一段代码的方法。有什么想法吗?

【问题讨论】:

    标签: c# .net language-features


    【解决方案1】:

    您可以创建方法,该方法接受委托(要执行的方法):

    public void Execute(Action action)
    {
        do
        {
            try
            {
                action();
                return;
            }
            catch (Exception exception)
            {
                ErrorMessagesUtils.ShowTaskErrorMessage(exception);
            }
        } while (MessageBox.Show("Failed : Retry ?", "Error",
                     MessageBoxButtons.YesNo,
                     MessageBoxIcon.Question) == DialogResult.Yes);
    }
    

    用法:

    Execute(executeRequest);
    

    【讨论】:

    • 我也会这样做。在这里您可以阅读有关委托的更多信息(类似于 C 中指向方法的指针):msdn.microsoft.com/en-us/library/ms173171(v=vs.80).aspx,之后您可以阅读有关 lambda 表达式的信息:msdn.microsoft.com/en-us/library/bb397687.aspx
    • 见鬼,你比我*十秒 :)
    • 顺便说一句,如果你需要执行一些带参数的方法,你可以这样做: Execute(delegate { SomethingWithParam(param1, param2); });
    • 答案假设我没有其他选择来通过操作定义一个代表?当有很多不同的参数和很多不同的方法时,这部分很烦人:'(
    • 您可以使用 lambda 表达式通过 Execute 调用不同的方法:Execute(() => executeRequest(arg1))、Execute(() => executeRequest(arg1, arg2)) 等。
    【解决方案2】:

    看到用户在任何地方都没有到达的情况下敲击重试按钮,这总是一个非常可悲的景象。他们也坚持了一段时间,希望出现奇迹。半分钟后,他们会将鼠标切换到左手。

    一般的问题是他们会把问题归咎于。即使您与它无关,也无法做任何事情来解决问题。毕竟,是 承诺重试是有意义的。他们很快就会对你作为程序员失去信心,对你的产品是否可用且物有所值失去信心。除非您实际上在您的代码中有执行不同策略的方法,否则不要这样做。这非常罕见。

    【讨论】:

    • 您说得对,从设计的角度来看,让用户重试直到死亡并不是一个好方法。我明白了:)
    【解决方案3】:

    即使在 C 中为此使用宏也可能是个坏主意。如您所知,使用预处理器,您甚至看不到编译器看到的内容。我认为函数指针更适合这种情况。

    因此,正如其他人所提到的,在 C# 中,函数指针被替换为委托。如果您愿意,您可以将它们视为类型安全的函数指针

    我会推荐Pro C# 2010 and the .NET 4 PlatformC# Language Specification

    【讨论】:

      最近更新 更多