2009-06-09 48 views
5

Đối với các trường và thuộc tính .NET theo định nghĩa chỉ chứa một ký tự đơn, có lợi ích nào để định nghĩa chúng là char thay vì chuỗi không? Hoặc là việc sử dụng không chính xác kiểu dữ liệu char?Có lợi ích gì khi sử dụng char thay cho chuỗi cho các giá trị ký tự đơn không?

Tôi đang nghĩ đến một trường có thể giữ M hoặc F cho giới tính hoặc chữ viết tắt ở giữa hoặc chỉ báo được lưu trữ trong cơ sở dữ liệu dưới dạng Y hoặc N. tự hỏi liệu tôi có nên định nghĩa chúng là char thay thế không.

+1

(Toàn bộ tiếp tuyến, nhưng theo gợi ý, tôi muốn tránh lưu trữ giới tính dưới dạng boolean - không giới hạn đối với người giới tính, người chuyển giới và người chuyển giới.) –

+0

@Conrad, vui lòng đọc lại câu hỏi. Tôi đã đưa ra ba ví dụ riêng biệt: (1) giới tính (không phải giới tính, nhưng giới tính theo nghĩa sinh học), có thể là M hoặc F; (2) giữa ban đầu, có thể là bất kỳ chữ cái nào; và (3) một chỉ số không xác định, có thể là Y hoặc N. Câu hỏi của tôi không liên quan gì đến bản sắc giới tính. –

+0

@ John: Re: (1): Bạn vẫn chưa bao gồm những người có liên quan đến sinh học. Re: phần còn lại: Có, đó là lý do tại sao tôi nói nó là tiếp tuyến. –

Trả lời

12

Có, char là loại dữ liệu chính xác cho việc này. Nguyên tắc chung là: luôn chọn loại dữ liệu hẹp nhất (hạn chế nhất) trong ngữ cảnh. Điều này có nghĩa rằng bất kỳ dữ liệu không hợp lệ (hoặc ngoài phạm vi) sẽ không được chấp nhận nếu nó được nhập ngẫu nhiên, do đó chương trình/cơ sở dữ liệu của bạn sẽ trở nên ít bị lỗi.

Để xem xét từ góc độ khác: khi muốn sử dụng giá trị số nguyên trong mã, bạn có tạo một mảng nguyên có kích thước không? Tất nhiên là không, bởi vì mặc dù nó sẽ thực hiện công việc, nó là khá không cần thiết. ví dụ: Hãy so sánh:

int[] value = new int[1] { 123 }; 
value[0] = 456; 

tới:

int value = 123; 
value = 456; 

Đầu tiên là đơn giản vô lý, như tôi chắc chắn rằng bạn nhìn thấy. Chắc chắn, điều này không rõ ràng trong bối cảnh cơ sở dữ liệu (sử dụng đơn giản nếu bạn chọn loại dữ liệu string), nhưng tôi nghĩ sự tương tự giúp giải thích logic đằng sau sự lựa chọn.

Ngoài ra, khi điều chỉnh các giá trị trong mã, bạn nên tìm trường có loại dữ liệu thích hợp hơn (ví dụ: char).

Xét về hiệu suất, tôi sẽ không tưởng tượng rằng việc sử dụng string sẽ cung cấp cho bạn mọi chi phí đáng kể. Ok, do đó, nó chiếm nhỏ hơn bộ nhớ khác, nhưng đó có thể không phải là vấn đề. Tuy nhiên, tôi nghĩ rằng các lý do khác mà tôi vừa đề xuất giải thích tại sao bạn nên chọn char.

+0

Điểm tốt về dữ liệu không hợp lệ mà tôi không đưa vào câu trả lời của riêng tôi. – TheTXI

+2

Vâng, có hai lý do chính ở đây: hạn chế và bảo vệ chống lại dữ liệu không hợp lệ. – Noldorin

2

Chuỗi là mảng ký tự, vì vậy, trừ khi bạn tin rằng bạn có thể cần các thuộc tính/phương thức đi kèm với mảng (chẳng hạn như độ dài và chức năng chuỗi con), tôi sẽ nói với một ký tự, vì bạn chắc chắn chỉ một ký tự.

4

A Char và 1 ký tự String sẽ không khác biệt nhiều, hiệu quả. CLR sẽ thực hiện chuỗi cho bạn vì vậy đó là một cái gì đó để xem xét (nhưng một lần nữa tôi không thể tưởng tượng các lợi ích hiệu suất sẽ là đáng kể).

Hãy nhớ rằng một ngôn ngữ lập trình là một công cụ hữu ích như là một sự phóng đại . Luôn tạo trừu tượng hữu ích. Nói cách khác, tôi sẽ xác định các trường của bạn như sau:

enum Gender { Male, Female } 

class Foo 
{ 
    Gender gender; 
    Char middleInitial; 
    Boolean indicator; 
} 

Lớp này có giá trị về mặt ngữ nghĩa vì các kiểu dữ liệu cho biết việc sử dụng chúng. Luôn sử dụng đúng công cụ cho công việc.

+0

Đồng ý với ví dụ enum của bạn. Nó chắc chắn rõ ràng hơn nhiều so với một char duy nhất. – Skurmedel

+1

Cùng một bình luận ở đây (thậm chí nhiều hơn so với OP) - các lĩnh vực giới tính nhị phân không thân thiện với người giới tính, người chuyển giới và người chuyển giới. Vui lòng không duy trì điều này. Cảm ơn! =) –

1

Lớp chuỗi sẽ có một số chi phí. Nếu bạn có char, bạn sẽ cần phải đại diện rỗng với 0x00 hoặc <space> hoặc một số chỉ báo không xác định khác?Điều này sẽ đến hoặc đến từ một cơ sở dữ liệu, và những gì quy ước là bạn sẽ sử dụng ở đó?

Tôi thường thích enums/bools/ngữ nghĩa gốc trong lớp ứng dụng cho điều này, dịch từ và đến bất kỳ quy ước cơ sở dữ liệu nào là bắt buộc. Sau khi tất cả Person.Gender == Femaleif (!Person.IsDeceased) {} dễ đọc hơn và rõ ràng hơn.

+0

Câu hỏi hay. Trong lớp cụ thể tôi đang làm việc ngay bây giờ, dữ liệu sẽ được lưu trữ trong cơ sở dữ liệu. Bảng (không phải thiết kế của tôi) sử dụng khoảng trống thay vì null, vì vậy một ký tự khoảng trắng sẽ ánh xạ trực tiếp tới cơ sở dữ liệu. Đối với các trường hợp khác, nơi tôi cần phải tồn tại một null thay vì một không gian, đó là một điểm tốt cho tôi để xem xét. –

+0

thêm lưu ý về sở thích thiết kế cá nhân của tôi, tương tự như điểm của Anrew Hare. –

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