这是使用Dispose方法的正确方法吗?

时间:2012-07-12 05:56:12

标签: asp.net c#-4.0 idisposable

这里我在aspx.cs中使用了dispose方法,但我不确定处理对象的方式是否以正确的方式完成。 Obvisoly我从网上冲浪并在我的代码中使用它,你可以说,对象是以正确的格式处理。

这是我在aspx.cs中的方法

public List<CausesField> list(DataTable dt)
        {
             List<CausesField> lst = new List<CausesField>();
            foreach (DataRow row in dt.Rows)
            {

                    using (CausesField SignUpDetails = new CausesField())
                    {
                        SignUpDetails.FirstName = row["FirstName"].ToString();
                        SignUpDetails.LastName = row["LastName"].ToString();
                        SignUpDetails.Birthdate = row["BirthDay"].ToString();
                        SignUpDetails.Gender = row["Gender"].ToString();

                        lst.Add(SignUpDetails);
                        SignUpDetails.Dispose();
                    }


            }
            return lst;

        }

我的班级档案:

public  class CausesField:IDisposable
    {

        public string FirstName { get; set; }  public string LastName { get; set; }

        public string Birthdate { get; set; }  public string Gender { get; set; }

         private Component component = new Component();

        private bool disposed = false;

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        private void Dispose(bool disposing)
        {
            // Check to see if Dispose has already been called.
            if (!this.disposed)
            {
                // If disposing equals true, dispose all managed 
                // and unmanaged resources.
                if (disposing)
                {
                    // Dispose managed resources.
                    component.Dispose();
                }

            }
            disposed = true;
        }
    }

2 个答案:

答案 0 :(得分:3)

使用“using”语句时不需要处置实例。提供给using语句的对象实现了IDisposable接口,以便在finally块中调用dispose()方法。

您的上述using (CausesField SignUpDetails = new CausesField())语句将等同于以下代码:

CausesField SignUpDetails = new CausesField();
try
{
//To do code here
}
finally
{
    if(SignUpDetails!=null)
    {
       SignUpDetails.Dispose();
    }
}

答案 1 :(得分:3)

using语句会在块结束时自动调用Dispose,因此您不应再自行调用它。

另外,一般情况下,除非你持有一些外部资源(锁,文件句柄,套接字,数据库连接等)或非托管内存(我怀疑你的情况就是如此),你不应该有一个终结器或Dispose方法。垃圾收集器负责释放托管内存。