當前位置: 妍妍網 > 碼農

掌握C#中的get和set存取器:實作內容封裝與數據驗證

2024-02-27碼農

在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 { getset; }
}

五、例子程式碼

下面是一個簡單的例子,演示了如何使用 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 和`