Neden gereksiz C # yönergeleri kullanarak kaldırmalısınız?


216

Örneğin, nadiren ihtiyacım var:

using System.Text;

ancak varsayılan olarak her zaman oradadır. Kodunuz gereksiz kullanım yönergeleri içeriyorsa, uygulamanın daha fazla bellek kullanacağını varsayıyorum . Ama bilmem gereken başka bir şey var mı?

Ayrıca, aynı kullanım talimatının çoğu dosyaya karşı tek bir dosyada kullanılması durumunda herhangi bir fark yaratır mı?


Düzenleme: Bu soru, bir nesne kapsam dışına çıktığında, onun IDisposable.Dispose yönteminin çağrılmasını sağlayarak kaynakların yönetilmesine yardımcı olmak için tasarlanmış, using deyimi adı verilen ilgisiz kavram hakkında değildir . Bkz . C # 'da "kullanma" .

Yanıtlar:


181

Programınız çalıştığında hiçbir şey değişmez. İhtiyaç duyulan her şey talep üzerine yüklenir. Bu nedenle, bu kullanım ifadesine sahip olsanız bile, aslında ad alanında / montajda bir tür kullanmadığınız sürece, using ifadesinin ilişkilendirildiği derleme yüklenmez.

Temelde, sadece kişisel tercih için temizlemek.


@francip - bunu söylüyorum. kullanmak montaj yüklemesini etkilemez, montajda bulunan bir türe başvuruluncaya kadar montaj yüklenmez.
Darren Kopp

69
ancak derleme süresini ve Intellisense / IDE yanıt hızını etkileyebilir.
Mart


475

Orada olan tercihi kodlama yanında / ad alanları (s) kullanılarak kullanılmayan kaldırmak için birkaç nedeni:

  • bir projede kullanılmayan yan tümceleri kaldırmak derleyiciyi çözümlemek için daha az ad alanına sahip olduğundan derlemeyi hızlandırabilir. (bu, derleyicinin olası daha iyi eşleşmeler, genel tür çıkarımları ve genel türler içeren lambda ifadeleri için tüm ad alanlarını genişletmek zorunda olduğu uzantı yöntemleri nedeniyle C # 3.0 için geçerlidir)
  • kullanılmayan ad alanlarına, kullanılan ad alanlarındaki bazı türlerle aynı ada sahip yeni türler eklendiğinde, gelecekteki derlemelerdeki ad çakışmasının önlenmesine yardımcı olabilir.
  • kodlama sırasında editör otomatik tamamlama listesindeki öğelerin sayısını azaltacak ve muhtemelen daha hızlı yazmaya yol açacaktır (C # 3.0'da bu, gösterilen uzantı yöntemleri listesini de azaltabilir)

Kullanılmayan ad alanlarını kaldırarak ne olmaz yapın:

  • derleyicinin çıktısını herhangi bir şekilde değiştiremez.
  • derlenmiş programın yürütülmesini herhangi bir şekilde değiştiremez (daha hızlı yükleme veya daha iyi performans).

Elde edilen montaj, çıkarılmış (lar) kullanılmadan veya kullanılmadan aynıdır.


3
Dosyaları değiştirdikçe, dosyaların başına giderek daha fazla ad alanı ekleyeceksiniz. Bu nedenle, kullanılmayan ad alanlarını kaldırmazsanız, dosyayı açtığınızda, gerçek uygulama yerine dev bir ad alanı listesi görürsünüz.
Mert Akcakaya

5
Daha hızlı derleme ile ilgili: Dosyalardaki kullanılmayan usingyönergeler , projenizden .csbazı (aksi takdirde kullanılmayan) montaj referanslarını kaldırmanızı engelleyebilir .csproj. Birçok projenin "çözümüne" sahipseniz, projeler arasındaki gereksiz referanslar, projeleri bağımsız olduklarında ve paralel olarak derlenebildiklerinde belirli bir sırada derlenmeye zorlayacaktır. Bu nedenle using, birden fazla proje çözümünde kullanılmayan proje referanslarını kontrol etmeden önce kullanılmayan yönergeleri kaldırın .
Jeppe Stig Nielsen

1
Bu harika bir açıklama - sonuçta performansla pek bir ilgisi değil, en iyi uygulamalarla ilgisi var. Açıkladığınız için teşekkürler!
GSaunders

39

Kod temizlik olduğunu önemli.

Birisi gereksiz kullanımlar gördüğünde kodun korunamayacağı ve tarayıcı yolu üzerinde olduğu hissini almaya başlar. Özünde, kullanılmayan bazı ifadeler gördüğümde, beynimin arkasında bana "dikkatle ilerlememi" söyleyen küçük bir sarı bayrak çıkıyor. Ve üretim kodunu okumak size asla bu hissi vermemelidir.

Bu yüzden kullanıcılarınızı temizleyin. Özensiz olma. Güven verin. Kodunuzu güzelleştirin. Sıcak bulanık bir duyguya başka bir geliştirici verin.


Şimdi duymak istediğim buydu :-) Organize Usings -> Remove and SortHer seferinde yapıyorum . BTW, bana göre üst iki seçenek Organize Usingsanlamsız. VS2013 btw hakkında konuşuyorum.
Sнаđошƒаӽ

30

Buna karşılık gelen bir IL yapısı yoktur using. Bu nedenle, usingifadeler, bunun için oluşturulan kod veya veri olmadığından uygulama belleğinizi artırmaz.

Usingderleme zamanında yalnızca kısa tür adlarının tam nitelikli tür adlarına çözümlenmesi amacıyla kullanılır. Bu nedenle, gereksiz usingolabilecek tek olumsuz etki derleme süresini biraz yavaşlatmak ve derleme sırasında biraz daha fazla bellek almaktır. Bununla ilgili endişelenmezdim.

Bu nedenle, usingihtiyacınız olmayan ifadelere sahip olmanın tek gerçek olumsuz etkisi, siz yazarken tamamlanması için olası eşleşmelerin listesi arttıkça, akıllıdır.


4

Sınıflarınızı ad alanındaki (kullanılmayan) gibi çağırırsanız, ad çakışmaları olabilir. System.Text durumunda, "Kodlayıcı" adlı bir sınıf tanımlarsanız bir sorun yaşarsınız.

Her neyse, bu genellikle küçük bir sorundur ve derleyici tarafından algılanır.


2

Uygulamanız daha fazla bellek kullanmayacak. Onun derleyici kod dosyalarında kullandığınız sınıfları bulmak için. Gerçekten temiz olmanın ötesine zarar vermez.


2

Esas olarak kişisel tercihtir. Onları kendim temizliyorum (Resharper, gereksiz ifadeler kullanıldığında bana söyleme konusunda iyi bir iş çıkarıyor).

Derleme zamanını azaltabileceği söylenebilir, ancak bugünlerde bilgisayar ve derleyici hızları ile herhangi bir algılanabilir etki yaratmaz.


2

Fazladan usingyönergeler bırakmak iyidir. Bunları çıkarmanın küçük bir değeri vardır, ancak çok fazla değildir. Örneğin, IntelliSense tamamlama listelerimi kısaltıyor ve bu nedenle gezinmesi daha kolay.

Derlenen derlemeler yabancı usingyönergelerden etkilenmez .

Bazen onları a'nın içine #regionkoyarım ve çökerim; bu, dosyayı görüntülemeyi biraz daha temiz hale getirir. IMO, bu birkaç iyi kullanımlarından biridir #region.


1
Bölge olmadan daraltılabilirler
abatishchev

1
@abatishchev: Evet, VS2010'da bu doğru.
Jay Bazuzi

" #regionKullanmanın birkaç iyi kullanımından biri ", yani kullanmak #regionbirçok açıdan kötü mü yani ?
Steven

Evet, #regionbir kod kokusu. Sınıfınızda çok fazla şey olduğunu söylüyor.
Jay Bazuzi

2

kodunuzu temiz tutmak istiyorsanız, kullanılmayan usingifadeler dosyadan kaldırılmalıdır. kodunuzu anlamak, tüm kodunuzun korunması gerektiğini düşünmek, daha az kod = daha az çalışmak, faydaları uzun vadede olan ortak bir ekipte çalışırken faydalar çok net görünür.


1

Sadece kısayol olarak kullanılırlar. Örneğin, şunu kullanmanız gerekir: System.Int32'yi her zaman kullanan bir Sisteminiz yoksa; üstte.

Kullanılmayanları kaldırmak, kodunuzun daha temiz görünmesini sağlar.


1

Using ifadesi, yalnızca kullandığınız türleri nitelemenizi engeller. Şahsen onları temizlemeyi seviyorum. Gerçekten bir loc metriğinin nasıl kullanıldığına bağlıdır


1

Yalnızca gerçekten kullandığınız ad alanlarına sahip olmak, kodunuzu belgelemenize olanak tanır.

Kodunuzun hangi bölümlerinin birbirini çağırdığını herhangi bir arama aracıyla kolayca bulabilirsiniz.

Kullanılmayan ad alanlarınız varsa, arama yaparken hiçbir şey ifade etmez.

Şimdi ad alanlarını temizlemeye çalışıyorum, çünkü uygulamanın hangi bölümlerinin aynı verilere şu ya da bu şekilde eriştiğini sürekli olarak soruyorum.

Veri erişiminin ad alanları ile doğrudan bir veritabanı aracılığıyla ve doğrudan bir web hizmeti aracılığıyla ayrılması nedeniyle hangi bölümlerin verilere her şekilde eriştiğini biliyorum.

Bunu bir kerede yapmanın daha basit bir yolunu düşünemiyorum.

Kodunuzun sadece bir kara kutu olmasını istiyorsanız (geliştiriciler için), o zaman evet önemli değil. Ancak zaman içinde sürdürmeniz gerekiyorsa, diğer tüm kodlar gibi değerli belgelerdir.


0

'Using' ifadesi, yalnızca tanımlayıcılarınızın adlarını nitelemede yardımcı olduğu için performansı etkilemez. Bunun yerine yazmak zorunda, System.IO.Path.Combine (...) , sadece, yazabilirsiniz Path.Combine (...) Eğer varsa System.IO kullanarak .


0

Derleyicinin projenizi oluştururken her şeyi optimize etmek için çok iş yaptığını unutmayın. Kullanmak çok yerde kullanılan veya 1 kez derlenmiş farklı yapmamalıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.