我們一起深入理解 C# 中的屬性與方法
在C#編程中,屬性(Property)和方法(Method)是定義類和對象行為的兩個關鍵概念。它們使程序能夠封裝數據、實現功能并確保代碼的健壯性和可維護性。本文將詳細介紹屬性和方法的應用特點,探討它們在不同場景下的使用,并通過多個示例展示如何在實際編程中有效運用屬性和方法。
屬性(Property)
屬性提供了一種控制對類中私有字段的訪問方式,允許在讀取或寫入值時執行自定義邏輯,如數據驗證。屬性使得類的使用者可以像訪問公共字段一樣訪問數據,但同時保留了封裝的優勢。
屬性的基本用法
public class Person
{
private string name; // 私有字段
public string Name
{
get { return name; } // 獲取器:返回私有字段的值
set { name = value; } // 設置器:設置私有字段的值
}
}
示例:
internal class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.Name = "Alice"; // 設置屬性值
Console.WriteLine($"Person's name: {person.Name}"); // 獲取屬性值
}
}
輸出:
圖片
自動屬性
當屬性的獲取和設置不需要額外的邏輯時,可以使用自動屬性簡化代碼。
public class Person
{
public string Name { get; set; } // 自動屬性
}
示例:
Person person = new Person();
person.Name = "Bob";
Console.WriteLine($"Person's name: {person.Name}");
輸出:
圖片
只讀和只寫屬性
- 只讀屬性:只有get訪問器,外部代碼只能讀取,不能修改。
- 只寫屬性:只有set訪問器,外部代碼只能設置,不能讀取。
只讀屬性示例:
public class Product
{
private readonly string id = Guid.NewGuid().ToString();
public string ID
{
get { return id; }
}
}
示例:
Product product = new Product();
Console.WriteLine($"Product ID: {product.ID}");
輸出:
圖片
屬性中的數據驗證
可以在屬性的設置器中添加數據驗證邏輯,確保屬性值的有效性。
public class Circle
{
private double radius;
public double Radius
{
get { return radius; }
set
{
if (value > 0)
{
radius = value; // 僅當值合法時才設置
}
else
{
throw new ArgumentException("半徑必須大于零。"); // 否則拋出異常
}
}
}
}
示例:
internal class Program
{
static void Main(string[] args)
{
try
{
Circle circle = new Circle();
circle.Radius = -5; // 嘗試設置非法值
}
catch (ArgumentException ex)
{
Console.WriteLine(ex.Message);
}
}
}
輸出:
圖片
方法(Method)
方法定義了類的行為,封裝了執行特定操作的代碼邏輯。方法可以接受參數、執行運算并返回結果。
方法的基本使用
public class Calculator
{
// 加法方法,接受兩個整數參數并返回它們的和
public int Add(int a, int b)
{
return a + b;
}
}
示例:
internal class Program
{
static void Main(string[] args)
{
Calculator calculator = new Calculator();
int sum = calculator.Add(3, 5);
Console.WriteLine($"3 + 5 = {sum}");
}
}
輸出:
圖片
帶有多個方法的類
public class MathOperations
{
// 乘法方法
public int Multiply(int a, int b)
{
return a * b;
}
// 除法方法
public double Divide(double a, double b)
{
if (b == 0)
{
throw new DivideByZeroException("除數不能為零。");
}
return a / b;
}
}
示例:
internal class Program
{
static void Main(string[] args)
{
MathOperations mathOps = new MathOperations();
int product = mathOps.Multiply(4, 6);
Console.WriteLine($"4 * 6 = {product}");
try
{
double quotient = mathOps.Divide(10, 0);
}
catch (DivideByZeroException ex)
{
Console.WriteLine(ex.Message);
}
}
}
輸出:
圖片
方法的重載
方法重載允許在同一類中創建多個同名方法,但參數列表必須不同。
public class Logger
{
// 日志方法:記錄字符串消息
public void Log(string message)
{
Console.WriteLine($"Message: {message}");
}
// 日志方法:記錄異常信息
public void Log(Exception ex)
{
Console.WriteLine($"Exception: {ex.Message}");
}
}
示例:
internal class Program
{
static void Main(string[] args)
{
Logger logger = new Logger();
logger.Log("This is a simple message.");
try
{
int y = 0;
int result = 10 / y;
}
catch (Exception ex)
{
logger.Log(ex);
}
}
}
輸出:
圖片
靜態方法與實例方法
- 實例方法:必須通過對象實例調用,方法內部可以訪問實例成員。
- 靜態方法:通過類名調用,不需要創建實例,不能訪問實例成員。
靜態方法示例:
public class Utility
{
public static void DisplayTime()
{
Console.WriteLine($"Current Time: {DateTime.Now}");
}
}
示例:
internal class Program
{
static void Main(string[] args)
{
Utility.DisplayTime();
}
}
輸出:
圖片
屬性與方法的綜合應用
public class BankAccount
{
private decimal balance;
public string AccountNumber { get; } // 只讀屬性
public string Owner { get; set; } // 自動屬性
public decimal Balance
{
get { return balance; }
private set { balance = value; } // 私有設置器,只能在類內部修改
}
public BankAccount(string owner, decimal initialBalance)
{
AccountNumber = Guid.NewGuid().ToString();
Owner = owner;
Balance = initialBalance;
}
public void Deposit(decimal amount)
{
if (amount > 0)
{
Balance += amount;
Console.WriteLine($"已存入:{amount:C2}");
}
else
{
Console.WriteLine("存款金額必須大于零。");
}
}
public void Withdraw(decimal amount)
{
if (amount > 0 && amount <= Balance)
{
Balance -= amount;
Console.WriteLine($"已取出:{amount:C2}");
}
else
{
Console.WriteLine("取款金額無效或余額不足。");
}
}
}
示例:
internal class Program
{
static void Main(string[] args)
{
BankAccount account = new BankAccount("Charlie", 1000m);
Console.WriteLine($"賬戶所有者:{account.Owner}");
Console.WriteLine($"賬戶余額:{account.Balance:C2}");
account.Deposit(500m);
Console.WriteLine($"賬戶余額:{account.Balance:C2}");
account.Withdraw(200m);
Console.WriteLine($"賬戶余額:{account.Balance:C2}");
account.Withdraw(1500m); // 嘗試取出超過余額的金額
}
}
輸出:
圖片
在實際編程中的應用場景
- 數據封裝和保護:通過屬性控制對私有字段的訪問,確保數據的完整性。
- 數據驗證:在屬性設置器中添加驗證邏輯,防止無效數據。
- 行為實現:使用方法實現類的功能,如計算、數據處理和與外部系統的交互。
- 代碼重用和維護:合理的屬性和方法設計提高了代碼的可重用性和可維護性。
注意事項
- 屬性設計:
a.使用屬性封裝私有字段,提供必要的訪問控制。
b.在設置器中進行數據驗證,確保對象狀態的有效性。
c.考慮使用只讀或只寫屬性滿足特殊需求。
- 方法設計:
a.方法應具有明確的職責,避免過于復雜。
b.使用方法重載提高代碼的靈活性。
c.適當使用靜態方法,提供與實例無關的功能。
總結
通過本文的詳細介紹,我們深入了解了C#中屬性和方法的使用方式。屬性使得我們可以優雅地控制對類內部數據的訪問和修改,并確保數據的有效性。方法則定義了類的行為,承擔了執行操作和業務邏輯的職責。