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# 14'te başlayarak, aşağıdaki örnekte gösterildiği gibi otomatik olarak uygulanan bir özelliğin erişimcisine doğrulama eklemek için set kullanabilirsiniz:
public class DateExample
{
public int Month
{
get;
set
{
if ((value > 0) && (value < 13))
{
field = value;
}
}
}
}
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 _namedeğ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 NAdö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
Statik özelliğin erişimcisinde sanal, soyut veya geçersiz kılma 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 örnek, 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şildiğini gösterir:
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,newdeğ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
*/