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.
Özellikler hem alanların hem de yöntemlerin yönlerini birleştirir. Bir nesnenin kullanıcısına bir özellik bir alan gibi görünür; özelliğine erişmek için aynı söz dizimi gerekir. Bir sınıfın uygulayıcısı için bir özellik, bir get
erişimciyi ve/veya bir set
veya bir init
erişimciyi temsil eden bir veya iki kod bloğudur. Erişimcinin get
kod bloğu, özellik okunduğunda yürütülür; özelliğe bir değer atandığında veya set
erişimcisi için init
kod bloğu yürütülür.
set
erişimcisi olmayan bir özellik, salt okunur olarak kabul edilir. Erişimcisi olmayan bir get
özellik sadece yazılabilir olarak kabul edilir. Her iki erişimciye (okuma ve yazma) sahip bir özellik okunabilir-yazılabilir bir özelliktir.
init
erişimcisi kullanarak, nesne başlatma sırasında özelliğin ayarlanmasına izin verebilir ve aksi takdirde salt okunur kalmasını sağlayabilirsiniz, bu da set
erişimcisinin yerine geçer.
Alanlardan farklı olarak, özellikler değişken olarak sınıflandırılmamıştır. Bu nedenle, bir özelliği ref
veya out
parametresi olarak geçiremezsiniz.
Özelliklerin birçok kullanımları vardır:
- Bir değişikliğe izin vermeden önce verileri doğrulayabilirler.
- Verilerin veritabanı gibi başka bir kaynaktan alındığı bir sınıftaki verileri saydam bir şekilde kullanıma sunar.
- Veriler değiştirildiğinde, olay oluşturma veya diğer alanların değerini değiştirme gibi bir eylem gerçekleştirebilirler.
Özellikler, alanın erişim düzeyi, ardından özelliğin türü, ardından özelliğin adı ve ardından bir get
erişimci ve/veya set
erişimci bildiren bir kod bloğu belirtilerek sınıf bloğunda bildirilir. Örneğin:
public class Date
{
private int _month = 7; // Backing store
public int Month
{
get => _month;
set
{
if ((value > 0) && (value < 13))
{
_month = value;
}
}
}
}
Bu örnekte, Month
bir özellik olarak bildirilir, böylece set
erişimcisi Month
değerinin 1 ile 12 arasında ayarlandığından emin olabilir. özelliği, Month
gerçek değeri izlemek için özel bir alan kullanır. Bir özelliğin verilerinin gerçek konumu genellikle özelliğin "yedekleme deposu" olarak adlandırılır. Özelliklerin özel alanları bir yedekleme deposu olarak kullanması yaygındır. Alan, yalnızca özellik yöntemi çağrılarak değiştirilebilmesi için "private" olarak işaretlenmiştir. Genel ve özel erişim kısıtlamaları hakkında daha fazla bilgi için bkz . Erişim Değiştiricileri. Otomatik olarak uygulanan özellikler, basit özellik bildirimleri için basitleştirilmiş söz dizimi sağlar. Daha fazla bilgi için bkz . Otomatik olarak uygulanan özellikler.
C# 13'te başlayarak, aşağıdaki örnekte gösterildiği gibi otomatik olarak uygulanan bir özelliğin erişimcisine doğrulama eklemek için alan destekli özellikleriset
:
public class DateExample
{
public int Month
{
get;
set
{
if ((value > 0) && (value < 13))
{
field = value;
}
}
}
}
Önemli
Anahtar field
sözcük, C# 13'teki bir önizleme özelliğidir. .NET 9 kullanıyor olmalı ve <LangVersion>
öğenizi preview
olarak ayarlamalısınız ki field
bağlamsal anahtar sözcüğünü kullanabilesiniz.
Bir field
anahtar sözcük özelliğini, field
adlı bir alanı olan bir sınıfta kullanırken dikkatli olmalısınız. Yeni field
anahtar sözcük, bir özellik erişimcisi kapsamında field
adlı bir alanı gölgeler.
field
değişkeninin adını değiştirebilir veya @
tanımlayıcısına field
olarak başvurmak için @field
belirtecini kullanabilirsiniz. Anahtar sözcüğüfield
okuyarak daha fazla bilgi edinebilirsiniz.
Alıcı erişimcisi
Erişimcinin get
gövdesi bir yöntemin gövdesine benzer. Özellik türünde bir değer döndürmelidir. C# derleyicisi ve Just-in-time (JIT) derleyicisi, get
erişimcisini uygulamak için yaygın desenleri algılar ve bu desenleri optimize eder. Örneğin, herhangi bir hesaplama gerçekleştirmeden alan döndüren bir get
erişimci büyük olasılıkla bu alanın bellek okuması için iyileştirilmiştir. Otomatik olarak uygulanan özellikler bu deseni izler ve bu iyileştirmelerden yararlanır. Ancak, derleyici derleme zamanında hangi metodun çalışma zamanında çağrılabileceğini bilmediğinden sanal get
erişimci metot inline edilemez. Aşağıdaki örnekte, özel bir get
alanın _name
değerini döndüren bir erişimci gösterilmektedir:
class Employee
{
private string _name; // the name field
public string Name => _name; // the Name property
}
Bir atamanın hedefi dışında özelliğine başvurduğunuzda, özelliğin get
değerini okumak için erişimci çağrılır. Örneğin:
var employee = new Employee();
//...
System.Console.Write(employee.Name); // the get accessor is invoked here
Erişimci get
ifade gövdeli bir üye olmalı veya return ya da throw deyimiyle bitmelidir ve kontrol akışı erişimci gövdesi dışında devam edemez.
Uyarı
Erişimciyi kullanarak nesnenin durumunu değiştirmek genellikle kötü bir programlama stilidir get
. Bu kuralın bir istisnası, bir özelliğin değerinin yalnızca ilk erişildiğinde hesaplandığı tembel değerlendirme özelliğidir.
get
erişimcisi, alan değerini döndürmek veya hesaplayıp döndürmek için kullanılabilir. Örneğin:
class Manager
{
private string _name;
public string Name => _name != null ? _name : "NA";
}
Önceki örnekte, özelliğine Name
bir değer atamazsanız, değerini NA
döndürür.
Set erişimcisi
Erişimci, set
dönüş türü geçersiz olan bir yönteme benzer. Türü, özelliğin türü olan, value
adında örtük bir parametre kullanır. Derleyici ve JIT derleyicisi, bir set
veya init
erişimcisi için ortak desenleri de tanır. Bu yaygın desenler en iyi duruma getirilmiştir ve doğrudan yedekleme alanı için bellek yazılır. Aşağıdaki örnekte, set
özelliğine bir Name
erişimci eklenir:
class Student
{
private string _name; // the name field
public string Name // the Name property
{
get => _name;
set => _name = value;
}
}
Özelliğine bir değer atadığınızda, set
erişimci yeni değeri sağlayan bir bağımsız değişken kullanılarak çağrılır. Örneğin:
var student = new Student();
student.Name = "Joe"; // the set accessor is invoked here
System.Console.Write(student.Name); // the get accessor is invoked here
Bir value
erişimcisindeki yerel değişken bildirimi için set
örtük parametre adını kullanmak hatadır.
Başlatma erişimcisi
init
erişimcisi oluşturma kodu, set
yerine init
anahtar sözcüğünü kullanmanız dışında set
erişimcisi oluşturma koduyla aynıdır. Aradaki fark, init
erişimcisinin yalnızca yapıcıda veya bir nesne başlatıcı kullanarak kullanılabilmesidir.
Açıklamalar
Özellikler public
, private
, protected
, internal
, protected internal
veya private protected
olarak işaretlenebilir. Bu erişim değiştiricileri, sınıfın kullanıcılarının özelliğine nasıl erişebileceğini tanımlar. Aynı özelliğin get
, türün dışından salt okunur erişime izin vermek için public
olabilir ve set
, private
veya protected
olabilir. Daha fazla bilgi için bkz . Erişim Değiştiricileri.
Bir özellik, anahtar sözcüğü kullanılarak static
statik özellik olarak bildirilebilir. Statik özellikler, sınıfın hiçbir örneği mevcut olmasa bile çağıranlar tarafından herhangi bir zamanda kullanılabilir. Daha fazla bilgi için bkz . Statik Sınıflar ve Statik Sınıf Üyeleri.
Bir özellik, sanal anahtar sözcüğü kullanılarak sanal özellik olarak işaretlenebilir. Sanal özellikler, türetilmiş sınıfların override anahtar sözcüğünü kullanarak özellik davranışını geçersiz kılabilmesini sağlar. Bu seçenekler hakkında daha fazla bilgi için bkz . Devralma.
Sanal özelliği geçersiz kılma özelliği, türetilmiş sınıflar için artık sanal olmadığını belirterek mühürlenebilir. Son olarak, bir özellik soyut olarak bildirilebilir. Soyut özellikler sınıfında bir uygulama tanımlamaz ve türetilmiş sınıfların kendi uygulamalarını yazması gerekir. Bu seçenekler hakkında daha fazla bilgi için bkz . Soyut ve Korumalı Sınıflar ve Sınıf Üyeleri.
Not
Bir statik özelliğinin erişimcisine sanal, soyut veya geçersiz değiştiricisi kullanmak bir hatadır.
Örnekler
Bu örnekte örnek, statik ve salt okunur özellikler gösterilmektedir. Klavyeden çalışanın adını alır, NumberOfEmployees
değerini 1 artırır ve çalışanın adını ve numarasını görüntüler.
public class Employee
{
public static int NumberOfEmployees;
private static int _counter;
private string _name;
// A read-write instance property:
public string Name
{
get => _name;
set => _name = value;
}
// A read-only static property:
public static int Counter => _counter;
// A Constructor:
public Employee() => _counter = ++NumberOfEmployees; // Calculate the employee's number:
}
Gizli özellik örneği
Bu örnekte, türetilmiş bir sınıfta aynı ada sahip başka bir özellik tarafından gizlenen bir temel sınıftaki bir özelliğe nasıl erişilir gösterilmektedir:
public class Employee
{
private string _name;
public string Name
{
get => _name;
set => _name = value;
}
}
public class Manager : Employee
{
private string _name;
// Notice the use of the new modifier:
public new string Name
{
get => _name;
set => _name = value + ", Manager";
}
}
class TestHiding
{
public static void Test()
{
Manager m1 = new Manager();
// Derived class property.
m1.Name = "John";
// Base class property.
((Employee)m1).Name = "Mary";
System.Console.WriteLine($"Name in the derived class is: {m1.Name}");
System.Console.WriteLine($"Name in the base class is: {((Employee)m1).Name}");
}
}
/* Output:
Name in the derived class is: John, Manager
Name in the base class is: Mary
*/
Önceki örnekteki önemli noktalar şunlardır:
- Türetilmiş sınıftaki
Name
özelliği, temel sınıftakiName
özelliğini gizler. Böyle bir durumda,new
değiştirici türetilmiş sınıftaki özelliğinin bildiriminde kullanılır:public new string Name
- Döküm
(Employee)
, temel sınıftaki gizli özelliğe erişmek için kullanılır.((Employee)m1).Name = "Mary";
Üyeleri gizleme hakkında daha fazla bilgi için yeni Değiştirici'ye bakın.
Özellik geçersiz kılma örneği
Bu örnekte, Cube
ve Square
olmak üzere iki sınıf, Shape
adlı soyut bir sınıfı uygular ve onun Area
adlı soyut özelliğini geçersiz kılar. Özelliklerde geçersiz kılma değiştiricisinin kullanımına dikkat edin. Program, tarafı giriş olarak kabul eder ve kare ve küp alanlarını hesaplar. Ayrıca alanı giriş olarak kabul eder ve kare ve küp için karşılık gelen tarafı hesaplar.
abstract class Shape
{
public abstract double Area
{
get;
set;
}
}
class Square : Shape
{
public double side;
//constructor
public Square(double s) => side = s;
public override double Area
{
get => side * side;
set => side = System.Math.Sqrt(value);
}
}
class Cube : Shape
{
public double side;
//constructor
public Cube(double s) => side = s;
public override double Area
{
get => 6 * side * side;
set => side = System.Math.Sqrt(value / 6);
}
}
class TestShapes
{
static void Main()
{
// Input the side:
System.Console.Write("Enter the side: ");
double side = double.Parse(System.Console.ReadLine());
// Compute the areas:
Square s = new Square(side);
Cube c = new Cube(side);
// Display the results:
System.Console.WriteLine($"Area of the square = {s.Area:F2}");
System.Console.WriteLine($"Area of the cube = {c.Area:F2}");
System.Console.WriteLine();
// Input the area:
System.Console.Write("Enter the area: ");
double area = double.Parse(System.Console.ReadLine());
// Compute the sides:
s.Area = area;
c.Area = area;
// Display the results:
System.Console.WriteLine($"Side of the square = {s.side:F2}");
System.Console.WriteLine($"Side of the cube = {c.side:F2}");
}
}
/* Example Output:
Enter the side: 4
Area of the square = 16.00
Area of the cube = 96.00
Enter the area: 24
Side of the square = 4.90
Side of the cube = 2.00
*/