C#——如果一个对象在以下范围内没有用处,我应该将其设为NULL吗

本文关键字:我应该 NULL 有用 一个对象 如果 范围内 | 更新日期: 2023-09-27 17:57:44

鉴于以下问题,我正在询问"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)
    {       
    }

感谢

C#——如果一个对象在以下范围内没有用处,我应该将其设为NULL吗

不,不要这样做。这只是一团糟,对任何方面都没有帮助,无论是形状还是形式1。垃圾收集器足够聪明,可以告诉程序代码中最后一次读取变量的时间,并允许对其进行垃圾收集。我假设您没有在代码的其他地方引用myWindow

就我个人而言,我会重写该代码,稍后声明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。。。但CCD_ 5似乎没有实现CCD_。不过,我怀疑您是否需要在ShowDialog()返回后调用Close()——它肯定会阻塞,直到窗口关闭为止。


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();
        myWindow.Close();
    }
}
catch (System.Exception ex)
{       
}

否。垃圾收集器仍然需要清理对象,这样做的唯一可能好处是,稍后在函数中尝试使用该对象的代码会得到一个null引用异常,这可能表明您不再希望使用该变量。在实践中,它几乎总是一个反模式。

取决于。CCD_ 10仍然在CCD_ 11块之后的范围内。即使它已经关闭,myWindow是否会在方法中被进一步引用?将其设置为null将明确您以后不引用它的意图(因为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变量?然后,一旦它离开该块,它就会超出范围,成为垃圾收集的候选者。