C# 如何安全地处理变量?

C# 如何安全地处理变量?,c#,console-application,dispose,C#,Console Application,Dispose,以下代码中的变量purge和factory安全处理的替代/更好方法是什么 public void Run( string XmlFragment ) { XmlNode xmlNode = null; try { xmlNode = Common.ConstructXmlNodeFromString(XmlFragment, "Params");

以下代码中的变量
purge
factory
安全处理的替代/更好方法是什么

        public void Run( string XmlFragment ) {
            XmlNode xmlNode = null;

            try
            {
                xmlNode = Common.ConstructXmlNodeFromString(XmlFragment, "Params");
                var list = DataList();

                foreach (var item in list)
                {
                    var factory = new PurgerFactory(item);
                    IPurger purge = factory.Purger;

                    purge.Purge();

                    purge = null;
                    factory = null;
                }

                Common.PurgeEmail(SuccessEmail());
            }
            catch (Exception ex)
            {
                string errorMessage = $"Purge Error:  {ex.Message}. {Environment.NewLine} Stack Trace: {ex.StackTrace}";
                Common.PurgeEmail(FailEmail(errorMessage));
            }
        }
我想你知道,C#有一个垃圾收集器。因此,对于不访问非托管资源的普通对象,只需让垃圾收集器清理它们就可以了

如果要确定地关闭托管资源,则主要范例继承自
IDisposable
using
语句。这将在退出using语句的代码块时调用Dispose函数

如果你想清理东西,但不在乎什么时候发生,你可以使用
~(MyType)
。当GC执行GC循环时,将调用此函数,称为终结器。我个人还没有遇到过这个vs
IDisposable
的用例。但是,如果您只是想确保在垃圾收集此电子邮件对象时删除文件或其他内容,那么它可能是一个很好的使用案例。

我想您知道,C#有一个垃圾收集器。因此,对于不访问非托管资源的普通对象,只需让垃圾收集器清理它们就可以了

如果要确定地关闭托管资源,则主要范例继承自
IDisposable
using
语句。这将在退出using语句的代码块时调用Dispose函数


如果你想清理东西,但不在乎什么时候发生,你可以使用
~(MyType)
。当GC执行GC循环时,将调用此函数,称为终结器。我个人还没有遇到过这个vs
IDisposable
的用例。但是,如果您只是想确保在垃圾收集此电子邮件对象时删除某个文件或其他内容,那么这可能是一个很好的使用案例。

您的代码不会指示是否清除
工厂
实现
IDisposable
。如果他们这样做了,你会打电话的

purge.Dispose();
factory.Dispose();
或者使用
using
,确保即使方法引发异常,也会调用
Dispose

using(var factory = new PurgerFactory(item))
{
    // do stuff
} // factory is disposed.
我们不需要做的是将变量设置为
null
。对象在不再有任何引用后的某个时间被垃圾收集。设置
factory=null
确实会删除对对象的引用,但当变量超出范围时,同样的情况也会发生。所以这是多余的

真的没有必要强迫它早点发生。对象不会在没有更多引用时立即被垃圾回收,所以我们不太担心这一点

在这种情况下,变量都是在
foreach
循环中声明的,因此每次循环迭代后引用都会立即超出范围。换句话说,当您将它们设置为null时,它们已经超出了范围


这就是.NET令人敬畏的一部分。想象一下,如果我们必须将每个引用变量设置为null。我们需要
try/catch
无处不在,以确保它发生。就好像每件物品都是一次性的。真是一场噩梦。相反,它是在大多数正常情况下为我们处理的,这样我们就不必去想它,也不必把代码弄得乱七八糟。

您的代码没有指明是清除还是工厂实现
IDisposable
。如果他们这样做了,你会打电话的

purge.Dispose();
factory.Dispose();
或者使用
using
,确保即使方法引发异常,也会调用
Dispose

using(var factory = new PurgerFactory(item))
{
    // do stuff
} // factory is disposed.
我们不需要做的是将变量设置为
null
。对象在不再有任何引用后的某个时间被垃圾收集。设置
factory=null
确实会删除对对象的引用,但当变量超出范围时,同样的情况也会发生。所以这是多余的

真的没有必要强迫它早点发生。对象不会在没有更多引用时立即被垃圾回收,所以我们不太担心这一点

在这种情况下,变量都是在
foreach
循环中声明的,因此每次循环迭代后引用都会立即超出范围。换句话说,当您将它们设置为null时,它们已经超出了范围


这就是.NET令人敬畏的一部分。想象一下,如果我们必须将每个引用变量设置为null。我们需要
try/catch
无处不在,以确保它发生。就好像每件物品都是一次性的。真是一场噩梦。相反,它在大多数正常情况下都是为我们处理的,这样我们就不必考虑它,也不必把代码弄得乱七八糟。

确切的意思是什么?
PurgerFactory
IPurger
类型是否实现了
IDisposable
?如果是这样,为什么不以通常的方式使用
呢?如果不是,你说的“处置”是什么意思?你的问题不清楚。请把它修好,以便它能解释代码是什么,你想让它做什么,以及你具体在什么方面有困难。变量类型<代码>清除<代码>还是代码>工厂<代码>实现<代码> IDISPABLE < /Code >?这听起来像是我从C++到C语言时所遇到的问题。C#使用一个内存管理器(垃圾收集器),当对象不再被使用时,它会清理对象,所以你不需要做很多事情。确切地说,这意味着什么?
PurgerFactory
IPurger
类型是否实现了
IDisposable
?如果是这样,为什么不以通常的方式使用
呢?如果不是,你说的“处置”是什么意思?你的问题不清楚。请修复它,使它包括一个好的,并解释它是代码做什么,你希望它做什么,以及你有什么具体的困难,计算o