Kısmi Sınıflar ve Yöntemler (C# Programlama Kılavuzu)

Bir sınıfın, yapının, arabirimin veya yöntemin tanımını iki veya daha fazla kaynak dosyaya bölmek mümkündür. Her kaynak dosya türün veya yöntem tanımının bir bölümünü içerir ve uygulama derlendiğinde tüm bölümler birleştirilir.

Kısmi Sınıflar

Sınıf tanımını bölmenin istendiğinde birkaç durum vardır:

  • Bir sınıfın ayrı dosyalar üzerinden bildirilmesi, birden çok programcının aynı anda üzerinde çalışmasını sağlar.
  • Otomatik olarak oluşturulan kaynağı içeren kaynak dosyayı yeniden oluşturmak zorunda kalmadan sınıfına kod ekleyebilirsiniz. Visual Studio, Windows Forms, Web hizmeti sarmalayıcı kodu vb. oluştururken bu yaklaşımı kullanır. Visual Studio tarafından oluşturulan dosyayı değiştirmek zorunda kalmadan bu sınıfları kullanan kod oluşturabilirsiniz.
  • Kaynak oluşturucular bir sınıfta ek işlevler oluşturabilir.

Sınıf tanımını bölmek için kısmi anahtar sözcük değiştiricisini kullanın. Uygulamada, her kısmi sınıf genellikle ayrı bir dosyada tanımlanır ve bu da sınıfın zaman içinde yönetilmesini ve genişletilmesi kolaylaşır.

Aşağıdaki Employee örnekte sınıfın iki dosyaya nasıl bölünebileceği gösterilmektedir: Employee_Part1.cs ve Employee_Part2.cs.

// This is in Employee_Part1.cs
public partial class Employee
{
    public void DoWork()
    {
    }
}

// This is in Employee_Part2.cs
public partial class Employee
{
    public void GoToLunch()
    {
    }
}

//Main program demonstrating the Employee class usage
public class Program
{
    public static void Main()
    {
        Employee emp = new Employee();
        emp.DoWork();
        emp.GoToLunch();
    }
}

// Expected Output:
// Employee is working.
// Employee is at lunch.

partial anahtar sözcüğü sınıfın, yapının veya arabirimin diğer bölümlerinin ad alanında tanımlanabileceğini gösterir. Tüm parçalar anahtar sözcüğünü partial kullanmalıdır. Son türü oluşturmak için derleme zamanında tüm bölümlerin kullanılabilir olması gerekir. Tüm bölümlerin , private, vb. gibi publicaynı erişilebilirliği olmalıdır.

Herhangi bir bölüm soyut olarak bildirilirse, türün tamamı soyut olarak kabul edilir. Herhangi bir parça mühürlenmiş olarak bildirilirse, tüm tip sızdırmaz olarak kabul edilir. Herhangi bir bölüm bir temel tür bildirirse, tüm tür bu sınıfı devralır.

Temel sınıfı belirten tüm bölümlerin kabul etmesi gerekir, ancak temel sınıfı atlayan bölümler yine de temel türü devralır. Parçalar farklı temel arabirimler belirtebilir ve son tür tüm kısmi bildirimler tarafından listelenen tüm arabirimleri uygular. Kısmi bir tanımda bildirilen tüm sınıf, yapı veya arabirim üyeleri diğer tüm bölümler tarafından kullanılabilir. Son tür, derleme zamanındaki tüm parçaların birleşimidir.

Not

partial Değiştirici, temsilci veya numaralandırma bildirimlerinde kullanılamaz.

Aşağıdaki örnek, iç içe yerleştirilmiş türlerin kısmi olmasa bile kısmi olabileceğini gösterir.

class Container
{
    partial class Nested
    {
        void Test() { }
    }

    partial class Nested
    {
        void Test2() { }
    }
}

Derleme zamanında, kısmi tür tanımların öznitelikleri birleştirilir. Örneğin, aşağıdaki bildirimleri göz önünde bulundurun:

[SerializableAttribute]
partial class Moon { }

[ObsoleteAttribute]
partial class Moon { }

Bunlar aşağıdaki bildirimlere eşdeğerdir:

[SerializableAttribute]
[ObsoleteAttribute]
class Moon { }

Aşağıdakiler tüm kısmi tür tanımlarından birleştirilir:

  • XML açıklamaları. Ancak, kısmi üyenin her iki bildirimi de açıklamalar içerirse, yalnızca uygulayan üyenin açıklamaları dahil edilir.
  • arabirimler
  • generic-type parametre öznitelikleri
  • class öznitelikleri
  • üyeler

Örneğin, aşağıdaki bildirimleri göz önünde bulundurun:

partial class Earth : Planet, IRotate { }
partial class Earth : IRevolve { }

Bunlar aşağıdaki bildirimlere eşdeğerdir:

class Earth : Planet, IRotate, IRevolve { }

Kısıtlamalar

Kısmi sınıf tanımlarıyla çalışırken izleyebileceğiniz birkaç kural vardır:

  • Aynı türdeki parçalar olması amaçlanan tüm kısmi tür tanımları ile partialdeğiştirilmelidir. Örneğin, aşağıdaki sınıf bildirimleri bir hata oluşturur:
    public partial class A { }
    //public class A { }  // Error, must also be marked partial
    
  • Değiştirici partial yalnızca , structveya interfaceanahtar sözcüğünden classhemen önce görünebilir.
  • Aşağıdaki örnekte gösterildiği gibi kısmi tür tanımlarında iç içe kısmi türlere izin verilir:
    partial class ClassWithNestedClass
    {
        partial class NestedClass { }
    }
    
    partial class ClassWithNestedClass
    {
        partial class NestedClass { }
    }
    
  • Aynı türdeki parçalar olması amaçlanacak tüm kısmi tür tanımları aynı derlemede ve aynı modülde (.exe veya .dll dosyası) tanımlanmalıdır. Kısmi tanımlar birden çok modüle yayılamaz.
  • Sınıf adı ve genel tür parametreleri tüm kısmi tür tanımlarında eşleşmelidir. Genel türler kısmi olabilir. Her kısmi bildirim aynı parametre adlarını aynı sırada kullanmalıdır.
  • Kısmi tür tanımında aşağıdaki anahtar sözcükler isteğe bağlıdır, ancak bir kısmi tür tanımında varsa, aynı türün diğer kısmi tanımında da aynı anahtar sözcük belirtilmelidir:

Daha fazla bilgi için bkz . Tür Parametrelerindeki Kısıtlamalar.

Örnekler

Aşağıdaki örnekte, sınıfın alanları ve oluşturucuları Coords bir kısmi sınıf tanımında ()Coords_Part1.cs bildirilir ve PrintCoords yöntem başka bir kısmi sınıf tanımında (Coords_Part2.cs) bildirilir. Bu ayrım, daha kolay bakım için kısmi sınıfların birden çok dosyaya nasıl bölünebileceğini gösterir.

 // This is in Coords_Part1.cs
 public partial class Coords
 {
     private int x;
     private int y;

     public Coords(int x, int y)
     {
         this.x = x;
         this.y = y;
     }
 }

 // This is in Coords_Part2.cs
 public partial class Coords
 {
     public void PrintCoords()
     {
         Console.WriteLine("Coords: {0},{1}", x, y);
     }
 }

// Main program demonstrating the Coords class usage
 class TestCoords
 {
     static void Main()
     {
         Coords myCoords = new Coords(10, 15);
         myCoords.PrintCoords();

         // Keep the console window open in debug mode.
         Console.WriteLine("Press any key to exit.");
         Console.ReadKey();
     }
 }
 // Output: Coords: 10,15

Aşağıdaki örnekte kısmi yapılar ve arabirimler de geliştirebileceğiniz gösterilmektedir.

partial interface ITest
{
    void Interface_Test();
}

partial interface ITest
{
    void Interface_Test2();
}

partial struct S1
{
    void Struct_Test() { }
}

partial struct S1
{
    void Struct_Test2() { }
}

Kısmi Üyeler

Kısmi bir sınıf veya yapı kısmi üye içerebilir. Sınıfının bir bölümü üyenin imzasını içerir. Bir uygulama aynı bölümde veya başka bir bölümde tanımlanabilir.

İmza aşağıdaki kurallara uyduğunda kısmi bir yöntem için bir uygulama gerekli değildir:

  • Bildirimde erişim değiştiricisi yoktur. Yöntemin varsayılan olarak erişimi vardır private .
  • Dönüş türü şeklindedir void.
  • Parametrelerin hiçbiri değiştiriciye out sahip değil.
  • Yöntem bildirimi aşağıdaki değiştiricilerden hiçbirini içeremez:

yöntemi ve yöntemine yapılan tüm çağrılar, uygulama olmadığında derleme zamanında kaldırılır.

Özellikler ve dizin oluşturucular da dahil olmak üzere tüm bu kısıtlamalara uymayan tüm yöntemler bir uygulama sağlamalıdır. Bu uygulama bir kaynak oluşturucu tarafından sağlanabilir. Kısmi özellikler otomatik olarak uygulanan özellikler kullanılarak uygulanamaz. Derleyici, otomatik olarak uygulanan bir özellik ile kısmi özelliğin bildirim bildirimi arasında ayrım yapamaz.

Kısmi yöntemler, sınıfın bir bölümünün uygulayıcısının üye bildirmesini sağlar. Sınıfın başka bir bölümünün uygulayıcısı bu üyeyi tanımlayabilir. Bu ayırmanın yararlı olduğu iki senaryo vardır: ortak kod oluşturan şablonlar ve kaynak oluşturucular.

  • Şablon kodu: Oluşturulan kodun yöntemi çağırabilmesi için şablon bir yöntem adı ve imza ayırır. Bu yöntemler, bir geliştiricinin yöntemi uygulayıp uygulamayeceğine karar vermesine olanak tanıyan kısıtlamaları izler. Yöntem uygulanmazsa, derleyici yöntem imzasını ve yöntemine yapılan tüm çağrıları kaldırır. Çağrılardaki bağımsız değişkenlerin değerlendirilmesinden elde edecek sonuçlar da dahil olmak üzere yöntemine yapılan çağrıların çalışma zamanında hiçbir etkisi olmaz. Bu nedenle, kısmi sınıftaki herhangi bir kod, uygulama sağlanmıyor olsa bile kısmi bir yöntemi serbestçe kullanabilir. Yöntem çağrılır ancak uygulanmazsa derleme zamanı veya çalışma zamanı hatası olmaz.
  • Kaynak oluşturucular: Kaynak oluşturucular üyeler için bir uygulama sağlar. İnsan geliştirici üye bildirimini ekleyebilir (genellikle kaynak oluşturucu tarafından okunan özniteliklerle). Geliştirici bu üyeleri çağıran kod yazabilir. Kaynak oluşturucu derleme sırasında çalışır ve uygulamayı sağlar. Bu senaryoda, çoğu zaman uygulanamayabilecek kısmi üyeler için kısıtlamalara uyulmuyor.
// Definition in file1.cs
partial void OnNameChanged();

// Implementation in file2.cs
partial void OnNameChanged()
{
  // method body
}
  • Kısmi üye bildirimleri, kısmi bağlamsal anahtar sözcükle başlamalıdır.
  • Kısmi türün her iki kısmındaki kısmi üye imzalarının eşleşmesi gerekir.
  • Kısmi üye statik ve güvenli olmayan değiştiricilere sahip olabilir.
  • Kısmi üye genel olabilir. Kısıtlamalar, yöntem bildirimini tanımlama ve uygulama konusunda aynı olmalıdır. Parametre ve tür parametre adlarının uygulama bildiriminde tanımlamadakiyle aynı olması gerekmez.
  • Tanımlanan ve uygulanan kısmi bir yönteme temsilci oluşturabilirsiniz, ancak uygulaması olmayan kısmi bir yönteme temsilci yapamazsınız.

C# Dil Belirtimi

Daha fazla bilgi için bkz. C# Dil Belirtimi'nde Kısmi türler ve Kısmi yöntemler. Dil belirtimi, C# sözdizimi ve kullanımı için kesin bir kaynaktır. Kısmi yöntemler için ek özellikler özellik belirtiminde tanımlanır.

Ayrıca bkz.