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)
{
}
感谢
不,不要这样做。这只是一团糟,对任何方面都没有帮助,无论是形状还是形式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
变量?然后,一旦它离开该块,它就会超出范围,成为垃圾收集的候选者。