Alanın önünde "this" anahtar kelimesi ve c # yöntemleri ile ilgili olarak kabul edilen en iyi uygulamalar nedir?


14

Aynı ada sahip bir değişken ve alan arasında ayrım yapmak gerekmedikçe, hiçbir zaman this.bir alanın veya C # 'da herhangi bir üye erişiminin önüne koymadım. Bunu m_C ++ 'da yaygın olan önek için farklı görmüyorum ve gerçekten üye olduğunu belirtmeniz gerekiyorsa, sınıfınız çok büyük.

Ancak, ofisimde kesinlikle aynı fikirde olmayan birkaç kişi var.

Şu andaki en iyi uygulamalar this.nelerdir?

EDIT: Açıklığa kavuşturmak için asla kesinlikle gerekli olduğunda kullanmam m_ve kullanmam this..


Ne m_anlama geliyor?
FrustratedWithFormsDesigner

2
@Frustrated Değişkenin sınıfın bir üyesi olduğunu.
Michael Todd

Üzgünüm, hiç kimsenin Macarca gösterim kullandığımı düşünemeyeceğini varsaymıştım. Ben this.neredeyse m_ kadar kötü olduğunu söylemeye çalışıyordum .
Andy Lowry

3
Dostum, sadece StyleCop'u kur ve çalıştır! Bu kesinlikle bir SO sorusunun bir kopyasıdır.
Meslek

3
Ekibinizle aynı fikirde olmak ya da katılmamanız göz ardı edilmez, yine de bir takımda tutarlılığa ihtiyacınız vardır. Özellikle ekip büyüdükçe vahşi batı gibi tüm nilüferleri alır ve insanların Kovboy kodlayıcıları hakkında söylediklerini bilirsiniz. ;-)
Chris

Yanıtlar:


14

Göre Çerçeve tasarım kuralları , ne zaman kamu veya korumalı alanlara atıfta:

Alan adları için bir önek KULLANMAYIN .

Örneğin m_, bir önektir.

Dolayısıyla, bir alanın herkese açık thisolarak gösterilmesi, MSDN'de açıklandığı gibi anahtar kelimenin kullanımına katkıda bulunur

Benzer adlarla gizlenen üyelere hak kazanmak için, örneğin: Kopyala

public Employee(string name, string alias) 
{
   this.name = name;
   this.alias = alias;
}

Özel alanlara atıfta bulunurken, isterseniz 'i kullanabilirsiniz m_. Ancak, kamusal alanlar için en iyi uygulamaları takip etmenizi öneririm.

Şahsen, değişken isimlerimdeki alt çizgileri sevmiyorum. Ayrıca tutarlı olmaya çalışıyorum. Bu nedenle, this.name = name;hem kamu / hem de özel senaryolarda çalışmak için iyi bir kural.


+1: Cevabımda bahsettiğim şey bu, ama cevabınız çok daha açıklayıcı.
Joel Etherton

1
Kabul edildi - Aynı mülke sahip bir mülkünüz, bir üyeniz ve bir yerel değişkeniniz olduğu birkaç senaryo gördüm. Özellik Pascal (ilk harf büyük), size deve kasalı (ilk harf alt) iki değişken bırakır. Ayırt etmenin tek yolu "bu" dur. (önerilir) veya bir önek (önerilmez). Her ikisini de kullandım ve pratikte bu anahtar kelime takip etmeyi kolaylaştırıyor (IMO).
Mayo

1
Çerçeve tavsiyesi ile komik olan şey CLR kaynağının m_önekle doludur . Ben '_' atama yazım hataları yığın akışı sorunları hakkında asla endişe gibi iyi bir önek olduğunu düşünüyorum
Chris S

@Chris S - Deneyimlerime göre Microsoft, bir "evrimsel kod süreci" ni belgeleyerek ve sürdürerek başarılı oluyor. Şimdi "kötü uygulama" olarak kabul edilen birçok uygulama kullandılar. Büyük olasılıkla hatalarından öğrendikleri için. Bu, geri dönüp her zaman çabaya değmeyeceği için mevcut kodu değiştirdikleri anlamına gelmez. Yeni - eski olmayan uygulama kodundaki en son yönergelere uyduğunuzdan emin olun.
P.Brian.Mackey

11

Ekibimizde, genç geliştiricilere sadece bir değişkenin tam / anlık kapsamını daha kolay ayırt edebilmeleri için daha büyük sınıflarda this.veya Me.nesne niteleyicisini kullanma standardını benimsedik .

Kod olarak bu tamamen gereksiz bir şefkattir, ancak yine de aynı MISL kodunu ürettiği için hiçbir şeyi engellemez. Bunu sadece bazı gençler ile keşfettiğimiz acil bir soruna hitap ettiği için kabul ettik. Bunun ötesinde, onu dahil etmek yararlı olduğunu düşünmüyorum.


Junior kodlayıcılar hakkında büyük bir nokta.
Patrick Hughes

2
Dersleriniz daha küçük olmamalı mı? Yoksa bu eski bir sorun mu?
Tjaart

@Tjaart: Sınıflar olması gerektiği kadar büyük veya küçük. Küçük bir sınıfta bile, bir değişkenin kapsamını ekranda göründüğü gibi unutmak kolay olabilir.
Joel Etherton

1
Çocuklarınızın neden problemleri @JoelEtherton? Python'luların kendileri eklemeyi unuttukları zıt bir problemleri var. özel değişkenlere erişmek için. Gençler sadece sözleşmeyi unutup mahvetmiyor mu?
Tjaart

1
@Tjaart: Bazen. Sorunları var çünkü gençler, ve bazen sadece dikkat etmiyorlar veya henüz pratik bir gözleri yok. Bu tekniği standart veya konvansiyondan ziyade bir tabela olarak kullandık. Aslında bu görevden beri burada kullanılmıyor, tüm gençlerimiz çevreye alışmış durumda. Yeni juniors işe eğer (yakında olası değil) geri gelebilir hayal.
Joel Etherton

10

StyleCop, this.en iyi uygulama (ki benim yaptığım) olarak kabul edilirse, kullanımını this.en iyi uygulama olarak uygular.

Benimsediğiniz stil size ve kendi kodlama standartlarınıza bağlıdır, "en iyi" olarak tanımladığınız her şeydir. Sadece tutarlı olun. Tutarsız bir şekilde kullanmak sadece karışıklığa yol açar.

Benim akıl yürütmem, kullanarak this.örnek özelliklerine başvurduğunuz gerçeğini çağırıyor, bu nedenle, örneğin, mutasyona uğradığınızı (varsa this.x = ...), vurgulamak isteyebileceğiniz bir şey olduğunu vurgulamaya yardımcı oluyor . Ayrıca this., yönteminizi her gördüğünüzde asla durağan olamayacağı gerçeğini vurgular . Bunun gibi bir kural kullanmak m_da bunu yapacaktır, ancak manuel bir çabadır, eğer m_bir statik haline getiriyorsanız veya sınıfın dışından değeri aktarmak için bazı yöntemleri yeniden düzenlerseniz, adı kullanıyorsanız, değiştirmeyi hatırlamanız gerekir. thisderleyici değişikliği yapmaya zorlar.

Basitçe kullanmak thisdaha kolaydır, çünkü yanlış yaparsanız kodunuz derlenmez, kullanırsanız m_manuel bir çabadır ve araçları kullanmazsınız.


9
Ve Resharper "bunu" kaldırmayı önerecektir. Kilometreniz değişebilir.
Carra

Eh? Resharper bunu asla önermedi. Belki StyleCop eklentisine sahip olduğum için mi?
Jesse C. Slicer

1
Doğru, StyleCop yüklü R # bu seçeneği kapatır.
Steve

5

Kullanmayla ilgili güzel şeylerden biri m_, küçük mintellisense'i yazdığınızda size tüm özel değişkenlerinizin bir listesini verir, kişisel olarak bunun lehine bir artı olduğunu düşünüyorum; Benzer sebeplerden dolayı s_özel statüler ve c_özel sabitler için de giderdim . Bu Macarca gösterimdir, ancak anlamında, değişken adına faydalı bir anlam kattığı için kastedilmiştir, böylece başka herhangi bir programcı, adından tamamen açık olmayabilecek şeyler söyleyebilir.

Üye ve üye olmayan değişkenler arasında herhangi bir ayrım yapmama konusunda kesinlikle aynı fikirdeyim çünkü farklılar ve insanların bir şeyleri yok etmek için bir şey yapmadığı bir kod okuduğumda okumak gerçekten daha zor. Kullanmak this.gerekenden daha fazla kazan plakası gibi geliyor. Ama bu gerçekten kişisel bir zevk, eğer bir süre bir şekilde kod yazarsanız, bunun doğru olduğunu ve her şeyin yanlış olduğunu düşünürsünüz. Şema aklı başındaysa gerçekten önemli olan tek şey, takımdaki herkesin tutarlı olmasıdır.


4
Ya da this.intellisense'in size yazmasına izin verin.
Steve

1
@Steve Haigh: mesele bu değil, o birlikte bütün s_ vb hep birlikte görünür m_, alfabetik olarak sıralanmış olarak o gruplandırmak amacıyla üyesi tüm farklı olur söylüyor
gbjbaanb

2
kullanma this., güncel olmayan adlandırma kurallarına başvurmanıza gerek kalmadan sınıftaki her şeyi verecektir. Farklı harflerin anlamını anlıyorum, sadece gerekli olduklarını düşünmüyorum. Bu kurala ihtiyaç duyacağınız bir sınıfta çok fazla özellik, sabit vb. Varsa, o zaman tasarım oldukça kırılır.
Steve

2
@Steve Haigh: Takımdaki herkesin harika bir programcı olduğu ve hepsinin sınıflarını küçük ısırık parçalarına ve yeniden düzenleyiciye böldüğü ve tasarım vb. oldukça qhite böyle. Ama muhtemelen haklı olduğunuz ideal bir dünyada katılıyorum.

@Steve: Yazmak m_bana tüm üye değişkenlerin bir listesini verecektir. Yazmak this.bana üye değişkenlerinin ve üye işlevlerinin bir listesini verecektir.
Sean

4

thisaçıktır. Bu kaçıramayacağınız optik bir işaret.

Neredeyse her zaman örtük kod yerine açık kod tercih ederim. Bu yüzden thissık kullanıyorum. Bunu en iyi uygulama olarak görüyorum.


4

Ben her zaman "bu" kullanıyorum. Akıl yürütme iki basit gerçeğe dayanmaktadır:

  • Kod okumak, kod yazmaktan daha zordur.
  • Kodu, kod yazdığınızdan daha sık okursunuz.

"Bu" kullanımı onu okuyan herkes için oldukça açık hale getirir (yani sadece yazar değil, aynı zamanda uygulamanın özellikleri unutulduktan sonra 6 ay içinde yazarı da içerebilir) evet, bu bir sınıf üyesi burada bahsediyoruz. "m_" ve benzerleri sadece bir kuraldır ve diğer tüm kurallar gibi kötüye kullanılabilir (veya hiç kullanılmaz) - derleme zamanında veya çalışma zamanında "m _" / etc'yi uygulayacak hiçbir şey yoktur. "this" daha güçlü: "m_" yi yerel bir değişkene koyabilirsiniz ve derleyici şikayet etmeyecektir; bunu "bu" ile yapamazsınız.

"Bu" kullanımının dil spesifikasyonlarında zorunlu kılınması üzücü.

Güzel bir bonus olarak, hata ayıklama sırasında "bu" üzerine gelebilir (veya bir saat ekleyebilirsiniz) ve diğer tüm sınıf üyelerinin de denetimini kazanabilirsiniz - değerli bilgiler.


3

thisAnahtar kelime özellikle aynı adı taşıyan bir değişkeni bulunan yapıcısı veya yöntemi var ama aynı türü olabilir yaparken, mevcut 2 değişkeni ayırt etmek özellikle kullanılır.

Misal:

public class Example {

    string reason;
    string cause;

    Example (string reason, string cause) {
        this.reason = reason;
        this.cause = cause;
    }

    //<Setter> if you want to explicitly write your onw
    public void setReason(stirng reason) {
        this.reason = reason;
    }
}

Bu (örn. this.reason = reason) Temel olarak parametreleri sınıftaki değişkenlere atar. thistemelde sınıfı reasonparametre bloğundan alır.


2

Bir süredir bunu merak ediyorum. Javascript bazı kapsamlı kodlama yaptıktan sonra, kendimi this.c # kodumda daha sık kullanarak yakaladım (bundan önce neredeyse tamamen kurucuları veya benzer yöntemlerde belirsizliği önlemek için kullandım). Daha az çaba için kodu biraz daha açık hale getirir, ayrıca sınıf üyesi adlarınızı öneklerle silmeye son vermezsiniz ve yine de bağlam açık olduğunda veya özellikle karmaşık ifadelerde üyeleri 'kısa yoldan' kullanmaya geri dönebilirsiniz. Ben sadece this., ben daha uzun bir yöntem, daha uzun bir argüman listesi veya birçok yerel değişkenler ilan zaman eklemek ve zorlansa bile, kod bazı ek netlik kar olabilir düşünüyorum.

Ama şahsen m_önek stilinden kesinlikle nefret ediyorum, Macarca yüzünden çok fazla değil, çünkü alt çizgi yazmak için bir acı olduğu için;) Bu yüzden alternatif olarak düşünmüyorum. İtiraf söz konusu olduğunda güçlü noktaları olduğunu kabul edeceğim, ancak bir üye değişkenin ilk birkaç harfini hatırlayamıyorsanız, sınıfınızın büyük olduğunu tekrar iddia edebilirsiniz.


1

Sınıf üyeleri için tek bir alt çizgi öneki tercih ederim. _someVar;

Neden? İlk bakışta bunun bir yığın değişkeni değil, bir üye olduğunu biliyorsunuz. Hızlı bir bakışta kolaylık. "Bu" anahtar kelimeye kıyasla daha az karmaşıklık gerektirir.


1

this.Ne öneki ne de sonucu değiştiren önek / anahtar kelime gibi şeyler kullanmak her zaman özneldir. Ancak, çoğumuzun alanları yerel değişkenlerden ayırmak istediğini kabul edebiliriz. Bazıları alt çizgi öneki (çirkin ve Macarca bir gösterim buldum) kullanır, diğerleri this.anahtar kelimeyi kullanır . Ben ikincisiyim. Her şey sadece okunabilirlik ve anlaşılabilirlik ile ilgilidir. Daha net veya daha okunaklıysa biraz fazladan yazmayı umursamıyorum. Göz açıp kapayıncaya kadar alanları ve değişkenleri ayırt etmek istiyorum.

Ben her zaman benzer adlı alanları tanımlamak myFieldve parametre adları ve yerel değişken adları da benzer myField. Alt çizgi yok, önek yok. thisBir alanı ifade ettiğim her yerde kullanıyorum . Bu şekilde alanları herhangi bir önek olmadan yerel değişkenlerden ve bağımsız değişkenlerden ayırabilirim. Tabii ki, böyle bir durumda thisanahtar kelime gereklidir:

public Person(string firstName)
{
    this.firstName = firstName;
}

Benim özellikleri bu nedenle (evet, ben her zaman özelliği ile alan koymak, ve benim dosya üstündeki ilgisiz bir yerde):

private string firstName;
public string FirstName
{
    get { return this.firstName; }
}

Güzel bir şekilde okuyor: bu adı geri ver .


-2

EDIT: Cevabım açıkça bir cevap değil. İşte bir düzenleme. Microsoft kodlama yönergeleri şunları belirtir:

2.6 Adlandırma

Üye değişkenleri için önek kullanmayın ( , m , s_, vb.). > Yerel ve üye değişkenleri birbirinden ayırmak istiyorsanız “this” i kullanmalısınız. C # ve “Ben” de. VB.NET'te.

Http://blogs.msdn.com/b/brada/archive/2005/01/26/361363.aspx adresinde bulunabilir.

Öyleyse, en azından Üye Devletlerden net bir kılavuz yoktur, ancak başka bir cevap StyleCop'un onu bir rehber haline getirdiğini belirtmektedir. Bu şeyler üzerinde otorite yok, bu yüzden kendi kararınızı vermenizi ya da bu durumda ekibinize vermenizi öneririm. O kadar da önemli değil.

Orijinal cevabım ben şahsen seninle aynı fikirdeyim, ama belki de iki metodu birbirine düşüren bir okuduğunu anlama testi değerli olurdu. Aksi takdirde, bu tarz şeyler sadece çamur karıştırıcıdır.

Benim salvo'yu takip etmek: Bence insanlar gereksiz yere kod stillerini karmaşıklaştırıyorlar ve eğer bir şeyin sınıf seviyesi değişkeni olduğunu belirtmeleri gerekiyorsa, kodda, eski tarif yöntemi gibi başka ciddi yapısal sorunlar da olabilir. sizi sürekli yukarı ve aşağı kaydırmaya zorlayan özel değişkenleri sınıfın en üstüne yerleştirir.

bu bana “bu nedir” sözleşmelerinden biri, doğru “ne yapıyor” isimlendirme sözleşmelerinden biri olarak dikkat çekiyor. Açıklık yukarıda kısalık tercih edilmelidir. Bu, dinamik diller tarafından sık sık tekrarlanan bir derstir. Tüm tüylere ihtiyacımız yok!


1
-1. Soruyu cevaplamak yerine, sadece en iyi uygulamaları yansıtmayan fikrinizi veriyorsunuz.
Arseni Mourzenko

Yani stylecop'a göre bunun kullanımı. @MainMa en iyi uygulamadır. Ben kesinlikle katılmıyorum. Bunu not etmek için cevabı düzenleyeceğim.
Tjaart

@ Ana şimdi daha iyi mi? Diğer pek çok cevap sadece bir fikir vermekle birlikte aşağı indirilmiyor. En iyi uygulamalar nelerdir ve nerede bulunurlar?
Tjaart

-3

bu. genellikle istenmeyen gürültüye yol açabilir.

İşte benim çözümüm:

  • parameter_names_
  • local_variables
  • ANY_CONSTANT
  • _private_members
  • NonPrivateProperties
  • _NonPrivateProperty // Destekçi
  • özel mülkiyet
  • _privateProperty // destekçi

2
Bu, ortak .Net stiline çok aykırıdır. deve ve pascal muhafaza boyunca. Metodunuz oldukça tutarsız. Ayrıca sabitleri kapitilize etmek için oldukça eski bir stil kuralıdır ve genel .Net topluluğunda kullanılmayan kuraldır.
Tjaart

Umarım her dosyanın en üstünde, şemaya
davetsiz kalmak

Bunu eklemeyi nasıl düşündüğünü anlamıyorum. gürültü yaratacak, ama tüm bu saçma değil
Travis Weston
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.