C#’ta nameof() metodu, bir değişkenin, özelliğin veya metodun adını metin olarak döndürür. Böylece sabit metin kaynaklı hataların önüne geçilir.
int age = 25;
// Eski kullanım
if (age < 0)
{
throw new ArgumentException("age");
}
// Önerilen kullanım
if (age < 0)
{
throw new ArgumentException(nameof(age));
}
Console.WriteLine(nameof(age)); // age
C#’ta nesneler kimliklerine göre değerlendiriliyorsa class, değerlerine göre değerlendiriliyorsa record kullanılmalıdır.
// class: kimlik odaklı
class User
{
public string Name { get; set; }
public int Age { get; set; }
}
var u1 = new User { Name = "Ali", Age = 30 };
var u2 = new User { Name = "Ali", Age = 30 };
Console.WriteLine(u1 == u2); // False
// record: değer odaklı
record UserRecord(string Name, int Age);
var r1 = new UserRecord("Ali", 30);
var r2 = new UserRecord("Ali", 30);
Console.WriteLine(r1 == r2); // True
C#’ta yalnızca veriyiiyi dolaşmak için IEnumerable<T> kullanılır. Index ile okumaya da ihtiyaç varsa ve koleksiyonun değiştirilmesi istenmiyorsa IReadOnlyList<T> tercih edilir.
// Sadece dolaşmak
IEnumerable<int> numbers = new[] { 10, 20, 30 };
foreach (var n in numbers)
{
Console.WriteLine(n);
}
// Değiştirilemeyen, index ile okunabilir liste
IReadOnlyList<int> readOnlyList = new List<int> { 10, 20, 30 };
Console.WriteLine(readOnlyList[0]); // 10
C#’ta kullanıcıdan veya dış kaynaktan gelen verileri dönüştürürken Parse yerine TryParse kullanmak uygulamanın hata verip kapanmasını önler.
// Riskli kullanım
int age = int.Parse(input);
// Güvenli kullanım
if (int.TryParse(input, out int result))
{
Console.WriteLine(result);
}
else
{
Console.WriteLine("Geçersiz sayı");
}
C#’ta String.Format yerine string interpolation ($"...") kullanmak kodu daha okunabilir ve güvenli hale getirir.
int a = 18, b = 22;
string text;
// Eski kullanım
text = string.Format("number1: {0}, number2: {1}", a, b);
// Önerilen kullanım
text = $"number1: {a}, number2: {b}";
C#’ta metin kontrolü yaparken yalnızca null veya boş string kontrolü yapmak yeterli değildir. string.IsNullOrWhiteSpace() kullanmak daha güvenlidir.
// Riskli kontroller
if (text == null || text == "")
{
Console.WriteLine("Geçersiz metin");
}
// Güvenli ve önerilen kontrol
if (string.IsNullOrWhiteSpace(text))
{
Console.WriteLine("Geçersiz metin");
}
C#’ta çok sayıda koşul olduğunda uzun switch blokları yerine Dictionary tabanlı bir çözüm kullanmak kodu daha okunabilir ve bakımı kolay hale getirir.
// switch tabanlı yaklaşım
string GetRoleName(int roleId)
{
switch (roleId)
{
case 1: return "Admin";
case 2: return "Editör";
case 3: return "Kullanıcı";
default: return "Bilinmiyor";
}
}
// Dictionary tabanlı yaklaşım
var roles = new Dictionary<int, string>
{
{ 1, "Admin" },
{ 2, "Editör" },
{ 3, "Kullanıcı" }
};
string roleName = roles.TryGetValue(roleId, out var name)
? name
: "Bilinmiyor";
C#’ta null-coalescing (??) operatörü, bir değer null ise varsayılan bir değer atamayı sağlar.
string? userName = null;
// Eski kullanım
string name1 = userName != null ? userName : "Misafir";
// Önerilen kullanım
string name2 = userName ?? "Misafir";
Console.WriteLine(name1); // Misafir
Console.WriteLine(name2); // Misafir
C#’ta is ve is not ile daha okunabilir tür kontrolleri ve desen eşleştirmeleri yapabilirsiniz.
// Eski kullanım (as ve null kontrolü)
object obj = "Merhaba, dünya!";
if (obj is string)
{
Console.WriteLine(((string)obj).ToUpper()); // MERHABA, DÜNYA!
}
// Önerilen kullanım (is ile)
if (obj is string str)
{
Console.WriteLine(str.ToUpper()); // MERHABA, DÜNYA!
}
// Negasyon için "is not" kullanımı
if (obj is not int)
{
Console.WriteLine("Bir tam sayı değil");
}
C#’ta FirstOrDefault() null döndürebilir. Sonucu kullanmadan önce kontrol etmek hataları önler.
// Riskli kullanım
var user = users.FirstOrDefault();
Console.WriteLine(user.Name); // hata oluşabilir
// Güvenli kullanım
var safeUser = users.FirstOrDefault();
if (safeUser != null)
{
Console.WriteLine(safeUser.Name);
}