Özellikler (C# Programlama Kılavuzu)
Ö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 özelliği için gizli bir yedekleme alanı oluşturur. Derleyici ayrıca ve set
erişimcilerinin gövdesini get
de uygular. Tüm öznitelikler otomatik olarak uygulanan özelliğe uygulanır. özniteliğini, özniteliğinde etiketi belirterek field:
derleyici tarafından oluşturulan yedekleme alanına uygulayabilirsiniz.
Ö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 null
boş 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.
}
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ızın Person
yalnızca bu sınıftaki diğer yöntemlerden özelliğinin FirstName
değerini değiştirmeyi etkinleştirmesi gerektiğini varsayalım. Set erişimcisine private
yerine erişilebilirlik public
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.
Kümeye herhangi bir kısıtlayıcı erişim değiştirici ekleyebilir veya erişimcileri alabilirsiniz. Tek bir erişimcideki erişim değiştirici özelliğin erişiminden daha kısıtlayıcı olmalıdır. Özelliği olduğundan yukarıdaki kod yasaldır FirstName
public
, ancak küme erişimcisi şeklindedir private
. Bir erişimci ile public
özellik private
bildiremediniz. Özellik bildirimleri , , internal
protected internal
veya hatta private
bildirilebilirprotected
.
Erişimciler için set
iki özel erişim değiştirici vardır:
- Erişimcinin
set
erişim değiştiricisi olabilirinit
. Buset
erişimci yalnızca bir nesne başlatıcıdan veya türün oluşturucularından çağrılabilir. Erişimcidenprivate
set
daha kısıtlayıcıdır. - Otomatik olarak uygulanan bir özellik, erişimci olmadan bir
get
set
erişimci bildirebilir. Bu durumda, derleyici erişimcininset
yalnızca türün oluşturucularından çağrılmasını sağlar. Aksesuardaki aksesuardanset
dahainit
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.
}
Yukarıdaki örnek, çağıranların parametresini içeren oluşturucuyu FirstName
kullanması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 erişimciyi bir init
erişimci yapabilirsinizset
:
public class Person
{
public Person() { }
public Person(string firstName) => FirstName = firstName;
public string? FirstName { get; init; }
// Omitted for brevity.
}
Bu değiştiriciler genellikle düzgün başlatmayı zorlamak için değiştirici ile birlikte required
kullanılır.
Gerekli özellikler
Yukarıdaki örnek, bir çağıranın özelliğini ayarlamadan varsayılan oluşturucuyu kullanarak oluşturmasına Person
FirstName
olanak tanır. özelliği türü null atanabilir bir dize olarak değiştirildi. C# 11'den başlayarak, ç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, sınıfında iki değişiklik Person
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, parametre firstName
alan oluşturucu özniteliğine System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute sahiptir. Bu öznitelik, derleyiciye bu oluşturucunun tüm required
üyeleri ayarlandığını bildirir. Bu oluşturucuyu kullanan çağıranların bir nesne başlatıcı ile özellik ayarlaması required
gerekmez.
Önemli
Boş değer atanamaz ile karıştırmayınrequired
. bir özelliği null
veya default
olarak ayarlamak required
için geçerlidir. Bu örneklerde olduğu gibi string
tür null atanamazsa, derleyici bir uyarı döndürür.
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 gövdeli üyeler olarak uygulayabilirsiniz. İfade gövdesi tanımları, belirteci ve ardından özelliğine atanacak veya özelliğinden alınacak ifadeyi oluşturur =>
.
Salt okunur özellikler, erişimciyi get
ifade gövdeli üye olarak uygulayabilir. Aşağıdaki örnek salt okunur Name
özelliğini ifade gövdeli üye olarak uygular:
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 Name
bir yedekleme alanı yok. özelliği her seferinde bunu hesaplar.
Yedekleme 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;
}
}
}
ve LastName
özellikleri salt okunur olduğundan FirstName
bu uygulama çalışır. kişiler adlarını değiştirebilir. FirstName
erişimcilere izin vermek set
için ve LastName
özelliklerini güncelleştirmek için fullName
önbelleğe alınmış tüm değerleri geçersiz kılmanız gerekir. alan yeniden hesaplanacak şekilde ve LastName
özelliğinin fullName
erişimcilerini FirstName
değiştirirsinizset
:
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'le başlayarak, sınıflarda özellikler oluşturabilirsiniz.partial
partial
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.
Properties
Ö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 bkz . Erişimci Erişilebilirliğini Kısıtlama.
- value anahtar sözcüğü, veya
init
erişimcisininset
atadığına ilişkin değeri tanımlamak için kullanılır. - Özellikler okuma-yazma (hem bir
get
hem de birset
erişimciye sahipler), salt okunur (erişimcileriget
var ama erişimcileri yokset
) veya salt yazma (erişimcileriset
var ama erişimci yokget
) 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.