在C#裡get/set/init都是「屬性(Property)」的一部分,用來控制如何讀取或修改變數。
【C#學習筆記】09《類別(Class)》函式多載、靜態成員
public int HP { get; set; }//Auto Property(自動屬性),C# 會自動幫你產生 hidden field。
這不是一般變數,而是「屬性」,意思是:get:讀取值set:寫入值
1.get(讀取)
public int HP { get; }//只能讀,不能改
2.set(寫入)
public int HP { set; }//只能寫,不能讀(很少單獨用)
public int HP { get; set; }
同等於
private int hp;
public int GetHP()
{
return hp;
}
public void SetHP(int value)
{
hp = value;
}
Property幫你自動寫getter/setter
只能在「初始化時」設定,之後不能改。
適合:
初始數值
設定資料
不希望被亂改的值
public float HP { get; init; }
var hero = new Hero()
{
HP = 50.0f//可以初始化
};
hero.HP = 200.0f;//❌不能設值
| 功能 | set | init |
|---|---|---|
| 建立時設定 | ✔ | ✔ |
| 之後修改 | ✔ | ❌ |
| 安全性 | 普通 | 高(不可變) |
get與set可以根據需求獨立撰寫邏輯。
namespace HeroData;
public class Hero
{
private float hp;
public float HP
{
get
{
return hp;
}
set
{
if (value < 0) hp = 0;
else hp = value;
}
}
public void TakeDamage(float damage)
{
HP -= damage;
}
}
using HeroData;
var hero = new Hero()
{
HP = 50.0f
};
hero.HP = 200.0f;
hero.TakeDamage(30.0f);
Console.WriteLine(hero.HP);
在物件導向程式設計中,Field(欄位)、Property(屬性)與Constructor(建構子)是定義類別(Class)的核心元素,它們之間的關係密切,主要用於物件的資料儲存、封裝與初始化。
Field是資料本體、Property 是資料入口、Constructor 是初始化物件。
一、Field(欄位)
Field就是真正存資料的地方,通常寫在類別內,且使用private避免被外部修改,用於給Property操作。
private int hp;//這個hp就是真正存在記憶體裡的資料。
二、Property(屬性)
Property是操作Field的「入口」
private int hp;
public int HP
{
get { return hp; }
set { hp = value; }
}
player.HP = 100;
如果直接透過publice field,會導致外部可以亂改變數。透過Property修改hp,可以保護資料避免被誤改,是一種資料的封裝(Encapsulation)。
三、Constructor(建構子)
Constructor是建立物件時,自動執行的初始化方法
public Hero(float hp)
{
HP = hp;
}
var hero = new Hero(200.0f);
執行步驟大概是
建立物件
↓
Constructor初始化資料
↓
資料存進Field
↓
外部透過Property存取
| 名稱 | 角色 |
|---|---|
| Field | 真正存資料 |
| Property | 控制存取 |
| Constructor | 初始化物件 |
搞懂這組觀念後,發現類別設計就是一條龍的資料流:Field是資料本體、Property是資料入口、Constructor是初始化物件。我們透過Constructor在物件建立時賦予初值,將最真實的數據安全地存進私有的Field中,再利用 Property作為前線,透過get、set或init控管外部的讀取與寫入行為。只要這三個角色的定位明確,物件導向的封裝性自然就建立起來了。