在C#中,
get
和
set
存取器是內容(Property)的重要組成部份,它們分別用於讀取和設定內容的值。透過使用
get
和
set
存取器,我們可以控制對內容值的存取,實作數據的封裝和驗證。
一、內容的基本結構
在C#中,內容通常是一個特殊的成員,它提供了對欄位或數據的存取。一個內容由兩部份組成:
get
存取器和
set
存取器。
public classPerson
{
privatestring _name; // 私有欄位
// 內容定義
publicstring Name
{
get// get存取器,用於讀取_name欄位的值
{
return _name;
}
set// set存取器,用於設定_name欄位的值
{
_name = value; // value是set存取器的隱式參數,表示要設定的新值
}
}
}
二、唯讀和只寫內容
get
和
set
存取器不是必須的,我們可以根據需要只定義一個。如果只有
get
存取器,則內容是唯讀的;如果只有
set
存取器,則內容是只寫的。
public classReadOnlyPerson
{
privatestring _name;
// 唯讀內容
publicstring Name
{
get
{
return _name;
}
}
}
public classWriteOnlyPerson
{
privatestring _name;
// 只寫內容
publicstring Name
{
set
{
_name = value;
}
}
}
三、數據驗證
set
存取器是執行數據驗證的理想位置。我們可以在設定內容值之前檢查其有效性,並據此決定是否允許設定。
public classValidatedPerson
{
privatestring _name;
publicstring Name
{
get
{
return _name;
}
set
{
if (!string.IsNullOrWhiteSpace(value) && value.Length <= 50)
{
_name = value;
}
else
{
thrownew ArgumentException("Name must be a non-empty string with a maximum length of 50 characters.");
}
}
}
}
四、自動實作的內容
在C#中,如果內容不需要額外的邏輯,我們可以使用自動實作的內容,這樣編譯器會自動為我們建立私有的後備欄位。
public classAutoImplementedPerson
{
// 自動實作的內容
publicstring Name { get; set; }
}
五、例子程式碼
下面是一個簡單的例子,演示了如何使用
get
和
set
存取器封裝一個
Person
類的內容,並在設定內容值時執行驗證。
using System;
public classPerson
{
privatestring _name;
privateint _age;
publicstring Name
{
get
{
return _name;
}
set
{
if (!string.IsNullOrWhiteSpace(value))
{
_name = value;
}
else
{
thrownew ArgumentException("Name cannot be null or whitespace.");
}
}
}
publicint Age
{
get
{
return _age;
}
set
{
if (value >= 0)
{
_age = value;
}
else
{
thrownew ArgumentException("Age cannot be negative.");
}
}
}
publicvoidDisplayDetails()
{
Console.WriteLine($"Name: {Name}, Age: {Age}");
}
}
classProgram
{
staticvoidMain()
{
Person person = new Person();
try
{
person.Name = "Alice";
person.Age = 25;
person.DisplayDetails();
person.Age = -1; // 這將丟擲異常,因為年齡不能為負
}
catch (ArgumentException ex)
{
Console.WriteLine(ex.Message);
}
}
}
在這個例子中,
Person
類有兩個內容:
Name
和`