Yanıtlar:
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.
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
}
Implements
bir arabirime ait bir yöntemi belirtmek için anahtar kelimeyi kullandığından )
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şı :)
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: -
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.
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.
public partial class Product
{
//you are writing the business logic for fast moving product
}
public partial class Product
{
// Another developer writing some business logic...
}
Umarım mantıklıdır!
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 partial
değ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.
partial
Değ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 partial
anahtar 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
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
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.
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.
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".
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..
}
Çoğu kişi, bunun partial
yalnı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.
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.
IModule
arayüzler uygulamalıyız ?
IModule
, MEF (sadece bir tanesinden) vb. Gibi bir eklenti çerçevesi kullanabilirsiniz
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 -
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 { }
}
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.
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 partial
ve 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
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.
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
Yanıtlarda açıkça bulamadığım iki kullanımı not ediyorum.
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
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.Need
global::Root.Of.Namespace