Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Özellik, veri alanının değerini okumak, yazmak veya hesaplamak için esnek bir mekanizma sağlayan bir üyedir. Özellikler genel veri üyeleri olarak görünür, ancak erişimci olarak adlandırılan özel yöntemler olarak uygulanır. Bu özellik, arayanların verilere kolayca erişmesini sağlar ve yine de veri güvenliğini ve esnekliğini yükseltmeye yardımcı olur. Özelliklerin söz dizimi, alanlara yönelik doğal bir uzantıdır. Bir alan bir depolama konumu tanımlar:
public class Person
{
public string? FirstName;
// Omitted for brevity.
}
Otomatik olarak uygulanan özellikler
Özellik tanımı, bir get ve set erişimcisi için bu özelliğin değerini alan ve atayan bildirimler içerir:
public class Person
{
public string? FirstName { get; set; }
// Omitted for brevity.
}
Yukarıdaki örnekte otomatik olarak uygulanan bir özellik gösterilmektedir. Derleyici, özellik için gizli bir destekleyici alan oluşturur. Derleyici ayrıca get ve set erişimcilerinin gövdesini de uygular. Tüm öznitelikler otomatik olarak uygulanan özelliğe uygulanır. Derleyici tarafından oluşturulan yedekleme alanına öznitelik uygulamak için, öznitelikte field: etiketini belirtebilirsiniz.
Özelliğin kapanış ayracından sonra bir değer ayarlayarak varsayılan değer dışında bir değere özellik başlatabilirsiniz. özelliği için ilk değerin FirstName yerine nullboş dize olmasını tercih edebilirsiniz. Bunu aşağıdaki kodda gösterildiği gibi belirtebilirsiniz:
public class Person
{
public string FirstName { get; set; } = string.Empty;
// Omitted for brevity.
}
Veri alanı destekli özellikler
C# 14'te, anahtar sözcüğünü kullanarak field bir özelliğin erişimcisine doğrulama veya başka bir mantık ekleyebilirsiniz.
field anahtar kelimesi, derleyici tarafından sentezlenen bir özelliğin temel alanına erişir. Ayrı bir yedekleme alanını açıkça bildirmeden bir özellik erişimcisi yazmanızı sağlar.
public class Person
{
public string? FirstName
{
get;
set => field = value.Trim();
}
// Omitted for brevity.
}
Gerekli özellikler
Yukarıdaki örnek, bir çağıranın Person'yi varsayılan oluşturucuyu kullanarak oluşturmasına olanak tanır, ancak FirstName özelliğini ayarlamaz. özelliğin türü, null atanabilir bir dize olarak değiştirildi. Çağıranların bir özellik ayarlamasını gerektirebilirsiniz :
public class Person
{
public Person() { }
[SetsRequiredMembers]
public Person(string firstName) => FirstName = firstName;
public required string FirstName { get; init; }
// Omitted for brevity.
}
Yukarıdaki kod, Person sınıfında iki değişiklik yapar. İlk olarak, FirstName özellik bildirimi değiştiriciyi required içerir. Bu, yeni Person bir kod oluşturan tüm kodların bu özelliği bir nesne başlatıcı kullanarak ayarlaması gerektiği anlamına gelir. İkincisi, bir firstName parametresi alan oluşturucunun System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute özniteliği vardır. Bu öznitelik, derleyiciye bu oluşturucunun tüm üyeleri ayarladığını bildirir. Bu oluşturucuyu kullanan çağıranların, required bir nesne başlatıcı ile özellikleri ayarlaması gerekmez.
Önemli
Yanlışlıkla required ile boş değer atanamaz olarak karıştırmayın. Bir özelliği required veya null olarak ayarlamak geçerlidir. Eğer tür, bu örneklerdeki string gibi, null atanamazsa derleyici bir uyarı verir.
var aPerson = new Person("John");
aPerson = new Person { FirstName = "John"};
// Error CS9035: Required member `Person.FirstName` must be set:
//aPerson2 = new Person();
İfade gövdesi tanımları
Özellik erişimcileri genellikle tek satırlı deyimlerden oluşur. Erişimciler bir ifadenin sonucunu atar veya döndürür. Bu özellikleri ifade biçimli üyeler olarak uygulayabilirsiniz. İfade gövdesi tanımları, => belirteci ve ardından, bir özelliğe atanacak veya bir özellikten alınacak ifadeden oluşur.
Salt okunur özellikler, erişimciyi get ifade tabanlı üye olarak uygulayabilir. Aşağıdaki örnek, salt okunur Name özelliğini ifade gövdesi olarak tanımlar:
public class Person
{
public Person() { }
[SetsRequiredMembers]
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
public required string FirstName { get; init; }
public required string LastName { get; init; }
public string Name => $"{FirstName} {LastName}";
// Omitted for brevity.
}
Name özelliği hesaplanan bir özelliktir. için Namebir yedekleme alanı yok. özelliği her seferinde bunu hesaplar.
Erişim denetimi
Yukarıdaki örneklerde okuma/yazma özellikleri gösterildi. Ayrıca salt okunur özellikler oluşturabilir veya kümeye farklı erişilebilirlikler verip erişimcileri alabilirsiniz. Sınıfınızda, FirstName özelliğinin değerinin yalnızca diğer yöntemlerle değiştirilebilmesini sağlamanız gerektiğini varsayalım. Bunun yerine private veya internal set erişimcisine public erişilebilirlik verebilirsiniz:
public class Person
{
public string? FirstName { get; private set; }
// Omitted for brevity.
}
FirstName özelliği herhangi bir koddan okunabilir, ancak yalnızca sınıfındaki Person koddan atanabilir.
Set veya get erişimcilerinden herhangi birine bir kısıtlayıcı erişim değiştirici ekleyebilirsiniz. Tek bir erişimcideki erişim belirteci, özelliğin erişiminden daha kısıtlayıcı olmalıdır. Önceki kod, FirstName özelliği public olduğu için yasaldır, fakat kümeleyici erişici private şeklindedir.
private özelliği bir public erişimci ile bildiremezdiniz. Özellik bildirimleri protected, internal, protected internal veya hatta private şeklinde bildirilebilir.
set erişimciler için iki özel erişim belirteci vardır:
- Erişimcinin
set,initbir erişim değiştiricisi olabilir. Buseterişimci yalnızca bir nesne başlatıcıdan veya türün oluşturucularından çağrılabilir.seterişicisindeprivate'dan daha kısıtlayıcı. - Otomatik olarak uygulanan bir özellik,
seterişimci olmadan birgeterişimci bildirebilir. Bu durumda, derleyiciseterişicinin yalnızca türün oluşturucularından çağrılmasına izin verir.initüzerindeki erişim sağlyıcısısetüzerindeki erişim sağlayıcıdan daha kısıtlayıcıdır.
sınıfını Person aşağıdaki gibi değiştirin:
public class Person
{
public Person(string firstName) => FirstName = firstName;
public string FirstName { get; }
// Omitted for brevity.
}
Önceki örnek, çağıranların FirstName parametresini içeren oluşturucuyu kullanmalarını gerektirir. Çağıranlar, özelliğine bir değer atamak için nesne başlatıcılarını kullanamaz. Başlatıcıları desteklemek için, aşağıdaki kodda gösterildiği gibi set erişimcisini init erişimcisine dönüştürebilirsiniz.
public class Person
{
public Person() { }
public Person(string firstName) => FirstName = firstName;
public string? FirstName { get; init; }
// Omitted for brevity.
}
Bu değiştiriciler, uygun başlatmayı zorlamak için genellikle required değiştiriciyle birlikte kullanılır.
Arkaplan alanları olan özellikler
Hesaplanan özellik kavramını özel bir alanla karıştırabilir ve önbelleğe alınmış bir değerlendirilen özellik oluşturabilirsiniz. Örneğin, dize biçimlendirmesinin FullName ilk erişimde gerçekleşmesi için özelliğini güncelleştirin:
public class Person
{
public Person() { }
[SetsRequiredMembers]
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
public required string FirstName { get; init; }
public required string LastName { get; init; }
private string? _fullName;
public string FullName
{
get
{
if (_fullName is null)
_fullName = $"{FirstName} {LastName}";
return _fullName;
}
}
}
Bu uygulama çalışır çünkü FirstName ve LastName özellikleri salt okunurdur. kişiler adlarını değiştirebilir.
FirstName ve LastName özelliklerini set erişimcilere izin verecek şekilde güncelleştirirken, fullName için önbelleğe alınmış tüm değerleri geçersiz kılmanız gerekir.
set ve FirstName özelliğinin LastName erişimcilerini, fullName alanının yeniden hesaplanacağı şekilde değiştirirsiniz.
public class Person
{
private string? _firstName;
public string? FirstName
{
get => _firstName;
set
{
_firstName = value;
_fullName = null;
}
}
private string? _lastName;
public string? LastName
{
get => _lastName;
set
{
_lastName = value;
_fullName = null;
}
}
private string? _fullName;
public string FullName
{
get
{
if (_fullName is null)
_fullName = $"{FirstName} {LastName}";
return _fullName;
}
}
}
Bu son sürüm yalnızca gerektiğinde özelliğini değerlendirir FullName . Daha önce hesaplanan sürüm geçerliyse kullanılır. Aksi takdirde, hesaplama önbelleğe alınan değeri güncelleştirir. Bu sınıfı kullanan geliştiricilerin uygulamanın ayrıntılarını bilmesi gerekmez. Bu iç değişikliklerin hiçbiri Person nesnesinin kullanımını etkilemez.
C# 13 ile başlayarak, partial sınıflarında partial özellikleri oluşturabilirsiniz. Bir partial özellik için uygulama bildirimi otomatik olarak uygulanan bir özellik olamaz. Otomatik olarak uygulanan bir özellik, kısmi özellik bildirimiyle aynı söz dizimini kullanır.
Özellikler
Özellikler, bir sınıf veya nesnedeki akıllı alanların bir biçimidir. Nesnenin dışından, nesnedeki alanlar gibi görünürler. Ancak, özellikler C# işlevselliğinin tam paleti kullanılarak uygulanabilir. Doğrulama, farklı erişilebilirlik, gecikmeli değerlendirme veya senaryolarınızın ihtiyaç duyduğu gereksinimleri sağlayabilirsiniz.
- Özel erişimci kodu gerektirmeyen basit özellikler, ifade gövdesi tanımları olarak veya otomatik olarak uygulanan özellikler olarak uygulanabilir.
- Özellikler, bir sınıfın uygulama veya doğrulama kodunu gizlerken değerleri alma ve ayarlamanın genel bir yolunu ortaya çıkarmasını sağlar.
- Özellik değerini döndürmek için get özellik erişimcisi kullanılır ve yeni bir değer atamak için bir set özellik erişimcisi kullanılır. Yalnızca nesne oluşturma sırasında yeni bir değer atamak için bir init özellik erişimcisi kullanılır. Bu erişimcilerin farklı erişim düzeyleri olabilir. Daha fazla bilgi için Erişimci Erişilebilirliğini Kısıtlama bölümüne bakın.
-
value anahtar sözcüğü,
setveyainiterişimcisinin atadığı değeri tanımlamak için kullanılır. - Özellikler okuma-yazma (hem bir
gethem deseterişiciye sahiptirler), yalnızca okuma (birgeterişiciye sahiptirler amaseterişici yoktur) veya yalnızca yazma (birseterişiciye sahiptirler amageterişici yoktur) olabilir. Yalnızca yazma özellikleri nadirdir.
C# Dil Belirtimi
Daha fazla bilgi için bkz. C# Dil Belirtimi'ndeki Özellikler. Dil belirtimi, C# sözdizimi ve kullanımı için kesin bir kaynaktır.