Özellikleri Kullanma (C# Programlama Kılavuzu)
Ö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 özellik, bir erişimciyi ve/veya erişimciyi get
temsil eden bir set
init
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 init
erişimcisi için set
kod bloğu yürütülür. Erişimci olmayan bir set
özellik salt okunur olarak kabul edilir. Erişimci olmayan bir get
özellik salt yazma olarak kabul edilir. Her iki erişimciye de sahip bir özellik okuma-yazmadır. Özelliğin nesne başlatmanın bir parçası olarak ayarlanmasını sağlamak için erişimci yerine bir set
erişimci kullanabilirinit
, aksi takdirde bunu salt okunur yapabilirsiniz.
Alanlardan farklı olarak, özellikler değişken olarak sınıflandırılmamıştır. Bu nedenle, bir özelliği veya out
parametresi olarak ref
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ü ve ardından özelliğin adı ve ardından -accessor ve/veya set
erişimci bildiren get
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
erişimcinin set
değerin 1 ile 12 arasında ayarlandığından Month
emin olabilmesi için bir özellik olarak bildirilir. ö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 özelliği çağrılarak değiştirilebilmesi için özel olarak işaretlenir. Genel 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
Erişimcinin get
gövdesi bir yöntemin gövdesine benzer. Özellik türünde bir değer döndürmelidir. C# derleyicisi ve Tam zamanında (JIT) derleyicisi, erişimciyi get
uygulamak için yaygın desenleri algılar ve bu desenleri iyileştirir. Ö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 uygulanan özellikler bu deseni izler ve bu iyileştirmelerden yararlanır. Ancak, derleyici derleme zamanında hangi yöntemin çalışma zamanında çağrılabileceğini bilmediğinden sanal get
erişimci yöntemi inlin alınamaz. 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ıdır veya dönüş veya throw deyimiyle bitmelidir ve denetim erişimci gövdesinden akamaz.
Uyarı
Erişimciyi kullanarak nesnenin durumunu değiştirmek kötü bir programlama stilidir get
.
Erişimci get
, 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 adlı value
ö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, özelliğine Name
bir set
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 erişimcideki yerel değişken bildirimi için örtük parametre adını value
kullanmak bir set
hatadır.
Init erişimcisi
Erişimci oluşturma init
kodu, yerine anahtar sözcüğünü kullanmanız dışında erişimci set
oluşturma koduyla init
set
aynıdır. Aradaki fark, erişimcinin init
yalnızca oluşturucuda veya nesne başlatıcı kullanılarak kullanılabilmesidir.
Açıklamalar
Özellikler , , private
, protected
, internal
, protected internal
veya private protected
olarak public
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. get
Aynı özelliğin ve set
erişimcilerinin farklı erişim değiştiricileri olabilir. Örneğin, get
public
türü set
dışından salt okunur erişime izin vermek ve veya protected
olabilirprivate
. 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ı kabul eder, 1 artırır NumberOfEmployees
ve Çalışan adı ile 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: {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
*/
Önceki örnekteki önemli noktalar şunlardır:
- Türetilmiş sınıftaki özelliği
Name
Name
, temel sınıfta ö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
- Atama
(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.
Geçersiz kılma özelliği örneği
Bu örnekte, ve Square
olmak üzere iki sınıf Cube
soyut bir sınıf Shape
uygular ve soyut Area
ö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 = {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
*/
Ayrıca bkz.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin