2008-10-04 32 views
10

Quay lại VB6, tôi đã viết một vài chức năng cho phép tôi mã hóa mà không phải quan tâm đến sự khác biệt giữa null và '' cho chuỗi, null và 0 cho số, v.v. năng suất cao hơn khi mã hóa hơn là phải thêm mã trường hợp đặc biệt để xử lý dữ liệu có thể gây ra một số lỗi không liên quan; 9999/10000 nếu một cái gì đó tôi đang sử dụng như là một số là null, sau đó thực sự tôi coi nó là 0.Chức năng trợ giúp để chuyển đổi an toàn từ các chuỗi

Tôi hiện đang ở C#, và sự khác biệt giữa VB6 và C# 2005 là khá rộng ... vì vậy tôi không thực sự biết bắt đầu từ đâu để viết bộ chức năng trợ giúp mới của tôi, hoặc nếu tôi thậm chí cần phải làm tất cả. Vì vậy, tôi cần phải viết một hàm có thể chấp nhận một chuỗi, một trường cơ sở dữ liệu, một biểu mẫu yêu cầu/trường truy vấn, và sau đó làm bất cứ điều gì nó có thể làm để biến nó thành một đôi, và trả về điều đó đến thủ tục gọi điện.

Tôi cũng cần làm điều này cho quần short, int16, int32, dài, mọi thứ khác mà tôi có thể quan tâm.

Sau đó, tôi sẽ làm điều này cho chuỗi. Và ngày tháng.

Đây có phải là một sự theo đuổi đáng giá không? Có một cái gì đó trong khuôn khổ hoặc C# mà tôi có thể sử dụng thay thế? Tôi thực sự mong muốn điều gì đó sẽ cho phép tôi sử dụng dữ liệu nội tuyến trong việc gọi các chức năng khác và không phải tạo biến tạm thời, v.v.

Trả lời

33

Có rất nhiều chức năng chuyển đổi được tích hợp sẵn. Nhưng ... tôi không chắc chắn bất kỳ người trong số họ làm chính xác những gì bạn muốn. Nói chung, các phương thức .NET sai về mặt thận trọng khi truyền đầu vào không hợp lệ và ném một ngoại lệ.

May mắn thay, bạn có thể dễ dàng viết một phương pháp hữu ích để chuyển đổi một chuỗi đại diện của một giá trị số, một chuỗi rỗng rỗng, hoặc chuỗi rỗng cho bất kỳ loại đầu ra:

public static T SafeConvert<T>(string s, T defaultValue) 
{ 
    if (string.IsNullOrEmpty(s)) 
     return defaultValue; 
    return (T)Convert.ChangeType(s, typeof(T)); 
} 

Sử dụng:

SafeConvert(null, 0.0) == 0.0; 
SafeConvert("", 0.0) == 0.0; 
SafeConvert("0", 0.0) == 0.0; 

Phương thức chung này lấy kiểu trả về của nó từ kiểu đối số thứ hai, được dùng làm giá trị mặc định khi chuỗi được truyền là null hoặc rỗng. Vượt qua 0 và bạn sẽ nhận được In32 quay lại. Vượt qua 0L, Int64. Và cứ thế ...

+0

tôi thực sự như thế này cho việc sử dụng Generics và làm thế nào mà có thể cứu tôi làm cho hàng chục phương pháp. Cảm ơn! –

+0

Điều này rất hay, nhưng làm cách nào chúng ta biết được giá trị mặc định là gì nếu chúng ta có kiểu chuyển đổi động? – Naomi

+0

tôi nghĩ TryParse là tốt nhất. nó không thể chuyển đổi SafeConvert ("null", 0) == 0; –

6

Trong C# hầu hết các kiểu dữ liệu không thể rỗng (số, ngày, v.v.) nullables. Nếu bạn đang nhận dữ liệu từ một DB, thì bạn có thể có thể làm việc với Nullable hoặc phiên bản được mã hóa theo đường pháp luật, int ?, double ?, DateTime ?, v.v.

Tất cả các giá trị đều có a method cho phép bạn giá trị thực, hoặc giá trị mặc định nếu chúng là null. Điều này sẽ giúp bạn tránh việc tạo ra các chức năng đó.

Đối với chuỗi, bạn có hàm String.IsNullOrEmpty (str).

Bạn cũng có thể add extension methods nếu bạn muốn có một số chức năng không có sẵn đặc biệt. Lưu ý rằng các phương thức mở rộng có thể được áp dụng cho các giá trị null, miễn là bạn xử lý nó trong mã. Ví dụ:

public static string ValueOrDefault(this string str) 
{ 
    if (String.IsNullOrEmpty(str)) return MY_DEFAULT_VALUE; 
    else return str; 
} 
1

Có một lớp được gọi là Chuyển đổi trong thư viện .NET. Nó có các chức năng cho phép bạn chuyển đổi thành bất kỳ thứ gì bạn cần từ bất kỳ loại cơ sở nào và một số lớp phổ biến (như DateTime.)

Về cơ bản nó hoạt động như Convert.ToInt32 (val);

EDIT: Tôi thực sự cần phải học cách đọc tất cả các từ. Không nắm bắt được sự lo lắng về null ... có một nhà điều hành cho việc này. Bạn có thể dùng ?? để kiểm tra null và cung cấp mặc định để có thể hoạt động.

Bạn cũng có thể chỉ muốn xem LINQ, nó xử lý rất nhiều loại ánh xạ đó cho bạn.

0

Tôi nghĩ nó tương tự như @ Shog9. Tôi chỉ cần thêm một thử bắt để xử lý đầu vào người dùng bất thường. Tôi gửi kiểu mà tôi muốn chuyển đổi đầu vào và lấy đầu vào làm đối tượng.

public static class SafeConverter 
{ 
    public static T SafeConvert<T>(object input, T defaultValue) 
    { 
     if (input == null) 
      return defaultValue; //default(T); 

     T result; 
     try 
     { 
      result = (T)Convert.ChangeType(input.ToString(), typeof(T)); 
     } 
     catch 
     { 
      result = defaultValue; //default(T); 
     } 
     return result; 
    } 
} 

Bây giờ gọi chúng như dưới đây

SafeConverter.SafeConvert<ushort>(null, 0); 
SafeConverter.SafeConvert<ushort>("", 0); 
SafeConverter.SafeConvert<ushort>("null", 0); 
SafeConverter.SafeConvert<ushort>("-1", 0); 
SafeConverter.SafeConvert<ushort>("6", 0); 
SafeConverter.SafeConvert<ushort>(-1, 0); 
SafeConverter.SafeConvert<ushort>(0, 0); 
SafeConverter.SafeConvert<ushort>(1, 0); 
SafeConverter.SafeConvert<ushort>(9, 0); 
Các vấn đề liên quan