2009-12-17 35 views
8

Sau khi chạy phân tích Mã trong VS2010 beta (FxCop cho các phiên bản trước) Tôi nhận được cảnh báo sau đây:Validating C# cơ sở tham số constructor lớp

Trong bên ngoài phương pháp có thể nhìn thấy 'Identity.Identity (WindowsIdentity)', xác thực tham số 'windowsIdentity' trước khi sử dụng.

Các nhà xây dựng là:

public Identity(WindowsIdentity windowsIdentity) 
     : base(windowsIdentity.Token) 
{ 
     init(); 
} 

cho một lớp học định nghĩa là:

public class Identity : WindowsIdentity 

Câu hỏi của tôi là, làm thế nào để xác nhận các thông số WindowsIdentity? Tôi có nên xác nhận nó trong constructor, và ném một ngoại lệ, hoặc là có một cách tốt hơn để gọi này?

Trả lời

12

Bạn có thể xác nhận nó trong một phương pháp tĩnh:

public Identity(WindowsIdentity windowsIdentity) 
     : base(GetToken(windowsIdentity)) 
{ 
     init(); 
} 

static Token GetToken(WindowsIdentity ident) 
{ 
    if(ident == null) 
     throw new ArgumentNullException("ident"); 

    return ident.Token; 
} 

(Tôi không bận tâm đến việc tìm kiếm các loại WindowsIdentity.Token, nhưng bạn sẽ có được ý tưởng)

2

Tôi tin FXCop báo cáo lỗi này ở đây vì nó cho rằng bạn có thể gặp NullReferenceException bằng cách truy cập windowsIdentity khi gọi hàm tạo lớp cơ sở.

Một cách để thêm một kiểm tra xác nhận for null sẽ có thêm một chức năng private static đến lớp của bạn mà có thể kiểm tra các thông số WindowsIdentity for null và có hành động thích hợp:

private static WindowsIdentity ValidateIdentity(WindowsIdentity identity) 
{ 
    if(identity == null) 
     throw new ArgumentNullException("identity"); 
    // possibly some other validation checks here... 

    return identity;   
} 

public Identity(WindowsIdentity windowsIdentity) 
    : base(ValidateIdentity(windowsIdentity).Token) 
{ 
    init(); 
} 

cách tiếp cận khác sẽ được sử dụng toán tử bậc ba để xác minh tham số, như sau:

public Identity(WindowsIdentity windowsIdentity) 
    : base(windowsIdentity == null ? null : windowsIdentity.Token) 
{ 
    init(); 
} 

Nhưng, bạn nên tự hỏi mình sẽ làm gì? Nếu bạn chỉ đơn giản là sẽ ném một ngoại lệ, nó có thể được ok để cho mã đứng như là, vì nó sẽ đã thông qua một NullReferenceException nếu đối số là null.

1

Đó là khiếu nại bởi vì nếu bạn vượt qua NULL như windowsIdentity, sau đó khi chuỗi nhà xây dựng đến lớp cơ sở nó sẽ ném một ngoại lệ tham chiếu null.

Cách tốt nhất để giải quyết nó phụ thuộc vào thiết kế của bạn. Bạn có thể kiểm tra xem nó for null như thế này:

:base(windowsIdentity == null ? null : windowsIdentity.Token) 

Hoặc bạn có thể thực hiện một constructor trong constructor lớp cơ sở mà phải mất một WindowsIdentity như một tham số, và có nhà xây dựng mà làm điều đó một phần của xác nhận. Về cơ bản có rất nhiều cách để đối phó với nó, chỉ cần sử dụng những gì làm việc tốt nhất trong tình huống của bạn.

0

FX cảnh sát là nói bạn rằng tham số không thể là null, vì vậy nếu bạn thực sự cần nó, bạn nên xác nhận nó bằng cách nào đó. Vì bạn đang sử dụng nó trong hàm khởi tạo, bạn có thể muốn có một giá trị khác với giá trị rỗng, vì vậy bạn nên xác thực nó ở đó để dừng FX cop làm phiền bạn ..

Nếu bạn cần một hàm tạo bằng null, bạn nên có một giá trị khác constructor không có tham số.

Nếu bạn không sử dụng hoặc bạn đang xác thực nó ở một điểm khác, bạn có thể bỏ qua cảnh báo.

Để tránh vấn đề với FXcop, bạn nên ném ArgumentNullException.

1

Tính đến C# 6.0, bạn có thể sử dụng kết hợp với null-coalescing operatornull-conditional operator như thế này:

public Identity(WindowsIdentity winIdentity) 
    : base(winIdentity?.Token ?? throw new ArgumentNullException(nameof(winIdentity))) 
{ 
    init(); 
} 
Các vấn đề liên quan