问题描述
|
考虑到以下问题,我要问“ 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
变量呢?然后,一旦离开该块,它将超出范围,将成为垃圾回收的候选对象。