拥有一次性田地的类型应该是一次性的。 怎么解决这个警告?

我尝试在VisualStudio 2012使用“运行代码分析”选项,因此我收到了警告

 CA1001 Types that own disposable fields should be disposable Implement IDisposable on 'DBConnectivity' because it creates members of the following IDisposable types: 'SqlConnection', 'SqlCommand'. 

我在SO中提到了一些问题,但是我无法IDisposable和以下是该类,负责此警告。

 class DBConnectivity { public SqlConnection connection = null; public SqlCommand command = null; public SqlDataReader dataReader = null; public string connectionString = null; public List masterTableList; public DBConnectivity() { connectionString = ConfigurationManager.ConnectionStrings["Master"].ConnectionString; connection = new SqlConnection(connectionString.ToString()); //-----Master table results connection.Open(); string masterSelectQuery = "SELECT * FROM MASTER_TABLE"; command = new SqlCommand(masterSelectQuery, connection); dataReader = command.ExecuteReader(); masterTableList = new List(); while (dataReader.Read()) { MasterTableAttributes masterTableAttribute = new MasterTableAttributes() { fileId = Convert.ToInt32(dataReader["Id"]), fileName = Convert.ToString(dataReader["FileName"]), frequency = Convert.ToString(dataReader["Frequency"]), scheduledTime = Convert.ToString(dataReader["Scheduled_Time"]) }; masterTableList.Add(masterTableAttribute); } dataReader.Close(); connection.Close(); } } 

我真的很困惑实现IDisposable。 任何帮助表示赞赏

我完全同意编译器 – 你需要在这里处理你的字段,或者(如前所述) – 首先不要让它们成为字段:

 class DBConnectivity : IDisposable // caveat! read below first { public void Dispose() { if(connection != null) { connection.Dispose(); connection = null; } if(command != null) { command.Dispose(); command = null; } if(dataReader != null) { dataReader.Dispose(); dataReader = null; } } 

请注意,您将通过using(...)使用此类型


然而! 看起来静态方法更合适:

 static class DBConnectivity { public static List GetMasterTableList() { var connectionString = ConfigurationManager.ConnectionStrings["Master"].ConnectionString; using(var connection = new SqlConnection(connectionString)) { connection.Open(); const string masterSelectQuery = "SELECT * FROM MASTER_TABLE"; using(var command = new SqlCommand(masterSelectQuery, connection)) using(var dataReader = command.ExecuteReader()) { var masterTableList = new List(); while (dataReader.Read()) { MasterTableAttributes masterTableAttribute = new MasterTableAttributes() { fileId = Convert.ToInt32(dataReader["Id"]), fileName = Convert.ToString(dataReader["FileName"]), frequency = Convert.ToString(dataReader["Frequency"]), scheduledTime = Convert.ToString(dataReader["Scheduled_Time"]) }; masterTableList.Add(masterTableAttribute); } return masterTableList; } } } } 

或者用“dapper”这样的工具更简单:

 static class DBConnectivity { public static List GetMasterTableList() { var connectionString = ConfigurationManager.ConnectionStrings["Master"].ConnectionString; using(var connection = new SqlConnection(connectionString)) { connection.Open(); const string sql = "SELECT Id as [FileId], FileName, Frequency, Scheduled_Time as [ScheduledTime] FROM MASTER_TABLE"; return connection.Query(sql).ToList(); } } } 

如果那是你完成的类,你应该移动构造函数中的所有SQL变量。 或者可能将构造函数更改为返回masterTableList的静态函数