关于 C# Unmanaged object Disposing 的一些最佳实践问题

Some best practice questions about C# Unmanaged object Disposing

我正在开发单声道和 .net 应用程序。我有一些关于最佳实践的基本问题。

  1. 如果我需要创建一个只使用一次的非托管对象(可能传递给一个方法或调用其中一个方法)并且以后不需要它,我应该将它分配给首先是一个变量然后使用它以便我可以处理它(或者可以在 using() 块中分配变量)或者我应该像 new Class().Method() 那样使用以便 GC 能够收集它?最佳做法是什么?

  2. 我是否需要处理仅具有方法局部范围的对象,或者如果我处理作为 class(全局)属性的对象就足够了吗?

  3. 我有一个Class A和一个Class B。B的一个对象是在Class A的某个方法M中创建的。这个对象(的class B) 有另一个方法 M2,它调用 Class A,M3 中的第二个方法。所以结构如下

    Class A
    {
      void M()
      {
       var b = new B();
       }
      public string M3()
      {
        return "OK";
       }
      }
      Class B
      {
        void M2()
        {
         Console.WriteLine(new A().M3();
         }
       }
    

这会创建循环引用并停止 GC 收集这两个对象吗?

良好的内存高效编程的其他一般原则是什么?

这个问题有很大的风险变成 "too broad",即 Whosebug 的题外话。也就是说,一些简要答案:

  1. If I need to create an unmanaged object just to be used once (may be pass to a method or invoke one of it's method) and don't need it later… What is the best practice?

使用任何非托管对象的最佳做法是将其包装在 SafeHandle 的实例中。当然,您必须处理的最常见的非托管对象已经由 .NET 包装,或者在 IDisposable(例如 StreamReader)的某些自定义实现中,或者在较新的框架代码中,作为 SafeHandle 子类.

但是,当您处理自己的非托管对象时,.NET 不了解,您将希望遵循 .NET 的示例并使用 SafeHandle

  1. Do I need to dispose of objects which has only a local scope of a method or is it enough if I dispose of object that are properties of the class (global)?

如果您创建了对象,并且没有将它传递给其他代码以供其拥有,并且您不打算从方法中 return 它,那么您需要处置它。您确实需要处理仅在方法中引用的对象。

通常您会使用 using 语句来执行此操作。

  1. …Will this create a cyclic reference a stop GC from collecting these two objects?

暂时忽略您的代码示例无法编译,也不包含任何引用循环……:)

与某些内存管理方案(例如引用计数)不同,.NET 的垃圾回收根本不存在任何循环引用问题。根据是否可以从 root 引用访问对象,确定该对象是否可收集。两个相互引用的无根对象仍然无法从根引用访问,因此都是可收集的。

What are the other general principles for good Memory efficient programming?

对于 Whosebug 来说,这绝对太宽泛了。即使在 .NET 使用的基于 GC 的系统中,也有很多值得关注的细节。基本系统消除了许多常见的编程错误,但它有自己的特殊行为,在某些情况下理解这些行为很重要。

花一些时间浏览有关该主题的 MSDN 和 Web 文章将帮助您了解有关 .NET 和一般垃圾回收的更多信息。如果您有其他具体问题,请随时在 Whosebug post 上提出。