2012-10-22 25 views
6

CA1305 được nâng lên khi có quá tải yêu cầu IFormatProvider nhưng quá tải này không được sử dụng trong mã.CA1305: Độ dài khi chỉ định văn hóa

Ví dụ, đoạn mã sau đặt ra cảnh báo này:

string.Format("{0} - {1}", id, name); 

Cách rõ ràng để thoát khỏi cảnh báo này là để xác định văn hóa được sử dụng:

string.Format(CultureInfo.InvariantCulture, "{0} - {1}", id, name); 

Tuy nhiên, tôi nghĩ đây là cách quá dài dòng.

Những lựa chọn thay thế nào tồn tại?

Trả lời

2

Khá nhiều thay thế duy nhất có thể dẫn đến giảm độ dài trong khi vẫn bảo tồn nhà cung cấp định dạng rõ ràng sẽ là sử dụng các phương pháp mặt tiền cụ thể về văn hóa. May mắn thay, một định dạng thường chỉ dành cho InvariantCulture và CurrentCulture, do đó, chỉ có hai phương thức mặt tiền được yêu cầu cho mỗi phương thức định dạng cơ bản.

Một phương pháp mặt tiền điển hình cho mẫu mã của bạn có thể có một chữ ký như thế này:

public static string FormatForInvariantCulture(this string template, params object[] substitutions) 

và được gọi như sau:

"{0} - {1}".FormatForInvariantCulture(id, name); 

Một cách tiếp cận để tổ chức các phương pháp mặt tiền sẽ vào văn hóa loại định dạng cụ thể có thể được tiêm bằng kỹ thuật IoC. Ví dụ, một giao diện như sau có thể được định nghĩa cho định dạng:

trường
public interface IFormatter 
{ 
    string Format(string template, params object[] substitutions); 
} 

Văn hóa cụ thể sau đó có thể được tiêm vào loại mà cần phải thực hiện định dạng sử dụng nhà xây dựng như sau:

public SomeClass(IFormatter systemFormatter, IFormatter uiFormatter) 
{ 
    // ... 
} 

Bất kể về cách thức các phương pháp mặt tiền được đóng gói, điều quan trọng là phải xem xét rằng CA2241 (ProvideCorrectArgumentsToFormattingMethods) sẽ không kiểm tra việc sử dụng các phương pháp, do đó, có thể đáng xem xét việc thêm quy tắc tùy chỉnh để làm như vậy.

+0

OK, đó là điều tôi đã nghĩ ra, có vẻ như trong mã của tôi hiện tại: 'Format.Invariant (" {0} - {1} ", id, name)' và 'Format.ForUI'. Vấn đề là điều này chỉ giải quyết 'string.Format'. Nó sẽ không giải quyết bất kỳ trường hợp nào khác của cảnh báo này ... –

+0

Yup. Bạn có lẽ sẽ kết thúc việc tạo cặp phương thức mặt tiền cho mỗi phương thức định dạng mà bạn gọi thường xuyên. Ngoài ra, nếu bạn đi tuyến đường này, bạn nên biết rằng CA2241 ([ProvideCorrectArgumentsToFormattingMethods] (http://msdn.microsoft.com/en-us/library/ms182361.aspx)) sẽ không hiển thị mặt tiền, vì vậy bạn có thể muốn xem xét thêm quy tắc tùy chỉnh sẽ. –

+0

Bạn nghĩ gì về một lớp tĩnh 'For' với hai thuộc tính' Invariant' và 'UI'? 'Invariant' sẽ trả về' CultureInfo.InvariantCulture' và 'UI' sẽ trả về' CultureInfo.CurrentCulture'. Điều này sẽ dẫn đến mã như thế này: 'string.Format (For.Invariant," {0} - {1} ", id, name);' và bổ sung điều này có thể được sử dụng trong bất kỳ kịch bản nào làm tăng CA1305 và sẽ giải quyết vấn đề với CA2241. –

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