C # kısmi sınıflarını kullanmak ne zaman uygundur?


Yanıtlar:


423

Kısmi sınıfların en büyük kullanımı kod üreticileri / tasarımcıları için hayatı kolaylaştırmaktır. Kısmi sınıflar, oluşturucunun basitçe yayınlaması gereken kodu yayınlamasına izin verir ve dosyadaki kullanıcı düzenlemeleriyle uğraşmak zorunda kalmaz. Kullanıcılar aynı şekilde ikinci bir kısmi sınıfa sahip olarak sınıfa yeni üyelerle açıklama ekleyebilirler. Bu, endişelerin ayrılması için çok temiz bir çerçeve sağlar.

Buna bakmanın daha iyi bir yolu, tasarımcıların kısmi sınıflardan önce nasıl işlediğini görmek. WinForms tasarımcısı, bir bölgenin içindeki tüm kodu, kodu değiştirmeme konusunda güçlü ifadelerle yorumluyordu. Daha sonra işlenmek üzere üretilen kodu bulmak için her türlü buluşsal yöntem eklemek zorundaydı. Artık designer.cs dosyasını açabilir ve yalnızca tasarımcıyla ilgili kod içerdiğine dair yüksek derecede güvene sahip olabilir.


70
Kısmi derslerden önce bana ne kadar kötü şeyler olduğu hakkında kabuslar vermek için -1 vermek için cazip :)
Jon B

9
@Jon :), sanırım hepimiz bu kabusları gördük.
JaredPar

18
Bir keresinde 36K'dan fazla satır (veya muhtemelen çok daha fazlasını hatırlamıyorum) üreten bir kod üreticisi yazdım ve editörlerim kaynak açıldığında engellendi. Kısmi sınıflar, üretilen kodu 4 GB RAM olmadan görmemi sağladı.
Luca

6
Bu, üretim kodunda kısmi sınıflar için tek kullanım olduğunu söyleyebilirim. Kabul etmeme rağmen yeniden düzenleme için yararlı olabilir.
Gordon McAllister

5
@Gordon - HumerGu'nun cevabı, tartışmak oldukça zor olduğunu düşündüğüm bir başka soru. Kısmi sınıflar, C # 'daki arayüzleri uygulamak ve arayüz üyelerini sınıf üyelerinden açıkça ayırmak için çok kullanışlı olabilir: stackoverflow.com/questions/3601901/why-use-partial-classes/…
STW

261

Başka bir kullanım, farklı arayüzlerin uygulanmasını ayırmaktır, örneğin:

partial class MyClass : IF1, IF2, IF3
{
    // main implementation of MyClass
}


partial class MyClass
{
    // implementation of IF1
}

partial class MyClass
{
    // implementation of IF2
}

6
İyi bir nokta! Daha önce yaptığım ve unuttuğum bir şey, ancak arayüz üyelerini açıkça görünür tutmak için kesinlikle güzel bir yoldur (özellikle C #'da, VB.NET Implementsbir arabirime ait bir yöntemi belirtmek için anahtar kelimeyi kullandığından )
STW

2
çok güzel bir nokta, her arabirim bir Geliştirici tarafından Uygulanabilir, Ayrıca arayüzün uygulamasını kolayca bulmak için iyi bir yoldur.
kokabi

3
IF1 veya IF2 için hangisinin sınıfların beyan sırasına göre nasıl olduğunu bilebilir?
kuldeep

17
İyi bir kullanım ama kötü bir örnek. Neden ah neden bir arabirim sınıfındaki tüm arabirimleri tanımlayıp aynı arabirimleri diğer kısmi sınıflarda
uygularsınız

4
Ha, arayüz uygulamalarının ayrılmasının kısmi sınıflar için standart bir kullanım olup olmadığını görmek için bu soruya baktım. Başkalarının bunu iyi bir fikir olarak gördüğüne sevindim. @İnkredibl ile arabirim tanımını uygulayan kısmi sınıfla bir araya getirme konusunda hemfikirim.
Kim

171

Diğer cevapların yanı sıra ...

Tanrı sınıflarını yeniden düzenlemede onları bir basamak taşı olarak buldum. Bir sınıfın birden fazla sorumluluğu varsa (özellikle çok büyük bir kod dosyasıysa), kodu düzenlemek ve daha sonra yeniden düzenlemek için ilk geçiş olarak sorumluluk başına 1x kısmi sınıf eklemeyi yararlı buluyorum.

Bu, büyük ölçüde yardımcı olur, çünkü kodu yürütme davranışını etkilemeden çok daha okunabilir hale getirmeye yardımcı olabilir. Ayrıca, bir sorumluluğun ne zaman yeniden yapılandırılacağını veya diğer yönlere sıkıca karıştığını belirlemeye yardımcı olabilir.

Ancak - açık olmak gerekirse - bu hala kötü bir kod, geliştirme sonunda hala sınıf başına bir sorumluluk istiyorsunuz ( kısmi sınıf başına DEĞİL ). Bu sadece bir atlama taşı :)


23
Çok hoş: "... gelişimin sonunda hala sınıf başına bir sorumluluk istiyorsun ( kısmi sınıf başına DEĞİL ) ..."
kokabi

Bana göre, bu iyi bir kodlama stili değil, ama kötü kodların daha iyi görünmesini sağlayabilir.
tema alanı

Buna tamamen katılıyorum. Kötü kodu düzeltmek için iyi bir basamak taşıdır. Bir tanrı sınıfı, birden fazla dosyaya yayılmış ya da dağıtılmamış bir tanrı sınıfı havasıdır.
Jimbo

84
  1. Birden Çok GeliştiriciKısmi Sınıfları Kullanan çok geliştirici aynı sınıfta kolayca çalışabilir.
  2. Kod Oluşturucu Kısmi sınıflar çoğunlukla kod oluşturucu tarafından farklı endişeleri ayrı tutmak için kullanılır
  3. Kısmi Yöntemler Kısmi Sınıflar kullanarak, bir geliştiricinin yöntemi tanımlayabildiği ve diğer geliştiricinin bunu uygulayabileceği Kısmi yöntemler de tanımlayabilirsiniz.
  4. Yalnızca Kısmi Yöntem Beyanı Kod yalnızca yöntem bildirimi ile derlense bile ve yöntemin uygulanması yoksa derleyici bu kod parçasını güvenle kaldırabilir ve derleme zamanı hatası oluşmaz.

    Nokta 4'ü doğrulamak için. Sadece bir winform projesi oluşturun ve bu satırı Form1 yapıcısından sonra ekleyin ve kodu derlemeye çalışın.

    partial void Ontest(string s);

Kısmi sınıfları uygularken dikkate alınması gereken bazı noktalar: -

  1. Kısmi sınıfın her bir bölümünde kısmi anahtar kelime kullanın.
  2. Kısmi sınıfın her bölümünün adı aynı olmalıdır, ancak kısmi sınıfın her bölümünün kaynak dosya adı farklı olabilir.
  3. Kısmi bir sınıfın tüm bölümleri aynı ad alanında olmalıdır.
  4. Kısmi bir sınıfın her parçası aynı derleme veya DLL dosyasında olmalıdır, başka bir deyişle, farklı bir sınıf kitaplığı projesinden kaynak dosyalarda kısmi bir sınıf oluşturamazsınız.
  5. Kısmi bir sınıfın her bölümü aynı erişilebilirliğe sahip olmalıdır. (ör. özel, genel veya korumalı)
  6. Kısmi bir sınıfta bir sınıfı veya arabirimi miras alırsanız, o kısmi sınıfın tüm bölümleri tarafından miras alınır.
  7. Kısmi sınıfın bir kısmı mühürlenirse, tüm sınıf mühürlenir.
  8. Kısmi sınıfın bir kısmı soyut ise, tüm sınıf soyut bir sınıf olarak kabul edilecektir.

1
Entity Framework'ten oluşturulan bir kısmi sınıfı düzenlemede sorun var mı? Tablodan oluşturulan bazı sınıf adlarını değiştirmek istiyorum.
MarceloBarbosa

Aynı endişelerim var. Entity Framework temelde bir Kod İlk bakış açısı / yaklaşım / uygulama ... ne var ne zaman modelleri oluşturmak zaman kısmi bir sınıfın faydaları "Varsa" bilmek istiyorum.
Chef_Code

@JimBalter Lütfen bu bağlantıyı ziyaret edin msdn.microsoft.com/en-us/library/6b0scde8(v=vs.110).aspx . Bu, herhangi bir uygulama yoksa, derleyicinin kod parçasını kaldıracağını ve derleme zamanı hatasının alınmayacağını belirtir.
hellowahab

Kısmi bir sınıfta bir sınıfı veya arabirimi miras alırsanız, o kısmi sınıfın tüm bölümleri tarafından miras alınır.
Kırmızı Bezelye

56

Bir büyük kullanım üretilen kodu aynı sınıfa ait elle yazılmış koddan ayırmaktır.

Örneğin, LINQ to SQL kısmi sınıflar kullandığından, belirli işlevsellik parçalarına kendi uygulamanızı yazabilirsiniz (Çoktan çoğa ilişkiler gibi) ve kodu yeniden oluşturduğunuzda bu özel kod parçalarının üzerine yazılmaz.

Aynı şey WinForms kodu için de geçerlidir. Tasarımcı tarafından oluşturulan tüm kod genellikle dokunmadığınız bir dosyaya gider. Elle yazılmış kodunuz başka bir dosyaya girer. Bu şekilde, Designer'daki bir şeyi değiştirdiğinizde değişiklikleriniz uçmaz.


21

Kısmi Sınıf'ın otomatik kod oluşturmada kullanıldığı doğrudur, bir kullanım bin satır kod içerebilen büyük bir sınıf dosyasını koruyor olabilir. Sınıfınızın 10 bin satırla sonuçlanabileceğini asla bilemezsiniz ve farklı bir adla yeni bir sınıf oluşturmak istemezsiniz.

public partial class Product
{
    // 50 business logic embedded in methods and properties..
}

public partial class Product
{
    // another 50 business logic embedded in methods and properties..
}
//finally compile with product.class file.

Başka bir olası kullanım, birden fazla geliştiricinin farklı yerlerde depolandıkları sınıfta çalışabilmesidir. İnsanlar gülebilir ama bazen bir avuç olabileceğini asla bilemezsiniz.

Product1.cs

public partial class Product
{
    //you are writing the business logic for fast moving product
}

Product2.cs

public partial class Product
{
    // Another developer writing some business logic...
}

Umarım mantıklıdır!


13

Kısmi sınıflar birden çok dosyaya yayılır.

Kısmi değiştiriciyi bir C # sınıfı bildiriminde nasıl kullanabilirsiniz?

Kısmi sınıflarla, bir sınıfı fiziksel olarak birden çok dosyaya ayırabilirsiniz. Bu genellikle kod üreticileri tarafından yapılır.

Misal

Normal C # sınıflarıyla, aynı projedeki iki ayrı dosyada bir sınıf bildiremezsiniz. Ancak partialdeğiştirici ile yapabilirsiniz.

Bu, bir dosya yaygın olarak düzenlenirken diğeri makine tarafından oluşturulursa veya nadiren düzenlenirse yararlıdır.

Aşağıda açıklığa kavuşacak bir örnek verilmiştir:

class Program
{
    static void Main()
    {
        A.A1();
        A.A2();
    }
}

A1.cs dosyasının içeriği: C #

using System;

partial class A
{
    public static void A1()
    {
        Console.WriteLine("A1");
    }
}

A2.cs dosyasının içeriği: C #

using System;

partial class A
{
    public static void A2()
    {
        Console.WriteLine("A2");
    }
}

Çıktı:

A1
A2

Burada kısmi gerekli.

partialDeğiştiriciyi kaldırırsanız, bu metni içeren bir hata alırsınız:

[' <global namespace>' Ad alanı zaten ' A' için bir tanım içeriyor ].

İpucu:

Bunu düzeltmek için partialanahtar kelimeyi kullanabilir veya sınıf adlarından birini değiştirebilirsiniz.

C # derleyicisi kısmi sınıflarla nasıl ilgilenir?

Yukarıdaki programı demonte ederseniz (IL Disassembler kullanarak), A1.cs ve A2.cs dosyalarının kaldırıldığını göreceksiniz. A sınıfının mevcut olduğunu göreceksiniz.

Sınıf A, aynı kod bloğundaki A1 ve A2 yöntemlerini içerecektir. İki sınıf bir araya getirildi.

A1.cs ve A2.cs dosyasının derlenmiş sonucu: C #

internal class A
{
    // Methods
    public static void A1()
    {
        Console.WriteLine("A1");
    }

    public static void A2()
    {
        Console.WriteLine("A2");
    }
}

özet

  • Kısmi sınıflar, belirli C # programlama durumlarını basitleştirebilir.
  • Genellikle Windows Forms / WPF programları oluştururken Visual Studio'da kullanılır.
  • Makine tarafından oluşturulan C # kodu ayrıdır.
  • Veya tüm açıklamayı burada bulabilirsiniz .

2
Güzel bir örnek ve iyi belgelenmiş.
Chef_Code

1
Bu imo'yu takip etmenin en kolay açıklaması.
Yusha

12

büyük sınıflarla çalışırken veya bir ekip üzerinde çalışırken her şeyi olabildiğince temiz tutun, geçersiz kılmadan (veya her zaman değişiklikleri gerçekleştirmeden) düzenleyebilirsiniz


11

Kısmi sınıflar için ana kullanım kodu üretilen koddur. WPF (Windows Presentation Foundation) ağına bakarsanız, kullanıcı arayüzünüzü biçimlendirme (XML) ile tanımlarsınız. Bu işaretleme kısmi sınıflara derlenir. Kodu kendi kısmi sınıflarınızla dolduruyorsunuz.


8

Etkili bir yeniden düzenlemeye uygun olmayan yeterince büyük bir sınıfınız varsa, onu birden çok dosyaya ayırmak, işlerin düzenli kalmasına yardımcı olur.

Örneğin, bir tartışma forumu ve bir ürün sistemi içeren bir site için veritabanınız varsa ve iki farklı sağlayıcı sınıfı oluşturmak istemiyorsanız (proxy sınıfıyla aynı şey DEĞİL, sadece açık olmak gerekirse), gibi farklı dosyalarda tek bir kısmi sınıf oluşturun

MyProvider.cs - çekirdek mantık

MyProvider.Forum.cs - özellikle foruma ait yöntemler

MyProvider.Product.cs - ürünler için yöntemler

İşleri düzenli tutmanın başka bir yolu.

Ayrıca, başkalarının söylediği gibi, sınıfın bir sonraki yeniden oluşturuluşunda eklerinizin yok edilmesi riski olmadan oluşturulan bir sınıfa yöntem eklemenin tek yolu budur. Bu, şablon tarafından üretilen (T4) kod, ORM'ler vb.İle kullanışlı olur.


2
Kısmi olanları yeniden düzenlemeye (cevabımın bütün noktası) doğru bir basamak olarak savunurdum, ama onları temiz kod yazmaya gerçek bir çözüm olarak önermem. Kısmi bir sınıf, sınıfın diğer kaygılarından temiz bir şekilde ayrılırsa, neden tek başına bir sınıfa tanıtmak için ekstra küçük bir çaba harcamıyorsunuz?
STW

@STW: Çeşitli görevler için birçok nesne örneği oluşturulmuş ve kullanılmış olabilir. Çeşitli görevlerin farklı sınıflara ayrılması, hangi modüllerin hangi görevler için kullanıldığını izlemeyi gerektirecektir - kod modülleri arasında sadece hareket eden bloklardan çok daha büyük bir taahhüt.
supercat

4
@supercat - Tamamen anlıyorum, ama spagetti bu tür temizlik gerektiğini gerçekleştirilecektir. Tam olarak bu tür bir kodu temizlemekten gelen çok sayıda yara izim var ve onu geride bırakmayı asla savunmam. Bu tür karışıklıkların sürekli sorun yaratması garanti edilir ve uzun vadeli getirisi, sorunu görmezden gelmekle karşılaştırıldığında çok büyüktür. Bunun gibi kod "kokmuyor", bir çöplük gibi görünüyor.
STW

1
@supercat - "Kısmi diğer endişelerden temiz bir şekilde ayrılırsa ... o zaman küçük bir çaba" ile kalifiye etmeye çalıştım. Kargaşadan kurtulmak, Rogaine olmasa da genellikle uzun süreli bakımda büyük tasarruf sağlayacaktır
STW

2
Bu arada, bugünlerde Roslyn'i değiştirmeye çalışıyorum ve kısmi sınıfların kapsamlı kullanımı ile yazılıyor. Roslyn'deki birçok büyük sınıf ve çok sayıda dosya birden fazla dosyada kısmi sınıf olarak tanımlanır. Ve Roslyn, en azından çok zeki C # programcıları olduğumu düşündüğüm insanlar tarafından yazıldı.
RenniePet

8

Derleyici öncesi direktiflere alternatif olarak.

Derleyici öncesi yönergeleri (yani #IF DEBUG) kullanırsanız, gerçek Sürüm kodunuzla iç içe bir şekilde görünen bazı gnarly görünümlü kodlarla sonuçlanırsınız.

Bu kodu içermek için ayrı bir kısmi sınıf oluşturabilir ve bir kısmi sınıfın tamamını bir yönerge içine sarabilir veya bu kod dosyasının derleyiciye gönderilmesini (etkin olarak aynısını yaparak) atlayabilirsiniz.


Monogame bu stratejiyi kullanır.
Zamboni

6

Hizmet başvuruları, kısmi sınıfların oluşturulan kodu kullanıcı tarafından oluşturulan koddan ayırmak için yararlı olduğu başka bir örnektir.

Hizmet referansını güncellediğinizde, hizmet sınıflarını üzerine yazmadan "genişletebilirsiniz".


6

Gördüğüm başka bir kullanım,

Veri erişim mantığına ilişkin büyük bir soyut sınıfı genişletmek,

Post.cs, Comment.cs, Pages.cs isimleri ile çeşitli dosyaları var ...

in Post.cs 

public partial class XMLDAO :BigAbstractClass
{
// CRUD methods of post..
}


in Comment.cs 

public partial class XMLDAO :BigAbstractClass
{
// CRUD methods of comment..
}

in Pages.cs 

public partial class XMLDAO :BigAbstractClass
{
// CRUD methods of Pages..
}

6

Çoğu kişi, bunun partialyalnızca kod dosyası oluşturulmuş bir sınıf veya arabirimler için kullanılması gerektiğini belirtir. Kabul etmiyorum ve işte nedeni bu.

Bir örnek için, C # System.Math sınıfına bakalım ... bu sınıf . Ben aynı tek kod dosyasına 70 + yöntemleri şeyler denemek olmaz. Bakmak bir kabus olurdu.

Her matematik yöntemini bireysel kısmi sınıf dosyalarına ve tüm kod dosyalarını projedeki bir Math klasörüne yerleştirmek, çok daha temiz bir organizasyon olacaktır.

Aynı şey, çok sayıda farklı işlevselliğe sahip diğer birçok sınıf için de geçerli olabilir. Örneğin, PrivateProfile API'sini yönetmek için bir sınıf, tek bir proje klasöründe temiz bir kısmi sınıf dosya kümesine bölünerek yararlanabilir.

Şahsen, çoğu insanın "yardımcı" ya da "yardımcı" sınıfları olarak adlandırdıkları her yöntem veya yöntem fonksiyonel grubu için ayrı kısmi dosyalara böldüm. Örneğin bir projede dize yardımcı sınıfı neredeyse 50 yönteme sahiptir. Bölgeleri kullanarak bile uzun süre kullanılmayan bir kod dosyası olurdu. Her yöntem için ayrı kısmi sınıf dosyaları kullanarak bakımını yapmak oldukça kolaydır.

Ben sadece kısmi sınıfları kullanarak dikkatli olun ve bunu yaparken tüm kod dosyası düzeni proje boyunca tutarlı tutmak. Herhangi bir sınıf genel numaralandırmasını ve sınıf özel üyelerini, yalnızca içerdikleri kısmi dosyaya özgü olmadıkları sürece, klasörlerdeki bir Common.cs dosyasına veya benzer şekilde adlandırılmış bir dosyaya yerleştirmek gibi.

Bir sınıfı ayrı dosyalara böldüğünüzde, geçerli dosyanın iki farklı bölümünü aynı anda görüntülemenizi sağlayan metin düzenleyici ayırma çubuğunu kullanma yeteneğinizi de kaybettiğinizi unutmayın.


4

Kısmi sınıflar, uygun şekilde tasarlanmış bir programa yalnızca kaynak dosyaları ekleyerek işlevsellik eklemeyi mümkün kılar. Örneğin, bir dosya içe aktarma programı, bunları işleyen modüller ekleyerek bilinen farklı dosya türlerini ekleyebilecek şekilde tasarlanabilir. Örneğin, ana dosya türü dönüştürücüsü küçük bir sınıf içerebilir:

Kısmi Genel Sınıf zzFileConverterRegistrar
    Olay Kaydı (ByVal mainConverter, zzFileConverter olarak)
    Alt kayıtTüm (ByVal mainConverter, zzFileConverter olarak)
        RaiseEvent Kaydı (mainConverter)
    End Sub
Bitiş Sınıfı

Bir veya daha fazla dosya dönüştürücü türünü kaydetmek isteyen her modül aşağıdakileri içerebilir:

Kısmi Genel Sınıf zzFileConverterRegistrar
    Private Sub RegisterGif (zvFileConverter olarak ByVal mainConverter) Beni İşe Alıyor
        mainConverter.RegisterConverter ("GIF", GifConverter.NewFactory))
    End Sub
Bitiş Sınıfı

Ana dosya dönüştürücü sınıfının "ifşa edilmediğini" unutmayın - sadece eklenti modüllerinin bağlanabileceği küçük bir saplama sınıfı ortaya koyar. Çakışmaları adlandırma riski azdır, ancak her eklenti modülünün "kayıt" rutini, ele aldığı dosya türüne göre adlandırılmışsa, muhtemelen bir sorun oluşturmamalıdır. Bu tür şeyler için endişe duyulursa, kayıt alt programı adına bir GUID yapıştırılabilir.

Düzenleme / Zeyilname Açık olmak gerekirse, bunun amacı, çeşitli ayrı sınıfların bir ana programın veya sınıfın bunları bilmesini sağlayabileceği bir yol sağlamaktır. Ana dosya dönüştürücüsünün zzFileConverterRegistrar ile yapacağı tek şey bunun bir örneğini oluşturmak ve Register olayını tetikleyecek registerAll yöntemini çağırmaktır. Bu olayı bağlamak isteyen herhangi bir modül, buna yanıt olarak rastgele kod yürütebilir (tüm fikir budur), ancak bir modülün adı zzFileConverterRegistrar sınıfını yanlış bir şekilde genişleterek yapabileceği herhangi bir şey yoktur. . Yanlış yazılmış bir uzantının yanlış yazılmış başka bir uzantıyı kırması kesinlikle mümkün olacaktır, ancak bunun çözümü, uzantısının kırılmasını istemeyen herkesin düzgün bir şekilde yazmasını istemektir.

Kısmi sınıflar kullanılmadan, ana dosya dönüştürücü sınıfında bir yere biraz kod girebilirdi, bu şöyle görünüyordu:

  RegisterConverter ("GIF", GifConvertor.NewFactory)
  RegisterConverter ("BMP", BmpConvertor.NewFactory)
  RegisterConverter ("JPEG", JpegConvertor.NewFactory)

ancak başka bir dönüştürücü modülü eklemek için dönüştürücü kodunun o bölümüne girilmesi ve yeni dönüştürücünün listeye eklenmesi gerekir. Kısmi yöntemler kullanarak artık gerekli değildir - tüm dönüştürücüler otomatik olarak dahil edilir.


çalışır, ancak bu modülleri dinamik olarak yüklemek için basit bir eklenti sistemi çok daha iyi olurdu ve modüllerin birbirini bozma riskini ortadan kaldırmaya yardımcı olur (modülleri yeniden derleme yerine çalışma zamanında yükleyebilir)
STW

Bir Register olayını kancalamak ve kendilerini kaydettirmek için bir rutin çağırmak dışında zz_ sınıfı ile hiçbir şey yapmazlarsa, birbirlerini bozan modüllerin riski en aza indirilebilir. Bir eklentide var olmayacak olan riskleri görüyor musunuz? Son kullanıcının yeni modülleri "takması" bekleniyorsa eklentiler mükemmeldir. Bununla birlikte, bazen, tüm işlevleri tek bir exe'ye koymak istiyor. Yeni eklenen dosyalara el ile referans eklemek zorunda kalmadan kaynak dosyaları ekleyebilmek kullanışlı olabilir.
supercat

1
"" ... dışında hiçbir şey yapmazlarsa ... ", risk hattınızda oldukça iyi bir şekilde yer alıyorsa, güvenlik ve istikrar sözleşmeyi takiben tamamen geliştiriciye aittir ve% 0 güvence sağlar. Eğer kullanım durumunuz derlenecekse (tamamen geçerli, sadece vicdan ödünleşmesi gerekir) o zaman neden sadece modüller ayrı sınıflarda tanımlanmış ve bazı IModulearayüzler uygulamalıyız ?
STW

Kulağa "zekice" kötü giden bir durum gibi geliyor. Bunlar "modül" değildir, derleme zamanında birçok davranış ve sorumluluk bir araya getirilmiş tek sınıftır. Bunu yapmanın çok daha iyi yolları var - derlenen montajı uygulayan sınıflar için taramak için Reflection'ı kullanabilirsiniz IModule, MEF (sadece bir tanesinden) vb. Gibi bir eklenti çerçevesi kullanabilirsiniz
STW

3

Kısmi sınıflar kısa süre önce, birden çok geliştiricinin dosyanın aynı kısmına yeni yöntemlerin eklendiği (Resharper tarafından otomatikleştirilen) bir dosyaya kaynak kontrolüne yardımcı oldu.

Git'e yapılan bu itme birleşme çatışmalarına neden oldu. Tam bir kod bloğu olarak yeni yöntemleri almak için birleştirme aracına anlatmanın bir yolu bulunamadı.

Bu açıdan kısmi sınıflar, geliştiricilerin dosyalarının bir sürümüne sadık kalmasına izin verir ve bunları daha sonra elle birleştirebiliriz.

misal -

  • MainClass.cs - alanları, kurucuyu vb. Tutar
  • MainClass1.cs - geliştiricilerin uyguladıkları yeni kod
  • MainClass2.cs - yeni kodları için başka bir geliştirici sınıfıdır.

3

Gönderen MSDN :

Derleme zamanında kısmi tip tanımların nitelikleri birleştirilir. Örneğin, aşağıdaki beyanları göz önünde bulundurun:

[SerializableAttribute]
partial class Moon { }

[ObsoleteAttribute]
partial class Moon { }

Aşağıdaki beyanlara eşdeğerdir:

[SerializableAttribute]
[ObsoleteAttribute]
class Moon { }

Aşağıdakiler, tüm kısmi tip tanımlarından birleştirilmiştir:

  • XML yorumları

  • arayüzleri

  • genel tip parametre özellikleri

  • sınıf özellikleri

  • üyeler

2. başka bir şey, iç içe kısmi sınıflar da kısmi olabilir:

partial class ClassWithNestedClass
{
    partial class NestedClass { }
}

partial class ClassWithNestedClass
{
    partial class NestedClass { }
}

1

Kısmi sınıfların bazı avantajlarının bir listesi.

UI tasarım kodunu ve iş mantığı kodunu, okunması ve anlaşılması kolay olacak şekilde ayırabilirsiniz. Örneğin, Visual Studio kullanarak bir web uygulaması geliştiriyorsunuz ve yeni bir web formu ekliyorsanız, iki kaynak dosya var: "aspx.cs" ve "aspx.designer.cs". Bu iki dosya, kısmi anahtar kelimeyle aynı sınıfa sahiptir. ".Aspx.cs" sınıfı iş mantık kodunu, "aspx.designer.cs" ise kullanıcı arayüzü kontrol tanımını içerir.

Otomatik olarak oluşturulan kaynakla çalışırken kod, kaynak dosyayı yeniden oluşturmak zorunda kalmadan sınıfa eklenebilir. Örneğin, LINQ to SQL ile çalışıyorsunuz ve bir DBML dosyası oluşturuyorsunuz. Şimdi bir tabloyu sürükleyip bıraktığınızda designer.cs içinde kısmi bir sınıf oluşturur ve tüm tablo sütunları sınıfta özelliklere sahiptir. Kullanıcı arabirimi ızgarasına bağlanmak için bu tabloda daha fazla sütuna ihtiyacınız var, ancak veritabanı tablosuna yeni bir sütun eklemek istemiyorsunuz, böylece bu sınıf için bu sütun için yeni bir özelliğe sahip ayrı bir kaynak dosyası oluşturabilirsiniz ve kısmi bir sınıf olmak. Bu, veritabanı tablosu ve DBML varlığı arasındaki eşlemeyi etkiler, ancak kolayca ekstra bir alan elde edebilirsiniz. Bu, sistem tarafından oluşturulan kod ile uğraşmadan kodu kendi başınıza yazabileceğiniz anlamına gelir.

Birden fazla geliştirici aynı anda sınıfın kodunu yazabilir.

Büyük sınıfları sıkıştırarak uygulamanızı daha iyi koruyabilirsiniz. Arayüz uygulamalarına bağlı olarak birden fazla kaynak dosyası oluşturabilmeniz için birden fazla arabirime sahip bir sınıfınız olduğunu varsayalım. Kaynak dosyanın kısmi bir sınıfa sahip olduğu bir arabirimi anlamak ve sürdürmek kolaydır.


1

Ne zaman önemli bir boyutu / karmaşıklığı olan bir iç içe sınıf içeren bir sınıf var, ben sınıf olarak işaretlemek partialve ayrı bir dosyaya iç içe sınıf koymak. İç içe sınıfı içeren dosyayı şu kuralı kullanarak adlandırıyorum: [class name]. [Nested class name] .cs.

Aşağıdaki MSDN blogunda, sürdürülebilirlik için iç içe sınıflarla kısmi sınıfların kullanılması açıklanmaktadır: http://blogs.msdn.com/b/marcelolr/archive/2009/04/13/using-partial-classes-with-nested-classes-for- maintainability.aspx


1

Bu sorunun gerçekten eski olduğunu biliyorum ama sadece kısmi derslere katılımımı eklemek istiyorum.

Kişisel olarak kısmi sınıfları kullanmamın bir nedeni, bir program için, özellikle de devlet makineleri için bağlamalar oluşturmamdır.

Örneğin, OpenGL bir durum makinesidir, yığınlar vardır hepsi çok sayıda yöntem vardır OpenGL benzer bir şey bağlayıcı benim deneyim, ancak, global olarak değiştirilebilir yöntemlerin, sınıf kolayca 10k LOC'yi aşabilir.

Kısmi dersler bunu benim için yıkacak ve hızlı bir şekilde yöntem bulma konusunda bana yardımcı olacak.


0

Kısmi sınıflar öncelikle Kod üreticilerine yardımcı olmak için tanıtılır, bu nedenle biz (kullanıcılar), her yeniden oluşturduğumuzda ASP.NET'in .designer.cs sınıfı gibi oluşturulan sınıflardaki tüm çalışmalarımızı / değişikliklerini kaybetmiyoruz. kod LINQ, EntityFrameworks, ASP.NET, oluşturulan kod için kısmi sınıflar kullanır, bu nedenle Kısmi sınıflardan ve yöntemlerden faydalanarak bu oluşturulan kodların mantığını güvenli bir şekilde ekleyebilir veya değiştirebiliriz, ancak Kısmi sınıfları kullanarak oluşturulan koda bir şeyler eklemeden önce çok dikkatli olabiliriz derlemeyi bozursak daha kolay ama çalışma zamanı hataları ortaya çıkarırsak en kötüsü. Daha fazla ayrıntı için bu http://www.4guysfromrolla.com/articles/071509-1.aspx adresini ziyaret edin


0

Yanıtlarda açıkça bulamadığım iki kullanımı not ediyorum.

Sınıf Öğelerini Gruplama

Bazı geliştiriciler yorumları sınıflarının farklı "parçalarını" ayırmak için kullanırlar. Örneğin, bir ekip aşağıdaki sözleşmeyi kullanabilir:

public class MyClass{  
  //Member variables
  //Constructors
  //Properties
  //Methods
}

Kısmi sınıflarla, bir adım daha ileri gidebilir ve bölümleri ayrı dosyalara bölebiliriz. Kural olarak, bir ekip her dosyayı kendisine karşılık gelen bölümle ekleyebilir. Yani yukarıda, MyClassMembers.cs, MyClassConstructors.cs, MyClassProperties.cs, MyClassMethods.cs gibi bir şeye sahip oluruz.

Diğer yanıtların da belirttiği gibi, sınıfı bölmeye değip değmeyeceği muhtemelen sınıfın bu durumda ne kadar büyük olduğuna bağlıdır. Küçükse, her şeyin bir ana sınıfta olması muhtemelen daha kolaydır. Ancak bu bölümlerden herhangi biri çok büyürse, ana sınıfı düzgün tutmak için içeriği ayrı bir kısmi sınıfa taşınabilir. Bu durumda bir kural, bölüm başlığından sonra "Kısmi sınıfa bakın" gibi bir şey söyleyerek bir yorum bırakmak olabilir. Örneğin:

//Methods - See partial class

İfadeleri / Ad Alanını Kullanma Kapsamını Yönetme

Bu muhtemelen nadir bir durumdur, ancak kullanmak istediğiniz kitaplıklardan iki işlev arasında bir ad alanı çarpışması olabilir. Tek bir sınıfta, bunlardan biri için en fazla bir kullanma cümlesi kullanabilirsiniz. Diğeri için tam bir ada veya bir takma ada ihtiyacınız olacaktır. Kısmi sınıflarda, her ad alanı ve ifadeler listesi farklı olduğundan, iki işlev grubunu iki ayrı dosyaya ayırabiliriz.


using Library1 = The.Namespace.You.Needglobal::Root.Of.Namespace
Ad

Evet, sanırım bu zayıf bir kullanım durumu. Ancak isimleri tam olarak nitelemek zorunda kalmamak biraz daha hoş. Kısmi sınıfların kullanılmasının bir sebebinden daha çok istenmeyen bir yan etki.
Colm Bhandal
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.