2010-08-11 40 views
7

thực tiễn tốt nhất cho chuyển đổi loại trong C# là gì?Các phương pháp hay nhất để chuyển đổi loại an toàn trong C# là gì?

int temp=System.ConvertToInt32(Request.QueryString["Id"]); 
    if (temp!=null) 
     { // logic goes here } 

này thất bại nếu Id bằng cách nào đó hóa ra là 'abc'

Xin tư vấn việc sử dụng các nhà khai thác ternary và báo cáo dòng khác ngoài việc nếu báo cáo khác (như sử dụng dòng duy nhất khai thác ternary). Ngoài ra, các bạn có thích TryParse hơn Chuyển đổi & tại sao không? Có bạn nói của bạn.

+1

Nhiệt độ sẽ không bao giờ rỗng trong chuỗi –

Trả lời

7

TryParse có lợi thế rõ ràng rằng trong trường hợp thất bại nó sẽ trả về false thay vì ném một ngoại lệ.

Các mô hình tiêu chuẩn sẽ là một cái gì đó như:

int value; 
if (int.TryParse(Request.QueryString["Id"], out value)) 
{ 
    // Use value 
} 
else 
{ 
    // Do whatever you want on failure 
} 

Bây giờ, nó cũng đáng ghi nhớ rằng bạn có thể cho int.TryParse một IFormatProvider và một NumberStyles - ví dụ, bạn cũng có thể muốn xác định CultureInfo.InvariantCulture như IFormatProvider nếu điều này thực sự có nghĩa là một ID được tạo tự động (thay vì ID do người dùng nhập).

Nếu bạn muốn một cách hiệu quả có "giá trị mặc định" bạn có thể viết một phương pháp helper như thế này:

public static int? NullableTryParseInt32(string text) 
{ 
    int value; 
    return int.TryParse(text, out value) ? value : (int?) null; 
} 

Sau đó, bạn có thể sử dụng như sau:

int value = NullableTryParseInt32(text) ?? 10; 

Hoặc bạn chỉ có thể viết một phương pháp có giá trị mặc định, tất nhiên :)

+0

Hi Jon, cảm ơn cho trả lời. Làm thế nào bạn sẽ làm điều đó tuyên bố với một nhà điều hành ternary? Ngoài ra không phải là 'ra' khởi tạo mỗi khi tôi đánh giá, phù hợp hoặc không phù hợp? Chúng ta có nên tránh tryParse chỉ vì điều đó không? –

+0

@Popo: Có, tham số 'out' được khởi tạo theo một trong hai cách, nhưng tại sao bạn lại tránh' TryParse' vì điều đó? Tôi đã thêm một vài tùy chọn khác để đơn giản hóa điều này trong trường hợp giá trị mặc định có ý nghĩa - nhưng rất thường là biểu mẫu đầu tiên thực sự là một tùy chọn để đi cùng. –

+0

Cảm ơn Jon, TryParse có trả về true/false không? Tôi có thể kiểm tra ngoại lệ trong TryParse như Sunrisas đã sử dụng Chuyển đổi không? –

0

sử dụng phương pháp TryParse của lớp int.

int temp; 
if (int.TryParse(Request.QueryString["Id"], out temp) 
    { // logic goes here } 

Nếu id không chứa số TryParse sẽ trả về false.

UPDATE: Thay đổi để hiển thị int.TryParse

+0

ở trên dường như không có phương pháp thử thách cho tôi ... Bạn chắc chắn bạn không có ý định nhập int.TryParse? – Chris

+0

Không phải là nhiệt độ của một mối quan tâm ở đây? –

+0

Tôi nghĩ rằng bạn có nghĩa là để sử dụng int.TryParse không có string.TryParse, sau khi tất cả lý do tại sao bạn sẽ muốn phân tích một chuỗi thành một chuỗi ;-) –

1

Khi nói đến giải quyết bất kỳ vấn đề nào có một số giải pháp tương tự, tôi cũng cố gắng tìm giải pháp thể hiện cho người đọc của mã những gì tôi đang cố gắng để thực hiện các cleæret. Trong oppinion của tôi có nghĩa là đi cho .TryParse trong trường hợp cụ thể này.

Sử dụng TryParse nói với người đọc rằng bạn đang không được bảo đảm rằng các đầu vào là hợp lệ (nếu bạn là tôi muốn sử dụng phân tích thay vì) Và kể từ khi bạn đang thực sự cố gắng để phân tích đầu vào như một int bạn cũng có thể để mã đọc dòng ý định của bạn

1

bạn có hai cách để làm điều đó

int i; 
if (Int32.TryParse(Request.QueryString["Id"], out i)) 
{ 
} 

hoặc bạn có thể làm:

try 
{ 
    Convert.ToInt32(Request.QueryString["Id"]); 
} 
catch (FormatException ex) 
{ 
    // The field Id it's not convertible 
} 
catch (Exception ex) 
{ 
    // It could throw also ArgumentException or OverflowException 
} 
+0

Hi sinrisas, làm thế nào tôi có thể bắt ngoại lệ trong tryParse? –

+0

Vâng, bạn có thể đặt nó vào câu lệnh bắt thử. Ngoại lệ duy nhất TryParse có thể ném, theo như tôi biết, đó là ArgumentException nhưng trong trường hợp này tôi cho rằng bạn sẽ luôn luôn vượt qua một chuỗi với nó, vì vậy bạn sẽ không bao giờ nhận được ngoại lệ như vậy. Ý tưởng đằng sau TryParse không sử dụng câu lệnh try try, vì nó trả về true hoặc false phụ thuộc vào sự thành công của chuyển đổi –

1

Sử dụng TryParse sẽ là lựa chọn tốt nhất. Bắt ngoại lệ từ phương thức chuyển đổi là hoạt động tốn kém.Tất nhiên TryParse sẽ chỉ chấp nhận các chuỗi trong khi Convert.ToInt32 sẽ lấy đối tượng và có thể thực hiện chuyển đổi (unboxing, down-casting từ dài/đôi) ngoài việc phân tích cú pháp.

1

Để trang trải các khía cạnh điều hành ternary của câu hỏi này:

Lời khuyên của tôi về việc sử dụng khai thác ternary không phải là để sử dụng chúng nếu bạn chưa quen thuộc với các mã trong câu hỏi đó nó đọc một cách tự nhiên cho bạn . Vết rạch làm cho người quen quen thuộc hơn và lạ lẫm, xa lạ.

Khi bạn đã lúng túng cuộc thảo luận về TryParse ở đây đủ để bạn thậm chí không cần phải suy nghĩ kỹ hơn nữa, việc chuyển đổi từ if-else sang?: Sẽ không chỉ là tầm thường, nó sẽ tự động. Cho đến lúc đó bạn sẽ chỉ thêm vào sự nhầm lẫn của riêng bạn.

Khi tôi không quen với một thứ gì đó, lúc đầu, tôi rơi xuống mã "em bé nói", tìm hiểu điều mới và sau đó tích hợp nó vào phong cách ngắn gọn hơn bình thường của tôi.

+0

Cảm ơn lời khuyên của Jon. –

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