【问题标题】:Variable outside a try catch block loses valuetry catch 块外的变量失去价值
【发布时间】:2013-01-11 01:58:54
【问题描述】:

我有一个小问题。我有一个函数,它在 try-catch-finally 块之外有一个字符串,该函数会根据块内发生的情况而改变。完成后,我想显示它。我的问题是块中更改的值返回到它的原始值。我该如何解决这个问题?

string error = "No issues";

try{
    error = "Correct";
}catch(Exception ex){
    error = "Wrong:" + ex.Message.ToString();
}finally{
    // Closes connection
}

MessageBox.Show(error);

【问题讨论】:

  • 没有示例代码?真的吗?
  • finally 中更改它。它会一直运行(模数炸弹爆炸、JVM 错误、停电)。
  • 它会帮助你显示你当前的代码
  • @lukas:没有 JVM 错误会影响 .NET 代码 :-)
  • 该代码没有问题。请提供一个我们可以执行的代码示例来演示您的问题。

标签: c# .net


【解决方案1】:

我不清楚是否在方法之外声明了相关字符串。如果您 100% 确定字符串会被赋予一个新值,那么以下代码可能会解决您遇到的问题:

static void Foo(string s)
{
    try
    {
        s = "OK";
    }
    catch { }
}

static void Main(string[] args)
{
    string temp = "??";
    Foo(temp);
    Console.WriteLine(temp); //prints ??
    Console.ReadLine();
}

当您按值传递字符串时。如果您需要更改该值,您应该:

制作一个ref参数:

static void Foo(ref string s)

然后调用它

Foo(ref temp);

或从方法中返回新值:

    static string Foo(string s)
    {
        try
        {
            s = "OK";
        }
        catch { }
        return s;
    }

然后调用它:

temp = Foo(temp);

【讨论】:

    【解决方案2】:

    您发布的代码将显示一个带有文本的消息框

    正确

    如果没有抛出异常,否则提示消息

    错误:(加上异常的消息属性)

    它永远不会显示消息

    没有问题

    因为您在 try 块的第一行覆盖了 error 的初始值。

    鉴于您发布的代码,

    error 永远不会丢失一个值(我猜它会变成 null)。最终 error 将超出范围(例如,当您退出定义此代码的方法时)。

    更新

    我拿了你的代码,创建了一个全新的 WinForms 项目,双击 Form1 以创建一个 Load 事件处理程序,并在你的代码中发布如下:

        private void Form1_Load(object sender, EventArgs e)
        {
            string error = "No issues";
    
            try
            {
                error = "Correct";
            }
            catch (Exception ex)
            {
                error = "Wrong:" + ex.Message.ToString();
            }
            finally
            {
                // Closes connection
            }
    
            MessageBox.Show(error);
        }
    

    结果是一个显示“正确”的消息框。

    如果这不是您在真实代码中看到的内容,则说明您共享的代码不足以重现问题。

    【讨论】:

    • 好吧,事情就是这样:它向我显示“没有问题”,而它不应该显示。我跟踪了整个事情,但一旦它退出,它就会回到初始值“没有问题”。
    • @JesusZamora 一旦退出就没有任何价值。
    • 不,它确实有价值。它与它一起出现,一旦 try catch 时钟结束,它就会返回到初始化的值。它永远不会变为 null。
    • @JesusZamora:我只能想象你没有发布足够的代码来完全重现你所看到的。查看我的更新。
    猜你喜欢
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 2013-02-08
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    相关资源
    最近更新 更多