在C#中,get
和set
訪問器是屬性(Property)的重要組成部分,它們分別用于讀取和設置屬性的值。通過使用get
和set
訪問器,我們可以控制對屬性值的訪問,實現(xiàn)數(shù)據(jù)的封裝和驗證。
一、屬性的基本結構
在C#中,屬性通常是一個特殊的成員,它提供了對字段或數(shù)據(jù)的訪問。一個屬性由兩部分組成:get
訪問器和set
訪問器。
public class Person
{
private string _name; // 私有字段
// 屬性定義
public string Name
{
get // get訪問器,用于讀取_name字段的值
{
return _name;
}
set // set訪問器,用于設置_name字段的值
{
_name = value; // value是set訪問器的隱式參數(shù),表示要設置的新值
}
}
}
二、只讀和只寫屬性
get
和set
訪問器不是必須的,我們可以根據(jù)需要只定義一個。如果只有get
訪問器,則屬性是只讀的;如果只有set
訪問器,則屬性是只寫的。
public class ReadOnlyPerson
{
private string _name;
// 只讀屬性
public string Name
{
get
{
return _name;
}
}
}
public class WriteOnlyPerson
{
private string _name;
// 只寫屬性
public string Name
{
set
{
_name = value;
}
}
}
三、數(shù)據(jù)驗證
set
訪問器是執(zhí)行數(shù)據(jù)驗證的理想位置。我們可以在設置屬性值之前檢查其有效性,并據(jù)此決定是否允許設置。
public class ValidatedPerson
{
private string _name;
public string Name
{
get
{
return _name;
}
set
{
if (!string.IsNullOrWhiteSpace(value) && value.Length <= 50)
{
_name = value;
}
else
{
throw new ArgumentException("Name must be a non-empty string with a maximum length of 50 characters.");
}
}
}
}
四、自動實現(xiàn)的屬性
在C#中,如果屬性不需要額外的邏輯,我們可以使用自動實現(xiàn)的屬性,這樣編譯器會自動為我們創(chuàng)建私有的后備字段。
public class AutoImplementedPerson
{
// 自動實現(xiàn)的屬性
public string Name { get; set; }
}
五、例子代碼
下面是一個簡單的例子,演示了如何使用get
和set
訪問器封裝一個Person
類的屬性,并在設置屬性值時執(zhí)行驗證。
using System;
public class Person
{
private string _name;
private int _age;
public string Name
{
get
{
return _name;
}
set
{
if (!string.IsNullOrWhiteSpace(value))
{
_name = value;
}
else
{
throw new ArgumentException("Name cannot be null or whitespace.");
}
}
}
public int Age
{
get
{
return _age;
}
set
{
if (value >= 0)
{
_age = value;
}
else
{
throw new ArgumentException("Age cannot be negative.");
}
}
}
public void DisplayDetails()
{
Console.WriteLine($"Name: {Name}, Age: {Age}");
}
}
class Program
{
static void Main()
{
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
和`
該文章在 2024/3/19 11:20:01 編輯過