Kısmi üye (C# Başvurusu)
Kısmi bir üyenin bildirimde bulunan ve genellikle uygulayan bir bildirimi vardır. Bildirim bildirimi bir gövde içermez. Uygulayan bildirim üyenin gövdesini sağlar. Kısmi üyeler, sınıf tasarımcılarının kaynak oluşturucular gibi araçlarla uygulanabilen üye kancaları sağlamasına olanak tanır. Kısmi türler ve üyeler, insan geliştiricilerin bir türün bir kısmını yazmasına olanak sağlarken, araçlar türün diğer bölümlerini yazar. Geliştirici isteğe bağlı bir uygulama bildirimi sağlamazsa, derleyici bildirim bildirimini derleme zamanında kaldırabilir. Kısmi üyeler için aşağıdaki koşullar geçerlidir:
- Bildirimler, kısmi bağlamsal anahtar sözcükle başlamalıdır.
- Kısmi türün her iki tarafındaki imzaların eşleşmesi gerekir.
partial
Oluşturucularda, sonlandırıcılarda, aşırı yüklenmiş işleçlerde veya olay bildirimlerinde anahtar sözcüğüne izin verilmez. C# 13'e başlamadan önce, partial
özelliklerde veya dizin oluşturucularda izin verilmezdi.
Aşağıdaki durumlarda uygulama bildiriminin olması için kısmi bir yöntem gerekli değildir:
- Herhangi bir erişilebilirlik değiştiricisi yoktur (varsayılan
private
dahil). - döndürür
void
. - Herhangi bir
out
parametresi yoktur. - Aşağıdaki değiştiricilerden
virtual
herhangi birine , ,override
sealed
,new
veyaextern
sahip değildir.
Tüm bu kısıtlamalara (örneğin, yöntem) uymayan herhangi bir üyenin public virtual partial void
bir uygulama sağlaması gerekir. Kısmi özelliklerin ve dizin oluşturucuların bir uygulaması olmalıdır.
Aşağıdaki örnekte, önceki kısıtlamalara uyan kısmi bir yöntem gösterilmektedir:
partial class MyPartialClass
{
// Declaring definition
partial void OnSomethingHappened(string s);
}
// This part can be in a separate file.
partial class MyPartialClass
{
// Comment out this method and the program
// will still compile.
partial void OnSomethingHappened(string s) =>
Console.WriteLine($"Something happened: {s}");
}
Kısmi üyeler, kaynak oluşturucularla birlikte de yararlı olabilir. Örneğin, bir regex aşağıdaki desen kullanılarak tanımlanabilir:
public partial class RegExSourceGenerator
{
[GeneratedRegex("cat|dog", RegexOptions.IgnoreCase, "en-US")]
private static partial Regex CatOrDogGeneratedRegex();
private static void EvaluateText(string text)
{
if (CatOrDogGeneratedRegex().IsMatch(text))
{
// Take action with matching text
}
}
}
Yukarıdaki örnekte, uygulayan bir bildirime sahip olması gereken kısmi bir yöntem gösterilmektedir. Derlemenin bir parçası olarak Normal ifade kaynak oluşturucu , uygulayan bildirimi oluşturur.
Aşağıdaki örnekte bir bildirim bildirimi ve bir sınıf için uygulama bildirimi gösterilmektedir. Yöntemin dönüş türü (bustring
) olmadığından void
ve erişimi olduğundanpublic
, yöntemin uygulayan bir bildirimi olmalıdır:
// Declaring declaration
public partial class PartialExamples
{
/// <summary>
/// Gets or sets the number of elements that the List can contain.
/// </summary>
public partial int Capacity { get; set; }
/// <summary>
/// Gets or sets the element at the specified index.
/// </summary>
/// <param name="index">The index</param>
/// <returns>The string stored at that index</returns>
public partial string this[int index] { get; set; }
public partial string? TryGetAt(int index);
}
public partial class PartialExamples
{
private List<string> _items = [
"one",
"two",
"three",
"four",
"five"
];
// Implementing declaration
/// <summary>
/// Gets or sets the number of elements that the List can contain.
/// </summary>
/// <remarks>
/// If the value is less than the current capacity, the list will shrink to the
/// new value. If the value is negative, the list isn't modified.
/// </remarks>
public partial int Capacity
{
get => _items.Count;
set
{
if ((value != _items.Count) && (value >= 0))
{
_items.Capacity = value;
}
}
}
public partial string this[int index]
{
get => _items[index];
set => _items[index] = value;
}
/// <summary>
/// Gets the element at the specified index.
/// </summary>
/// <param name="index">The index</param>
/// <returns>The string stored at that index, or null if out of bounds</returns>
public partial string? TryGetAt(int index)
{
if (index < _items.Count)
{
return _items[index];
}
return null;
}
}
Yukarıdaki örnekte, iki bildirimin nasıl birleştirildiğine ilişkin kurallar gösterilmektedir:
- İmza eşleşmeleri: Genel olarak, bildirimde bulunan ve uygulayan bildirimlerin imzalarının eşleşmesi gerekir. Bu, yöntemler, özellikler, dizin oluşturucular ve bireysel erişimcilerde erişilebilirlik değiştiricisini içerir. Tüm parametrelerde parametre türünü ve başvuru türü değiştiricilerini içerir. Dönüş türü ve herhangi bir başvuru türü değiştirici eşleşmelidir. Tanımlama grubu üye adları eşleşmelidir. Ancak bazı kurallar esnek olur:
- Bildirimleri bildirme ve uygulama farklı null atanabilir ek açıklama ayarlarına sahip olabilir. Başka bir deyişle, biri boş değer atanabilir , diğeri boş değer atanabilir olabilir.
- Geçersiz null atanabilirlik içermeyen null atanabilirlik farklılıkları bir uyarı oluşturur.
- Varsayılan parametre değerlerinin eşleşmesi gerekmez. Derleyici, bir yöntemin veya dizin oluşturucunun uygulama bildirimi varsayılan parametre değerini bildirirse bir uyarı verir.
- Parametre adları eşleşmediğinde derleyici bir uyarı oluşturur. Yayılan IL, bildirimde bulunan bildirimin parametre adlarını içerir.
- Belge açıklamaları: Belge açıklamaları her iki bildirimden de eklenebilir. Hem bildirimde bulunan hem de uygulayan bildirimlerde belge açıklamaları varsa, uygulayan bildirimin açıklamaları eklenir. Yukarıdaki örnekte belge açıklamaları şunlardır:
Capacity
özelliği için açıklamalar uygulama bildiriminden alınır. Uygulayan bildirim açıklamaları, her iki bildirimin///
de açıklamaları olduğunda kullanılır.- Dizin oluşturucu için açıklamalar bildirim bildiriminden alınır. Uygulama bildirimi herhangi bir
///
açıklama içermez. - için
TryGetAt
, açıklamalar uygulama bildiriminden alınır. Bildirim bildirimi herhangi bir///
açıklama içermez. - Oluşturulan XML'de tüm
public
üyeler için belge açıklamaları bulunur.
- Çoğu Öznitelik bildirimi birleştirilir. Ancak, tüm çağıran bilgi öznitelikleri ile
AllowMultiple=false
tanımlanır. Derleyici, bildirim bildirimindeki herhangi bir çağıran bilgi özniteliğini tanır. Uygulama bildirimindeki tüm çağıran bilgi öznitelikleri yoksayılır. Uygulayan bildirime çağıran bilgi öznitelikleri eklerseniz derleyici bir uyarı yayınlar.