Sınıflardaki öğelerin sırası: Alanlar, Özellikler, Yapıcılar, Yöntemler


637

Sınıf yapısı bakımından öğelerin sıralaması için resmi bir C # kılavuzu var mı?

Gidiyor mu:

  • Genel Alanlar
  • Özel Alanlar
  • Özellikleri
  • Kurucular
  • Yöntemler
    ?

Öğelerin sırası hakkında zor ve hızlı bir kural olup olmadığını merak ediyorum? Ben her yerdeyim. Her yerde yapabilmek için belirli bir standarda bağlı kalmak istiyorum.

Asıl sorun, daha karmaşık özelliklerimin çok benzer yöntemlere benzemesi ve kurucudan önce en üstte yersiz hissetmeleri.

Herhangi bir ipucu / öneriniz var mı?


7
Aslında, asıl soruyu cevaplamak için, hayır, resmi bir kılavuz yoktur. StyleCop, Microsoft'ta belirli bir grup içinde kullanılmak üzere geliştirilen yönergeleri uygular. Bu resmi bir kılavuz değildir ve Microsoft'daki gruplar arasında tekdüze bile olmayabilir.
John Saunders

2
Kolay bir hile .net'teki bazı karmaşık sınıfların meta verilerini görmek (VS'de F12). En azından publicve protectedüyeleri için nasıl sipariş edildiğini öğreneceksiniz .
nawfal

19
Bu soru görüşe dayalı değildir, çünkü resmi bir kılavuz olup olmadığını sormaktadır. Ya bir kılavuz var ya da yok!
Simon MᶜKenzie

2
@nawfal Bunun eski bir yorum olduğunu anlıyorum, bahsettiğiniz hileyi seviyorum, ancak gösterilmeyeceğini privateveya internalüyeler olmayacağını belirtmeye değer (inanıyorum). Ancak , görmek için güzel bir yol publicve protected. .NET Framework sınıflarının kaynağını görebiliriz, burada referanslar.microsoft.com da
Adam Plocher

Yanıtlar:


950

StyleCop Kuralları Belgelerine Göre sipariş olarak takip olduğunu.

Bir sınıf, yapı veya arayüz içinde: (SA1201 ve SA1203)

  • Sabit Alanlar
  • Alanlar
  • Kurucular
  • Finalizörler (Yıkıcılar)
  • Delegeler
  • Etkinlikler
  • Sıralamalar
  • Arayüzler ( arayüz uygulamaları )
  • Özellikleri
  • Dizinleyiciler
  • Yöntemler
  • yapılar
  • Sınıflar

Bu grupların her birinde erişime göre sipariş verin: (SA1202)

  • halka açık
  • iç korumalı
  • korumalı
  • özel

Erişim gruplarının her birinde statik, ardından statik olmayanlara göre sıralayın: (SA1204)

  • statik
  • statik olmayan

Statik / statik olmayan alan gruplarının her birinde, önce okunur, sonra salt okunur olarak sipariş verin: (SA1214 ve SA1215)

  • Sadece oku
  • olmayan salt okunur

Kaydedilmemiş bir liste 130 satır uzunluğunda, bu yüzden burada açmayacağım. Unrolled yöntemleri parçası:

  • halka açık statik yöntemler
  • halka açık yöntemler
  • iç statik yöntemler
  • dahili yöntemler
  • korumalı dahili statik yöntemler
  • korumalı dahili yöntemler
  • korumalı statik yöntemler
  • korunan yöntemler
  • özel statik yöntemler
  • özel yöntemler

Belgeler, öngörülen sipariş uygun değilse (örneğin, birden çok arabirimin uygulandığını ve arabirim yöntemlerinin ve özelliklerinin birlikte gruplandırılması gerektiğini), ilgili yöntemleri ve özellikleri birlikte gruplandırmak için kısmi bir sınıf kullandığını not eder.


31
Bu yazıdaki çabayı gösterdiğiniz için teşekkür ederim. StyleCop şeyler standart yapmak için çalışıyorum (sadece tutarlı ve bir şeyler bulmak kolay olsa bile) ve bu değerlidir.
Kenny Mann

47
Şahsen, statik yöntemlerin sırasını sinir bozucu buluyorum. Önce statik genel yöntemler için argüman görebilirsiniz, ancak normalde üyelerden sonra özel statik yöntemler istiyorum. Ne de olsa bunlar bir yardımcı program.
Jonathan Wright

18
Kısmi ders ipucunu beğendim
Keith Sirmons

10
Sadece kısmi sınıflarla ilgili bir not. Derleme süresi boyunca tüm kısmi parçaların tek bir tür halinde derlendiği göz önüne alındığında, her zaman bu ek yükü oluşturmak için iyi bir neden sağlamaya çalışacağım. Kısmi sınıfların temel nedeni, otomatik olarak oluşturulan kaynak kodunu genişletmek veya birden fazla geliştiricinin aynı sınıfta ancak ayrı dosyalar üzerinde çalışmasına izin vermek için büyük projeler üzerinde çalışmaktır.
Hayır

4
@ FrançoisWahl Derleyici ile ilişkili ek yük, kısmi sınıfları o kadar büyük bir tipte mi birleştiriyor?
dav_i

38

Görünürlük veya öğe türüne (alan, özellik, yöntem vb.) Göre gruplamak yerine işlevselliğe göre gruplamaya ne dersiniz?


3
StyleCop önerilerini kullanarak "sıralama" yapıyorsanız, bu bir tür işlevselliktir. Bazı yöntemlerin herkese açık, bazılarının özel olmasının iyi bir nedeni vardır. Kod gerçekten daha iyi okunabilir: Bir sınıfın .cs dosyasını açarsanız, hemen özel olanlardan "daha önemli" olan genel yöntemleri görüyorum (o sınıfı kullanan adam için)
hfrmobile 14:12

75
Sınıfınızda bunları bölümlere göre gruplandırmanız gereken çok fazla yöntem, özellik vb. Varsa, belki de bu sınıfın çok fazla şey yaptığının bir işaretidir?
Ryan Lundy

10
Sınıf küçük olsa bile, kamu yöntemlerini yalnızca bu genel yöntem tarafından çağrılan karşılık gelen özel yöntemleriyle gruplandırmak mantıklı olmaz mıydı?
Markus Meyer

11
Genel yöntem Foo () bir korumalı / özel InternalFoo () çağırırsa, bu ikinci yöntem kaynakta DoFoo () 'un hemen altında daha iyi olur, diğer korumalı / özel yöntemler arasında daha aşağı bir yerde değil.
Anders Forsgren

60
işlevselliğe göre gruplamaya sınıf denir
MrDosu

26

Bu eski ama yine de çok alakalı bir soru, bu yüzden şunu ekleyeceğim: Daha önce okuduğunuz veya okumadığınız bir sınıf dosyasını açtığınızda aradığınız ilk şey nedir? Alanlar? Özellikleri? Deneyimden, neredeyse her zaman kurucuları avlamaya başladığımı fark ettim, çünkü anlayacak en temel şey bu nesnenin nasıl inşa edildiği.

Bu nedenle, yapıcıları sınıf dosyalarında ilk sıraya koymaya başladım ve sonuç psikolojik olarak çok olumlu oldu. Yapıcıları bir sürü başka şeyden sonra koymanın standart önerisi uyumsuz hissediyor.

C # 6'daki yaklaşan birincil kurucu özelliği, bir kurucu için doğal yerin bir sınıfın en üstünde olduğuna dair kanıt sağlar - aslında birincil kurucular açık ayraçtan önce bile belirtilir.

Böyle bir siparişin ne kadar fark yarattığı komik. İlk usingönce Sistem ad alanlarıyla birlikte, ifadelerin nasıl sipariş edildiğini hatırlatıyor . Visual Studio'nun "Düzenlemeleri Kullan" komutu bu sırayı kullandı. Şimdi usings sadece alfabetik olarak sıralanmıştır, Sistem ad alanlarına özel bir işlem yapılmaz. Sonuç daha basit ve daha temizdir.


2
Sınıf başlatma / inşaat bence, kıvrımlıdır. Alanlar, açık kurucular çalıştırılmadan önce başlatılır, bu nedenle üyeleri esasen kullanıldıkları / oluşturuldukları sıraya koyma argümanınız daha da ileri giderek, başlatılmış alanlar açık olarak bildirilmiş kuruculardan önce olacaktır. Başlatılan statik alanlar ve statik yapıcılar onu daha da ilginç hale getirir.
David Culp

1
Aslında, insanlar tarafından aranma eğilimi, bu kodun önce insanlar tarafından okunması gereken edebi programlama kavramı.
parlak

1
Birincil kurucuların C # 6 planlarından kaldırıldığını unutmayın: stackoverflow.com/a/26915809/5085211
fuglede

4
10 üzerinden 9 kez, genel arayüzü arıyorum, bu yüzden tüm kamu üyelerini önce koydum, ardından dahili, ardından korumalı ve son olarak özel üyeler koydum.
Matt Davis

15

Bir dil veya endüstri standardı hakkında bir bilgim yok, ancak her bölümde bir #region ile sarılmış olan şeyleri bu sıraya koyma eğilimindeyim:

İfadeler kullanma

Ad alanı

Sınıf

Özel üyeler

Genel mülkler

Kurucular

Genel yöntemler

Özel yöntemler


Ben de aynen böyle yapıyorum. Sınıf ve Özel Üyeler dışında herhangi bir Kamu Sabiti ve
Numaralandırma

Evet, özel yöntemlerden sonra genel mülkleri korumayı tercih ediyorum. Diğer insanlar kurucuyu kamusal mülklerin önüne koymayı tercih ediyorlar ... ama kafamda bu sırayla değerler / kurucular / davranışlar olmasını tercih ediyorum. Sonra "değerler" sabit / privateMembers / properties ve benzeri olarak bölünür. Genellikle bazı büyük görünüm modelleri hariç bölgeleri kullanmıyorum ... iyi, WPF viewmodels biraz özeldir ve bu durumda genellikle özel alanları her kamu mülkünden hemen önce koyarım. Bu durumda, özel alan artı kamu üyesi aynı birimdir
zameb

15

IDesign'dan veya Brad Abram'ın web sitesinde listelenenlerden kodlama standartlarını kullanmanızı tavsiye ederim . Bunlar bulduğum en iyi ikisi.

Brad der ki ...

Sınıf üyesi alfabetik olmalı ve bölümler halinde gruplandırılmalıdır (Alanlar, Yapıcılar, Özellikler, Olaylar, Yöntemler, Özel arayüz uygulamaları, Yuvalanmış türler)


3
Bu bağlantının bugünlerde sadece IDesign ana sayfasına yönlendirdiği görülüyor. Görünüşe göre kodlama standartları bu gün e-postayla indirilen bir indirme bağlantısının arkasına gizlenmiş görünüyor. #Justsaying
Liam

Kılavuz ilkelerin mantığı olmalıdır. Bunun mantığı şudur: 1. anlamanız için, 2. sınırda, ince, belirsiz, öngörülemeyen veya çelişen davalarda karar verebilmeniz için, 3. koşulların ne zaman değiştiğini ve bazı yönergelerin artık geçerli olmadığını ayarlayabilmeniz için.
Pablo H

6

Daha önce de belirtildiği gibi, C # dilinde düzeni belirleyen hiçbir şey yok, ben şahsen bölgeleri kullanıyorum ve ortalama bir sınıf için böyle bir şey yapıyorum.

public class myClass
{
#region Private Members

#endregion
#region Public Properties

#endregion

#region Constructors

#endregion
#region Public Methods

#endregion
}

Zaten bana mantıklı geliyor


19
Stylecop'un bölgeleri kullanmamanızı önerdiğini (sadece bilgi için) söylemek gerekir (SA1124 DoNotUseRegions)
Gerwald


1
@zwcloud Elbette, 5538 satırlı bir dosyada bölgeler gereklidir, ancak bu, normal dosyalarda bölgeleri kullanmanız gerektiği anlamına gelmez.
Ghost4Man

1
@Gerwald: Sanırım StyleCop sadece StyleCop kullanan insanlar için. Birçok standarttan biri
zameb

1
@zameb: Şunu söyleyebilirim ki, StyleCop kuralları C # için en yaygın kodlama kurallarından biridir. Herhangi bir dilde kodlama yaparken, her zaman en yaygın kodlama kurallarını bulmaya ve bunları takip etmeye çalışıyorum.
Gerwald

5

StyleCop'tan

özel alanlar, ortak alanlar, kurucular, özellikler, genel yöntemler, özel yöntemler

StyleCop, MS derleme sürecinin bir parçası olduğundan, bunu fiili bir standart olarak görebilirsiniz


İlginç. StyleCop'u düzenli olarak kullanıyor musunuz?
mmcdole

Bir proje için evet, çünkü bazı MS sözleşme çalışmaları için tekrar tekrar kullanılır. Çok sinir bozucu bir sırıtma
blowdart

1
StyleCop'u uzun süre kullanmak ve bu önerileri kullanmak kodu gerçekten daha okunaklı hale getirirse: Bir sınıfın .cs dosyasını açarsanız hemen özel olanlardan daha önemli olan genel yöntemleri görüyorum. Halk, sınıfın sundukları ve test edilebilecekleri "arayüzler" dir (TDD ve Önce Test'i tercih edin)
hfrmobile

1
StyleCop göre kamu alanları özel alanlardan önce gitmeli stylecop.com/docs/SA1202.html
Michael Freidgeim

1
"StyleCop, MS oluşturma sürecinin bir parçası" ile ne demek istiyorsun? Microsoft, tüm kodu için StyleCop kullanıyor mu?
Rico Suter

5

Genellikle bir sonraki kalıbı takip etmeye çalışırım:

  • statik üyeler (genellikle başka bir bağlamı vardır, iş parçacığı açısından güvenli olmalıdır vb.)
  • yönetim ortamı üyeleri

Her bölüm (statik ve örnek) aşağıdaki üye türlerinden oluşur:

  • operatörler (daima statiktir)
  • alanlar (kuruculardan önce başlatıldı)
  • kurucular
  • yıkıcı ( yapıcıları takip etme geleneğidir) )
  • özellikleri
  • yöntemleri
  • Etkinlikler

Ardından üyeler görünebilirliğe göre sıralanır (daha azdan daha görünüre):

  • özel
  • dahili korumalı
  • korumalı
  • halka açık

Sıra bir dogma değildir: basit sınıfların okunması daha kolaydır, ancak daha karmaşık sınıfların bağlama özgü gruplandırmaya ihtiyacı vardır.


5

Benim tercihim, türüne göre sipariş vermek ve daha sonra görünürlüğü azaltmaktır.

public methods
public events
public properties

protected methods
protected events
protected properties

private methods
private events
private properties
private fields

public delegates
public interfaces
public classes
public structs

protected delegates
protected interfaces
protected classes
protected structs

private delegates
private interfaces
private classes
private structs

Bunun Style Cop'ı ihlal ettiğini biliyorum ve eğer birisi bana bir türün uygulama ayrıntılarını arayüzünden önce yerleştirmem için iyi bir neden verebilirse değiştirmek istiyorum. Şu anda, özel üyeleri son tutmaya yönelik güçlü bir tercihim var.

Not: Herkese açık veya korunan alanları kullanmıyorum.


3
Kabul. Özel üyeleri ilk sıraya koyma fikrinin, değişkenlerin önce bildirilmesi gereken C günlerinden kalma bir engel olmadığını gerçekten merak ediyorum. Neredeyse her zaman sınıf arayüzünü değil, genel arayüzü görmek istiyorum.
Matt Davis

1
Bu aslında çok mantıklı. Bahse girerim,
C.'den bir kalıntıdır

En büyük gotcha'lardan bazıları IMO özellikleri olabilir. Farkında olmadığınız bir alıcı / ayarlayıcıda mantık olduğunda, bu yöntemlerde yan etkileri ısırmak çok daha muhtemel olacaktır (doğal olarak onların olmasını beklersiniz) Bu nedenle, üstlerindeki alanların yanında özellikleri tercih ederim , bu yüzden bir sınıfa ilk kez baktığımda gotcha'nın tepesinde olduğunu görüyorum. Nerede bir yöntem okuduğumda, normalde yine
Ryan The Leach


3

bunun için önerdiğim tek kodlama yönergeleri alanları sınıf tanımının en üstüne koymaktır.

sonra inşaatçılar koymak eğilimindedir.

genel yorumum, dosya başına bir sınıfa bağlı kalmanız ve sınıfın yöntemlere karşı özelliklerin organizasyonu büyük bir endişe olacak kadar büyükse, sınıfın büyüklüğü nedir ve yine de yeniden düzenlemelisiniz? birden fazla endişeyi temsil ediyor mu?


3
ve bölgelere ihtiyacınız olduğunda ... kaybettiniz.
Hamish Smith

3

Özel alanları yapıcılarla birlikte en üste koymayı, sonra genel arabirim bitlerini, sonra özel arabirim bitlerini koymayı tercih ederim.

Ayrıca, sınıf tanımınız, öğelerin siparişinin çok önemli olması için yeterince uzunsa, muhtemelen sınıfınızın çok hantal ve karmaşık olduğunu gösteren bir kod kokusudur ve refactor olmalısınız.


3

Mümkün olduğunca basit tutuyorum (en azından benim için)

Numaralandırma
Bildirimleri
Oluşturucular
Geçersiz Kılma
Yöntemleri
Özellikler
Olay İşleyici


2

Dilde kesinlikle onu hiçbir şekilde uygulayan hiçbir şey yoktur. Nesneleri görünürlüğe göre gruplama eğilimindeyim (herkese açık, sonra korunan, sonra özel) ve bir özelliği, yöntemi veya herhangi bir şey olup olmadığına bakılmaksızın #regions'ı ilgili şeyleri işlevsel olarak gruplandırmak için kullanıyorum. İnşaat yöntemleri (gerçek ctorlar veya statik fabrika fonksiyonları olsun), müşterilerin en çok bilmesi gereken ilk şey oldukları için genellikle en üstte yer alır.


Bölgeleri görünürlükle ayırmak için kullanıyorum ve Bölgesel kod düzenine sahip olmak beni dürüst tutuyor. rauchy.net/regionerate
Unutulmuş Noktalı virgül

#Regions kullanmayla ilgili bir sorun görmüyorum, ancak sık sık bir bölgeye koymaya cazip geldiğimde, sınıflarımı bölmeyi düşünmemi ister.
mikecamimo

2

Bu eski olduğunu biliyorum ama benim sipariş aşağıdaki gibidir:

kamu düzeninde, korunan, özel, iç, soyut

  • Sabitler
  • Statik Değişkenler
  • Alanlar
  • Etkinlikler
  • Oluşturucu (lar)
  • Yöntemler
  • Özellikleri
  • Delegeler

Ben de (stenografi yaklaşımı yerine) böyle özellikler yazmayı seviyorum

// Some where in the fields section
private int someVariable;

// I also refrain from
// declaring variables outside of the constructor

// and some where in the properties section I do
public int SomeVariable
{
    get { return someVariable; }
    set { someVariable = value; }
}
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.