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, burada gösterildiği gibi kısmi anahtar sözcük değiştiricisini kullanın:

public partial class Employee
{
    public void DoWork()
    {
    }
}

public partial class Employee
{
    public void GoToLunch()
    {
    }
}

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ı
  • 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 kısmi tür bir tanımda varsa, aynı tür için başka bir kısmi tanımda belirtilen anahtar sözcüklerle çakışamaz:

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

Örnekler

Aşağıdaki örnekte, alanları ve sınıfı oluşturucu, bir kısmi sınıf Coordstanımında bildirilir ve üyesi, PrintCoordsbaşka bir kısmi sınıf tanımında bildirilir.

public partial class Coords
{
    private int x;
    private int y;

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

public partial class Coords
{
    public void PrintCoords()
    {
        Console.WriteLine("Coords: {0},{1}", x, y);
    }
}

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 Yöntemler

Kısmi bir sınıf veya yapı kısmi bir yöntem içerebilir. sınıfının bir bölümü yönteminin 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.

Tüm bu kısıtlamalara uymayan herhangi bir yöntem (örneğin, public virtual partial void yöntem) bir uygulama sağlamalıdır. Bu uygulama bir kaynak oluşturucu tarafından sağlanabilir.

Kısmi yöntemler, sınıfın bir bölümünün uygulayıcısının yöntem bildirmesini sağlar. Sınıfın başka bir bölümünün uygulayıcısı bu yöntemi 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 yöntemler için bir uygulama sağlar. İnsan geliştirici yöntem bildirimini ekleyebilir (genellikle kaynak oluşturucu tarafından okunan özniteliklerle). Geliştirici bu yöntemleri çağıran kod yazabilir. Kaynak oluşturucu derleme sırasında çalışır ve uygulamayı sağlar. Bu senaryoda, genellikle uygulanamayabilecek kısmi yöntemlerin kısıtlamalarına uyulmuyor.
// Definition in file1.cs
partial void OnNameChanged();

// Implementation in file2.cs
partial void OnNameChanged()
{
  // method body
}
  • Kısmi yöntem 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 yöntem imzaları eşleşmelidir.
  • Kısmi yöntemler statik ve güvenli olmayan değiştiricilere sahip olabilir.
  • Kısmi yöntemler 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.