参考类型的成员是否应该在一次性课程中只读标记?

时间:2017-01-08 14:48:47

标签: c# memory-leaks garbage-collection idisposable

问题说明

  1. 我有一个使用公认惯例实现IDisposable的类。请参阅以下示例中的FooClass。为简单起见,我使用string字段;试着想象这个类有合法的理由来实现IDisposable
  2. FooClass初始化自己的引用类型依赖项FooMember(不理想,但假设它是必要的)。
  3. FooMember是一个只读字段。
  4. 通常情况下,我会在处理过程中将引用类型成员设置为nullFooMember是只读的,所以我不能。请参阅下面示例中的注释行。
  5. 根据标准,我已指示垃圾收集器使用FooClass取消GC.SuppressFinalize的最终确定(见下文)。
  6. 问题

    1. "foo"的实例被处置并超出范围后,垃圾收集器是否会将FooClass留在内存中?
    2. 引用类型成员是否应该在一次性类中标记为readonly
    3. 示例

      public FooClass : IDisposable
      {
          public FooClass()
          {
              FooMember = "foo";
          }
      
          public void Dispose()
          {
              if (IsDisposed)
              {
                  return;
              }
      
              try
              {
                  Dispose(true);
              }
              finally
              {
                  IsDisposed = true;
                  GC.SuppressFinalize(this);
              }
          }
      
          protected virtual void Dispose(bool disposing)
          {
              if (disposing)
              {
                  // The line below won't compile because FooMember is read-only.
                  // FooMember = null;
              }
          }
      
          private readonly string FooMember;
          private bool IsDisposed = false;
      }
      

0 个答案:

没有答案