Genellikle, verileriniz için her zaman mümkün olan en spesifik veri türünü kullanmalısınız.
Örneğin, bir veritabanından veri çekmek için Entity Framework kullanıyorsanız, EF, veritabanında kullanılana en yakın veri türünü otomatik olarak kullanır.
C # ile bununla ilgili iki sorun var.
İlk olarak, çoğu C # geliştiricisi yalnızca int
tam sayıları temsil etmek için kullanır (kullanmak için bir neden olmadıkça long
). Bu, diğer geliştiricilerin veri türünü kontrol etmeyi düşünmeyecekleri anlamına gelir, bu nedenle yukarıda belirtilen taşma hatalarını alırlar. İkinci ve daha kritik bir konu, oldu / .NET'in o orijinal aritmetik operatörler yalnızca desteklenen int
, uint
, long
, ulong
, float
, çift ve decimal
*. Bugün hala durum budur (bkz. Bölüm C # 5.0 'da belirtilen 7.8.4 ). Aşağıdaki kodu kullanarak bunu kendiniz test edebilirsiniz:
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;
Bizim sonucu byte
- ' byte
dir int
( System.Int32
).
Bu iki konu, çok yaygın olan “sadece tüm sayılar için int kullan” uygulamasına yol açtı.
Bu nedenle sorunuzu yanıtlamak için, C # 'da aşağıdakilere uymamanız iyi bir fikirdir int
:
- Otomatik bir kod üreticisi farklı bir değer kullandı (Entity Framework gibi).
- Projedeki diğer tüm geliştiriciler daha az yaygın veri türlerini kullandığınızın farkındadır (veri türünü ve neden kullandığınızı gösteren bir yorum ekleyin).
- Daha az yaygın veri türleri zaten projede yaygın olarak kullanılmaktadır.
- Program daha az yaygın veri türünün faydalarını, (a arasındaki fark böylece, RAM tutmak gerekir Bunlardan 100 milyona sahip
byte
bir int
veya int
bir long
kritik olduğu veya imzasız aritmetik farklılıkların bahsedilmiştir).
Veriler üzerinde matematik yapmanız gerekirse, genel türlere bağlı kalın.
Unutmayın, bir türden diğerine yayın yapabilirsiniz. Bu, bir CPU durma noktasından daha az verimli olabilir, bu nedenle 7 genel türden biriyle muhtemelen daha iyi olursunuz, ancak gerekirse bir seçenektir.
Numaralandırma ( enum
), yukarıdaki yönergelere ilişkin kişisel istisnalarımdan biridir. Yalnızca birkaç seçeneğim varsa, numaralandırmayı bayt veya kısa olarak belirteceğim . Eğer bayraklı bir numarada bu son bite ihtiyacım olursa uint
, bayrak değerini ayarlamak için hex kullanabilmek için tip belirteceğim .
Değer kısıtlama koduna sahip bir özellik kullanıyorsanız, özet etiketinde hangi kısıtlamaların olduğunu ve neden olduğunu açıkladığınızdan emin olun.
* C # takma adları, bunun yerine System.Int32
bir C # sorusu olduğu gibi .NET adları yerine kullanılır .
Not: .NET geliştiricilerin (bulamadığım) sınırlı sayıda aritmetik işlevi ve bunun için endişelenmeme nedenlerini gösteren bir blog veya makalesi vardı. Hatırladığım kadarıyla, diğer veri türlerine destek eklemek için hiçbir planları olmadığını belirtti.
Not: Java, imzalanmamış veri türlerini desteklememektedir ve daha önce 8 veya 16 bit tam sayıları desteklememiştir. Birçok C # geliştiricisi bir Java altyapısından geldiğinden veya her iki dilde de çalışması gerektiğinden, bir dilin sınırlamaları bazen yapay olarak diğerine deyatılabilir.