2010-10-18 22 views
8

Tôi có đoạn mã sau:Phân tích mã Cảnh báo 2214 - Cách khắc phục tốt nhất?

public partial class AuditLog : IBusinessEntity 
    { 
     public BusinessEntityType EntityType { get { return BusinessEntityType.AuditLog; } } 

     /// <summary> 
     /// Constructor accepting parameter initialization arguments 
     /// </summary> 
     /// <param name="userName"></param> 
     /// <param name="entity"></param> 
     /// <param name="command"></param> 
     /// <param name="commandText"></param> 
     public AuditLog(string userName, BusinessEntityType entity, AuditLogCommand command, string commandText) 
     { 
      this.Timestamp = DateTime.Now; 
      this.UserName = userName; 
      this.Entity = entity.ToString(); 
      this.Command = command.ToString(); 
      this.CommandText = commandText; 
     } 
    } 

này là tạo ra một cảnh báo CA2214. Các tham số phương thức BusinessEntityTypeAuditLogCommand đều là liệt kê. Tôi không thấy vấn đề là gì ở đây, và do đó không chắc chắn làm thế nào để đáp ứng các cảnh báo.

Cảm ơn.

Trả lời

14

Có một hoặc nhiều thuộc tính của bạn ảo không? Sau đó, đó là lý do tại sao, kể từ khi cảnh báo CA2214 is the "Do not call overridable methods in constructors".

Dưới đây là lý do cho sự cai trị từ MSDN:

Khi một phương pháp ảo được gọi, các loại thực mà thực hiện phương pháp không được chọn cho đến khi thời gian chạy. Khi một hàm tạo gọi phương thức ảo, nó có thể là hàm tạo cho trường hợp gọi phương thức chưa được thực hiện.

điều này có nghĩa là nếu ai đó kế thừa từ lớp học của bạn, và ghi đè một phương pháp hay tài sản đó được truy cập trong constructor bạn - sau đó thực hiện trọng sẽ bị ảnh hưởng trước khi các nhà xây dựng cho lớp kế thừa có chạy. Điều này có thể dẫn đến các vấn đề nếu việc thực hiện ghi đè dựa trên trạng thái được đặt trong hàm tạo.

Để thỏa mãn cảnh báo, bạn cần phải làm cho các thuộc tính và phương thức được truy cập trong hàm tạo không ảo (bạn có thể tạo kiểu được niêm phong, nếu thích hợp).

+0

Khi nó chỉ ra dòng 'this.Entity' có một setter gọi một phương thức ảo. Tôi đoán đó là vấn đề. –

+0

Có, cảnh báo sẽ kích hoạt nếu trình phân tích tĩnh có thể thấy, rằng bất kỳ phương thức ảo nào được gọi trong ctor. – driis

Các vấn đề liên quan