【问题标题】:Exceptions causing junk data in string (C#)导致字符串中的垃圾数据的异常 (C#)
【发布时间】:2008-10-08 03:20:58
【问题描述】:

好吧,这很奇怪。垃圾数据也不是随机的,它似乎是可执行文件本身的子字符串。

private void Form1_Load(object sender, EventArgs e)
{
    string s = GetValue();
    // at this point, s == "400". Why isn't really relevant (dumbed down a test)
    if (s != "18446744073709551615") 
        throw new Exception();
        // When the exception is thrown though, the string is set to random
        // data from inside the executable.
}

这似乎取决于 GetValue() 中某些看似无关紧要的实现细节,例如对 string.Format() 的调用位于不同的位置。

有没有人遇到过类似的事情或有任何想法可能导致这种情况?

【问题讨论】:

  • 我觉得GetValue()的定义不管多长都应该包含进去
  • 另一个大问题是您如何检查“s”中的数据,更重要的是“何时”检查该数据?您是否在抛出异常并且“s”现在超出范围后检查它?
  • 是的,这是在 VS 弹出后,它是未处理的异常内容。不过,我不记得以前发生过局部变量的情况。
  • 我正在 VS 的“Locals”窗口中检查它

标签: c# exception


【解决方案1】:

“我正在VS的“Locals”窗口中检查它”

这就解释了。与流行的看法相反,C# 允许进行一些优化。如果您不在函数末尾添加“KeepAlive”,则实际上不必存储该值。

【讨论】:

  • 和 Ryan 一样的问题:为什么在函数开头声明的整数不会像字符串一样随着异常一起消失?
  • 你怎么知道它是否消失了?它在不同的位置占用的空间更少,所以它不太可能被踩到。
  • 嗯,也因为这是C#,int是值类型,string是引用类型。
【解决方案2】:

如果您在抛出异常并且现在超出范围后检查变量,那么它应该指向内存中的垃圾。您是否尝试在引发异常之前和之后检查此变量的值?

【讨论】:

  • 这似乎是这种情况......但为什么它似乎只发生在字符串上?如果我有一个范围相同的整数,我可以在“Locals”窗口中看到它的值。
猜你喜欢
  • 2022-01-08
  • 2015-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多