Özellikleri Kullanma (C# Programlama Kılavuzu)
Özellikler her iki alanın ve yöntemin yönlerini birleştirir. Bir nesnenin kullanıcısına, bir özellik bir alan gibi görünür, özelliğe erişim de aynı sözdizimini gerektirir. Bir sınıfın uygulayıcısı için bir özellik bir veya iki kod blobunun yanı sıra bir Get erişimcisini ve/veya set erişimcisini temsil eder. Erişimci için kod bloğu, get Özellik okuma sırasında yürütülür. erişimci için kod bloğu, set özelliğe yeni bir değer atandığında yürütülür. Erişimcisi olmayan bir özellik set salt okunurdur. Erişimcisi olmayan bir özellik get salt yazılır olarak değerlendirilir. Her iki erişimciyi sahip bir özellik okuma-yazma ' dır. C# 9 ve üzeri sürümlerde, init set özelliği salt okunabilir hale getirmek için erişimci yerine bir erişimci kullanabilirsiniz.
Alanların aksine, özellikler değişken olarak sınıflandırılmaz. Bu nedenle, bir özelliği ref veya Out parametresi olarak geçiremezsiniz.
Özelliklerin birçok kullanımı vardır: bir değişikliğe izin vermeden önce verileri doğrulayabilir; verilerin aslında bir veritabanı gibi başka bir kaynaktan alındığı bir sınıf üzerinde saydam bir şekilde veri sunabilir; bir olayı oluşturma veya diğer alanların değerini değiştirme gibi veriler değiştirildiğinde bir eylem gerçekleştirebilir.
Özellikler, alanın erişim düzeyini, sonra özelliğin türünü ve sonra özelliğin adını ve ardından bir get -erişimci ve/veya erişimci bildiren bir kod bloğunu belirterek sınıf bloğunda bildirilir set . Örnek:
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 set erişimcinin Month değerin 1 ile 12 arasında ayarlandığından emin olması için bir özellik olarak bildirilmiştir. MonthÖzelliği, gerçek değeri izlemek için bir özel alan kullanır. Ö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. Bu alan, yalnızca özelliği çağırarak değiştirilebilmesi için özel olarak işaretlenir. Ortak ve özel erişim kısıtlamaları hakkında daha fazla bilgi için bkz. erişim değiştiricileri.
Otomatik uygulanan özellikler basit özellik bildirimleri için Basitleştirilmiş söz dizimi sağlar. Daha fazla bilgi için bkz. Otomatik uygulanan özellikler.
Get erişimcisi
getErişimcinin gövdesi bir yönteme benzer. Özellik türünün bir değerini döndürmesi gerekir. getErişimcinin yürütülmesi alanın değerini okumayla eşdeğerdir. Örneğin, erişimcisinden özel değişkeni döndürmekte get ve iyileştirmeler etkinleştirildiğinde, get erişimci metoduna yapılan çağrı derleyici tarafından satır içine alınır ve bu nedenle Yöntem çağrısı yoktur. Ancak, get derleyici derleme zamanında hangi yöntemin çalışma zamanında çağrıldığı hakkında bilgi içermediği için bir sanal erişimci yöntemi satır içine alınamaz. Aşağıda get özel bir alanın değerini döndüren bir erişimci verilmiştir _name :
class Person
{
private string _name; // the name field
public string Name => _name; // the Name property
}
Özelliğe başvurduğunuzda, bir atamanın hedefi dışında, get özelliğin değerini okumak için erişimci çağrılır. Örnek:
Person person = new Person();
//...
System.Console.Write(person.Name); // the get accessor is invoked here
getErişimci bir Return veya throw ifadesinde bitmelidir ve denetim erişimci gövdesini kapatamıyor olmalıdır.
Erişimciyi kullanarak nesnenin durumunu değiştirmek için hatalı bir programlama stilidir get . Örneğin, aşağıdaki erişimci alana her erişildiğinde nesnenin durumunu değiştirmenin yan etkisini üretir _number .
private int _number;
public int Number => _number++; // Don't do this
getErişimci, alan değerini döndürmek veya hesaplamak ve döndürmek için kullanılabilir. Örnek:
class Employee
{
private string _name;
public string Name => _name != null ? _name : "NA";
}
Önceki kod segmentinde, özelliğe bir değer atamadıysanız, Name değer döndürür NA .
Set erişimcisi
setErişimci, dönüş türü voidolan bir yönteme benzer. Türü özelliğin türü olan adlı örtük bir parametre kullanır value . Aşağıdaki örnekte, set özelliğine bir erişimci eklenmiştir Name :
class Person
{
private string _name; // the name field
public string Name // the Name property
{
get => _name;
set => _name = value;
}
}
Özelliğe bir değer atadığınızda, set erişimci yeni değer sağlayan bir bağımsız değişken kullanılarak çağrılır. Örnek:
Person person = new Person();
person.Name = "Joe"; // the set accessor is invoked here
System.Console.Write(person.Name); // the get accessor is invoked here
valueBir erişimcinin yerel değişken bildirimi için örtük parametre adını kullanmak hatadır set .
İnit erişimcisi
Erişimci oluşturma kodu, init set yerine anahtar sözcüğünü kullanmanız dışında bir erişimci oluşturmak için kullanılan kodla aynıdır init set . Fark, init erişimcinin yalnızca oluşturucuda veya bir nesne Başlatıcısıkullanılarak kullanılabileceği bir farklılık olabilir.
Açıklamalar
Özellikler,,,, public veya olarak işaretlenebilir private protected internal protected internal private protected . Bu erişim değiştiricileri, sınıfın kullanıcılarının özelliğe nasıl erişekullanabileceğinizi tanımlar. get set Aynı özelliğe yönelik ve erişimcileri farklı erişim değiştiricilerine sahip olabilir. Örneğin, get public türü dışından salt okuma erişimine izin vermek olabilir ve ya da olabilir set private protected . Daha fazla bilgi için bkz. erişim değiştiricileri.
Özelliği anahtar sözcüğü kullanılarak statik bir özellik olarak bildirilemez static . Bu özellik, sınıfın bir örneği mevcut olmasa bile, özelliği herhangi bir zamanda çağıranlar için kullanılabilir hale getirir. 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 bir özellik olarak işaretlenebilir. Bu, türetilmiş sınıfların geçersiz kılma anahtar sözcüğünü kullanarak özellik davranışını geçersiz kılmasını sağlar. Bu seçenekler hakkında daha fazla bilgi için bkz. Devralma.
Sanal bir özelliği geçersiz kılan bir özellik de mühürlenebilir, bu da türetilmiş sınıflar için artık sanal değildir. Son olarak, bir özellik soyutolarak bildirilemez. Bu, sınıfta bir uygulama olmadığı ve türetilen sınıfların kendi uygulamasını yazması gerektiği anlamına gelir. Bu seçenekler hakkında daha fazla bilgi için bkz. soyut ve korumalı sınıflar ve sınıf üyeleri.
Not
Statik bir özelliğin erişimcisi üzerinde sanal, Özetveya geçersiz kılma değiştiricisi kullanmak hatadır.
Örnekler
Bu örnek örnek, statik ve salt okunurdur özelliklerini gösterir. Klavye üzerinden çalışanın adını kabul eder, NumberOfEmployees 1 artırır ve çalışan 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:
}
class TestEmployee
{
static void Main()
{
Employee.NumberOfEmployees = 107;
Employee e1 = new Employee();
e1.Name = "Claude Vige";
System.Console.WriteLine("Employee number: {0}", Employee.Counter);
System.Console.WriteLine("Employee name: {0}", e1.Name);
}
}
/* Output:
Employee number: 108
Employee name: Claude Vige
*/
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şebileceğiniz 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
{
static void Main()
{
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: {0}", m1.Name);
System.Console.WriteLine("Name in the base class is: {0}", ((Employee)m1).Name);
}
}
/* Output:
Name in the derived class is: John, Manager
Name in the base class is: Mary
*/
Aşağıda, önceki örnekteki önemli noktaları verilmiştir:
NameTüretilmiş sınıftaki özelliği,Nametemel sınıftaki özelliği gizler. Böyle bir durumda,newdeğiştirici türetilmiş sınıftaki özelliğin bildiriminde kullanılır:public new string NameAtama,
(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 bkz. Yeni değiştirici.
Geçersiz kılma özelliği örneği
Bu örnekte, iki sınıf, Cube ve Square soyut bir sınıfı uygular Shape ve soyut özelliğini geçersiz kılar Area . Özelliklerde geçersiz kılma değiştiricisinin kullanımını göz önünde kılarsınız . Program, yüzü bir giriş olarak kabul eder ve kare ve küpün alanını hesaplar. Ayrıca, alanı bir girdi olarak kabul eder ve kare ve küp için ilgili 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 = {0:F2}", s.Area);
System.Console.WriteLine("Area of the cube = {0:F2}", c.Area);
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 = {0:F2}", s.side);
System.Console.WriteLine("Side of the cube = {0:F2}", c.side);
}
}
/* 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
*/