Merhabalar; Bu yazımda C# ile yazılım geliştirirken sık yaptığımız programın çalışmasını engellemese bile performans sorunlarına yol açabilecek hataları ve çözüm yollarını anlatacağım.
LINQ Kullanımı;
Bir program yazarken mutlaka bazı verileri bir list veya collection da saklamamız gerekir ve binlerce kayıt için yenileme yapmak zorunda kalabiliriz.
Örneğin bir Depo stok yönetimi sisteminde 200.000 stok kaydını çektiğimizi düşünün, belirli bir data seti bulmak için yenileme yapmak verimli olmaz, döngü kullanmak yerine .NET’in entegre bir özelliği olan ve nesneleri sorgulamamızı kolaylaştıran LINQ kullanabiliriz.
Verimsiz;
foreach (Stock stock in StockList) {
if (stock.State == "FL") {
tax += stock.Balance;
}
}
Verimli;
var stocks = (from stock in StockList
where stock.State == "FL"
select stock.Balance).Sum();
Gereksiz “Var” kullanımı;
Bazı durumlarda gelen verinin veya oluşan sonucun ne olduğunu tahmin edemediğimiz için var kullanırız, fakat sonucu biliyorsak veri türünü tanımlamamız gerekir.
Bu kodumuzun okunabilirliğine fayda sağlar, başka bir geliştiricinin kodumuzu daha iyi anlayabilir.
var stocks= (from stock in StockList
where stock.State == "FL"
select stock.Balance).Sum();
Yukarıda ki örnekte sonucun ondalık bir değer olduğunu biliyoruz, bu nedenlede var yerine float tanımlamamız en doğru seçenek olacaktır.
Properties Yerine Public Değişkenlerin Kullanılması;
Bir çok durumda public değişkenleri kullanırız, fakat bazı durumlarda public kullanmamız büyük hatalara neden olacaktır.
public decimal Total {get; protected set;}
Örneğin, sipariş aldığımız bir uygulamada sipariş toplam tutarını tuttuğumuz bir değişkenin belirli bir class ile değiştirilebilmesini isteriz, fakat genel kullanırsak başka bir class herhangi bir engelleme olmadan değişkeni değiştirebilir.
Objelerin Dispose Edilmemesi;
Memory leaks (bellek sızıntıları) uygulamalarda büyük bir sorundur, C# işimiz bittiğinde Dispose yönetimini çağırmanın kolay bir yolunu bize sunar, Using
Inefficient
file.Read(buffer, 0, 100);
Yukarıda ki kodda eğer objeyi Dispose etmezseniz uygulamada Memory leaks oluştururuz, fakat Using kullanarak bunu önleyebiliriz.
Efficient
using (FileStream file = File.OpenRead("numbers.txt")) {
file.Read(buffer, 0, 100);
}
Böylece dosyayı okuruz, ve bittiğinde Dispose ederiz.
Generic TRY-CATCH Kullanımı;
Bir çok yazılımcı genel Exception sınıfını kullanır, tabi bir çok durumda bunu kullanmamız gerekecektir fakat çoğu zaman belirli istisnalar kullanmalıyız
Verimli;
try {
newInteger = int.Parse(astring);
} catch (Exception e) {
// ....
}
Verimsiz;
try {
newInteger = int.Parse(astring);
} catch (NumberFormatException e) {
// ....
}
String Birleştirme
Diğer dillerde yaygın olarak string birleştirmek için + kullanılıyordu, fakat bu birleştirme performans sorunlarına yol açıyordur, Microsoft bunun için StringBuilder’i çıkarttı.
String birleştirmek ve tüm projenizde işlemek istediğiniz de mutlaka StringBuilder’i kullanmalısınız.
StringBuilder builder = new StringBuilder();
for (int i = 0; i < 5; i++)
{
builder.Append(i).Append(" ");
}