C#—如果对象在以下范围内没有用处,我应该将其空吗?

问题描述

| 考虑到以下问题,我要问“ C#最佳实践”。
    File.WriteallText(\"YourXaml.xaml\",txtXamlData.Text);

    Window myWindow = null;
    try
    {
        using (Stream sr = File.Open(\"YourXaml.xaml\",FileMode.Open))
        {
            myWindow = (Window)XamlReader.Load(sr);
            myWindow.ShowDialog();
            myWindow.Close();
            myWindow = null; // **should we do this?**
        }
    }
    catch (System.Exception ex)
    {       
    }
谢谢     

解决方法

不,不要这样做。它只是杂乱无章,不会以任何形式,形状或形式提供帮助。垃圾回收器非常聪明,可以告诉您何时在程序代码中最后一次读取了变量,并且无论如何都将对其进行垃圾回收。我假设您没有在代码的其他地方引用“ 1”? 我个人将在稍后重写该代码以声明
myWindow
File.WriteAllText(\"YourXaml.xaml\",txtXamlData.Text);

try
{
    using (Stream sr = File.Open(\"YourXaml.xaml\",FileMode.Open))
    {
        Window myWindow = (Window)XamlReader.Load(sr);
        myWindow.ShowDialog();            
    }
}
catch (Exception ex)
{
    ... 
}
请注意,我最初在这里有一个
using
语句来处理
myWindow
...,但是看来
Window
并没有实现
IDisposable
。我怀疑您是否会在返回
ShowDialog()
之后调用
Close()
-当然,它会阻塞直到窗口关闭。 1好的,如果您正在调试并且正在逐步执行,它将允许更早地进行垃圾回收,并且已到达该行之后的位置。在发布模式下,这毫无意义。     ,如果在代码的后续部分中不使用ѭ1,则可以将其声明更接近其用法:
File.WriteAllText(\"YourXaml.xaml\",FileMode.Open))
    {
        Window myWindow = (Window)XamlReader.Load(sr);
        myWindow.ShowDialog();
        myWindow.Close();
    }
}
catch (System.Exception ex)
{       
}
    ,不会。垃圾收集器仍然需要清理对象,这样做的唯一可能的好处是,稍后尝试使用该函数的代码将获得空引用异常,这可能表明您不再打算用于要使用的变量。实际上,它几乎总是反模式。     ,要看。
try...catch
块之后仍是scope1ѭ。即使已关闭,方法中还会进一步引用ѭ1吗?将其设置为“ 15”将明确表明您的意图是以后不再引用它(因为NullReferenceException应该引起他们的注意。 似乎更好的方法是将myWindow的声明移到try子句中,而不用担心。
try
{
    using (Stream sr = File.Open(\"YourXaml.xaml\",FileMode.Open))
    {
      Window myWindow = (Window)XamlReader.Load(sr);
      myWindow.ShowDialog();
      myWindow.Close();
    }
}
catch (System.Exception ex)
{       
}
    ,为什么不只是在
using
块中声明
myWindow
变量呢?然后,一旦离开该块,它将超出范围,将成为垃圾回收的候选对象。