iT邦幫忙

0

【C#學習筆記】10《類別(Class)番外篇》get / set / init

  • 分享至 

  • xImage
  •  

在C#裡get/set/init都是「屬性(Property)」的一部分,用來控制如何讀取修改變數。


【C#學習筆記】09《類別(Class)》函式多載、靜態成員


一、基本概念(Property)

public int HP { get; set; }//Auto Property(自動屬性),C# 會自動幫你產生 hidden field。

這不是一般變數,而是「屬性」,意思是:
get:讀取值
set:寫入值

二、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

四、init是什麼?

只能在「初始化時」設定,之後不能改。
適合:

初始數值
設定資料
不希望被亂改的值

public float HP { get; init; }
var hero = new Hero()
{
    HP = 50.0f//可以初始化
};
hero.HP = 200.0f;//❌不能設值
功能 set init
建立時設定
之後修改
安全性 普通 高(不可變)

五、加邏輯的進階用法

getset可以根據需求獨立撰寫邏輯。

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作為前線,透過getsetinit控管外部的讀取與寫入行為。只要這三個角色的定位明確,物件導向的封裝性自然就建立起來了。


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言