为什么这里有无法访问的代码?

Ric*_*ard 5 c#

我正在编写ac#app并希望将错误消息输出到控制台或消息框(取决于应用程序类型:enum AppTypeChoice {Console,Windows}),并且还控制应用程序是否继续运行(bool StopOnError).

我想出了这个检查所有标准的方法,但是我收到了"无法检测到的代码"警告.我看不出原因!

这是整个方法(为一些业余爱好者代码支持你自己!)


    public void OutputError(string message)
    {
        string standardMessage = "Something went WRONG!. [ But I'm not telling you what! ]";
        string defaultMsgBoxTitle = "Aaaaarrrggggggggggg!!!!!";
        string dosBoxOutput = "\n\n*** " + defaultMsgBoxTitle + " *** \n\n Message was: '" + message + "'\n\n";
        AppTypeChoice appType = DataDefs.AppType;
        DebugLevelChoice level = DataDefs.DebugLevel;

        // Decide how much info we should give out here...
        if (level != DebugLevelChoice.None)
        {
            // Give some info....
            if (appType == AppTypeChoice.Windows)
                MessageBox.Show(message, defaultMsgBoxTitle, MessageBoxButtons.OK, MessageBoxIcon.Error);
            else
                Console.WriteLine(dosBoxOutput);
        }
        else
        {
            // Be very secretive...
            if (appType == AppTypeChoice.Windows)
                MessageBox.Show(standardMessage, defaultMsgBoxTitle, MessageBoxButtons.OK, MessageBoxIcon.Error);
            else
                Console.WriteLine(standardMessage);
        }

        // Decide if app falls over or not..
        if (DataDefs.StopOnError == true)
            Environment.Exit(0); // UNREACHABLE CODE HERE
    }

另外,虽然我有你的注意,为了获得应用程序类型,我只是在文件的顶部使用一个常量(即在控制台应用程序中的AppTypeChoice.Console等) - 是否有更好的方法来做到这一点(我意味着在代码中找出它是DOS还是Windows应用程序)?

此外,我注意到我可以在控制台应用程序中使用带有完全限定路径的消息框...这样做有多糟糕(我的意思是,当其他开发人员看到它时,我会得到涂焦油和羽毛吗?!)

谢谢你的帮助

SLa*_*aks 10

DataDefs.StopOnError是一个等于的编译时常量false.

因此,编译器会在编译过程开始时将其替换为false(或者无论您将其设置为什么).

因此,您的代码编译为:

if (false == true)
    Environment.Exit(0); // UNREACHABLE CODE HERE
Run Code Online (Sandbox Code Playgroud)

这显然是无法到达的.

最简单的解决方案是制作DataDefs.StopOnError字段readonly而不是const.

如果涉及的所有值都是编译时常量或文字,编译器将仅发出此警告,因此使用任何其他类型的字段DataDefs.StopOnError将停止警告.


Chr*_*ris 1

具体看这段代码...

DebugLevelChoice level = DataDefs.DebugLevel;

        // Decide how much info we should give out here...
        if (level != DebugLevelChoice.None)
Run Code Online (Sandbox Code Playgroud)

上面的代码将无法访问,因为您设置level为始终如此DebugLevel,所以它永远不会None。如果您能告诉我们更多有关错误内容的信息,例如,其所在行或哪些代码无法访问,这将对我们有进一步帮助。