C ++ geliştiricileri korkunç C # kodu yazmak gördük gibi, bu çok iyi bir soru.
C # "güzel sözdizimi ile C ++" olarak düşünmemek en iyisidir. Düşüncelerinizde farklı yaklaşımlar gerektiren farklı dillerdir. C ++ sizi CPU ve belleğin ne yapacağını sürekli düşünmeye zorlar. C # böyle değil. C # özellikle CPU ve bellek hakkında düşünmemeniz ve bunun yerine yazdığınız iş alanı hakkında düşünmeniz için tasarlanmıştır .
Gördüğüm bunun bir örneği, C ++ geliştiricilerinin döngüler için kullanmak isteyecekleri, çünkü foreach'den daha hızlı. Bu C # 'da genellikle kötü bir fikirdir, çünkü yinelenen koleksiyonun olası türlerini (ve dolayısıyla kodun yeniden kullanılabilirliği ve esnekliğini) kısıtlar.
Ben C ++ C # yeniden ayarlamak için en iyi yolu denemek ve farklı bir bakış açısıyla kodlama yaklaşım olduğunu düşünüyorum. İlk başta bu zor olacak, çünkü yıllar boyunca yazdığınız kodu filtrelemek için beyninizdeki "CPU ve bellek ne yapıyor" iş parçacığını kullanmaya alışık olacaksınız. Ancak C # 'da, bunun yerine iş etki alanındaki nesneler arasındaki ilişkileri düşünmelisiniz. "Bilgisayar ne yapıyor" yerine "ne yapmak istiyorum".
Nesneler listesindeki her şeye bir şey yapmak istiyorsanız, listeye for döngüsü yazmak yerine, bir yöntem alıp döngü IEnumerable<MyObject>
kullanın foreach
.
Özel örnekleriniz:
Deterministik temizlik gerektiren kaynakların ömrünü kontrol etmek (dosyalar gibi). El ele sahip olmak kolaydır, ancak kaynağın mülkiyeti aktarıldığında [... iş parçacıkları arasında] nasıl düzgün kullanılır? C ++ 'da basitçe paylaşılan işaretçiler kullanmak ve doğru zamanda' çöp toplama 'ilgilenmek istiyorum.
Bunu asla C # 'da yapmamalısınız (özellikle evreler arasında). Bir dosyaya bir şey yapmanız gerekiyorsa, aynı anda tek bir yerde yapın. Sınıflarınız arasında geçirilen yönetilmeyen kaynağı yöneten ancak iş parçacıkları arasında bir Dosya iletmeyi denemeyen ve ayrı sınıfların yazma / okuma / kapatma / açma olan bir sarıcı sınıf yazmak iyi (ve gerçekten iyi bir uygulama). Yönetilmeyen kaynakların sahipliğini paylaşmayın. Dispose
Temizleme ile ilgilenmek için deseni kullanın .
Belirli jenerikler için geçersiz kılan işlevlerle sürekli mücadele (C ++ 'ta kısmi şablon uzmanlığı gibi şeyleri seviyorum). Sadece C # herhangi bir genel programlama yapmak için herhangi bir girişimi terk mi? Belki jenerikler amaç için sınırlıdır ve belirli bir problem alanı dışında bunları kullanmak C # değil mi?
C #'daki jenerikler jenerik olacak şekilde tasarlanmıştır. Jenerik uzmanlıkları türetilmiş sınıflar tarafından ele alınmalıdır. List<T>
Bir List<int>
ya da bir ise neden farklı davranmalı List<string>
? Üzerindeki List<T>
tüm işlemler herhangi birine uygulanacak şekilde geneldir List<T>
. A .Add
yönteminin davranışını değiştirmek istiyorsanız List<string>
, türetilmiş bir sınıf MySpecializedStringCollection : List<string>
veya MySpecializedStringCollection : IList<string>
jenerik dahili olarak kullanan ancak işleri farklı bir şekilde yapan bir türetilmiş sınıf oluşturun . Bu, Liskov İkame İlkesini ihlal etmekten ve sınıfınızı kullanan diğerlerini kraliyetle sarsmaktan kaçınmanıza yardımcı olur.
Makro benzeri işlevsellik. Genel olarak kötü bir fikir olsa da, bazı sorun alanları için başka bir çözüm yoktur (örneğin, yalnızca hata ayıklama sürümlerine gitmesi gereken günlüklerde olduğu gibi bir ifadenin koşullu değerlendirmesi). Onlara sahip olmamak eğer (koşul) {...} kazan plakasını daha fazla koymam gerektiği anlamına gelir ve hala yan etkileri tetiklemek açısından eşit değildir.
Diğerlerinin söylediği gibi, bunu yapmak için önişlemci komutlarını kullanabilirsiniz. Nitelikler daha da iyidir. Genel olarak öznitelikler, bir sınıf için "temel" işlev olmayan şeyleri işlemenin en iyi yoludur.
Kısacası, C # yazarken, CPU ve bellek hakkında değil, tamamen iş alanı hakkında düşünmeniz gerektiğini unutmayın. Gerekirse daha sonra optimize edebilirsiniz , ancak kodunuz eşlemeye çalıştığınız işletme ilkeleri arasındaki ilişkileri yansıtmalıdır.
C#
başka kod oluşturmak için kullanın . Bir okuyabilirCSV
veyaXML
girdi olarak ya da ne var dosya ve bir oluşturmakC#
veya birSQL
dosyayı. Bu fonksiyonel makroları kullanmaktan daha güçlü olabilir.