Nói chung, bạn phải luôn sử dụng loại dữ liệu cụ thể nhất cho dữ liệu của mình.
Ví dụ: nếu bạn đang sử dụng Entity Framework để lấy dữ liệu từ cơ sở dữ liệu, thì EF sẽ tự động sử dụng loại dữ liệu gần nhất với loại được sử dụng trong cơ sở dữ liệu.
Có hai vấn đề với điều này trong C #.
Đầu tiên, hầu hết các nhà phát triển C # chỉ sử dụng int
, để đại diện cho toàn bộ số (trừ khi có lý do để sử dụng long
). Điều này có nghĩa là các nhà phát triển khác sẽ không nghĩ sẽ kiểm tra loại dữ liệu, vì vậy họ sẽ nhận được các lỗi tràn được đề cập ở trên. Thứ hai, và vấn đề quan trọng hơn, đó là / là NET của toán tử số học ban đầu chỉ được hỗ trợ int
, uint
, long
, ulong
, float
, đôi, và decimal
*. Đây vẫn là trường hợp ngày hôm nay (xem phần 7.8.4 trong thông số ngôn ngữ C # 5.0 ). Bạn có thể tự kiểm tra điều này bằng cách sử dụng mã sau đây:
byte a, b;
a = 1;
b = 2;
var c = a - b; //In visual studio, hover over "var" and the tip will indicate the data type, or you can get the value from cName below.
string cName = c.GetType().Namespace + '.' + c.GetType().Name;
Kết quả của chúng tôi byte
- byte
là một int
( System.Int32
).
Hai vấn đề này đã dẫn đến thực tiễn "chỉ sử dụng int cho toàn bộ số" rất phổ biến.
Vì vậy, để trả lời câu hỏi của bạn, trong C # thường là một ý tưởng tốt để bám vào int
trừ khi:
- Một trình tạo mã tự động đã sử dụng một giá trị khác (như Entity Framework).
- Tất cả các nhà phát triển khác trong dự án đều biết rằng bạn đang sử dụng các loại dữ liệu ít phổ biến hơn (bao gồm một nhận xét chỉ ra rằng bạn đã sử dụng loại dữ liệu và tại sao).
- Các loại dữ liệu ít phổ biến hơn thường được sử dụng trong dự án.
- Chương trình yêu cầu lợi ích của loại dữ liệu ít phổ biến hơn (bạn có 100 triệu trong số này bạn cần giữ RAM, do đó, sự khác biệt giữa a
byte
và an int
hoặc int
a long
là rất quan trọng hoặc sự khác biệt về số học của dấu không được đề cập).
Nếu bạn cần làm toán trên dữ liệu, hãy bám vào các loại phổ biến.
Hãy nhớ rằng, bạn có thể truyền từ loại này sang loại khác. Điều này có thể kém hiệu quả hơn từ quan điểm của CPU, vì vậy bạn có thể tốt hơn với một trong 7 loại phổ biến, nhưng nó là một tùy chọn nếu cần.
Số liệt kê ( enum
) là một trong những trường hợp ngoại lệ cá nhân của tôi đối với các nguyên tắc trên. Nếu tôi chỉ có một vài tùy chọn, tôi sẽ chỉ định enum là byte hoặc ngắn. Nếu tôi cần bit cuối cùng trong enum được gắn cờ, tôi sẽ chỉ định loại là uint
để tôi có thể sử dụng hex để đặt giá trị cho cờ.
Nếu bạn sử dụng một thuộc tính có mã giới hạn giá trị, hãy chắc chắn giải thích trong thẻ tóm tắt những hạn chế nào ở đó và tại sao.
* Bí danh C # được sử dụng thay cho tên .NET như System.Int32
đây là câu hỏi C #.
Lưu ý: đã có một blog hoặc bài viết từ các nhà phát triển .NET (mà tôi không thể tìm thấy), trong đó chỉ ra số lượng hạn chế của các hàm số học và một số lý do tại sao họ không lo lắng về nó. Theo tôi nhớ, họ chỉ ra rằng họ không có kế hoạch thêm hỗ trợ cho các loại dữ liệu khác.
Lưu ý: Java không hỗ trợ các kiểu dữ liệu không dấu và trước đây không hỗ trợ cho các số nguyên 8 hoặc 16 bit. Do nhiều nhà phát triển C # đến từ nền Java hoặc cần làm việc ở cả hai ngôn ngữ, nên các giới hạn của một ngôn ngữ đôi khi sẽ bị áp đặt giả tạo lên ngôn ngữ kia.