iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 4
0
自我挑戰組

C# 從入門到WebApi系列 第 4

[Day4] 我知道Class 班級對吧

  • 分享至 

  • twitterImage
  •  

對你個頭 這裡指的是類別

在開始之前

知道了一些資料型別 那麼你有聽過參考型別與實質型別嗎

這個部分可能會有一點點難懂
我會盡量寫得看得懂
可以之後再回來看
但是這個部分算是很重要的
如果你現在跳過這裡
請之後抽空回來了解他

在程式執行時記憶體裡面有兩塊區域
分別是Stack(堆疊)跟Heap(堆積)

  • Stack 可以想像為一個組合櫃
    每當變數被宣告的時候就由下往上往盒子裡面塞變數
    直到變數的生命週期結束
  • Heap 把她想成你的房間,裡面推滿了雜物(資料)
    但是你是一個喜歡把東西亂丟的人,所以你需要利用你的組合櫃(Stack)
    裡面放著告訴你你的東西(資料)要去哪裡找的標籤
    但是 身為一個正常的人類 你肯定不能忍受你髒亂的房間
    所以你會不定期巡查你的房間
    將用不到的東西蓋上難用印

    接著這東西真的沒用了
    你就會將它丟掉
    同樣的若是沒有變數(組合櫃標籤)指向這個資料
    系統就會自動清理這些資料
    稱為(Garbage Collecttion)
    詳閱 (https://docs.microsoft.com/zh-tw/dotnet/standard/garbage-collection/)

但是我不想要每次都要去房間裡面找東西
所以我決定把一些東西放在組合櫃裡
這種資料型別的資料就叫做 實質型別(Value Type)
反之你需要去翻找的型別稱為參考型別(Reference Type)

實質型別

他的執行個體被放在Stack中
可以快速的被建立,存取,移除。
因為存取此種型別的資料時,記憶中所存取的是真正的資料
故稱呼為實質型別
常見的實質型別有數值行別(char,int,double,float等等),struct,enum 3種 實質型別
(struct 跟 enum 我懶得講(列舉推薦看一下 之後有空我會補上) 有興趣可參閱結構struct列舉enum

參考型別

執行個體放在Heap
Stack 存放的是指向執行個體的指標
舉例而言
城武今天想到圖書館借一本書
我先到查詢系統找到了索書號
然後我才根據索書號取得了這本書

常見的參考類型有string,陣列,class(類別),delegate(委派),介面(interface)

最後用個圖稍微表示下 Stack 跟 Heap
畫得很醜我知道 我努力了QQ
https://ithelp.ithome.com.tw/upload/images/20200904/20109549FYrQWgiKQU.png

重要

在你宣告一個參考型別的變數的時候
他只在Stack區存放這個變數
但是你沒有告訴她這個變數指到哪裡
他是指向null
也就是什麼都沒有
若這時候使用這個變數 可能會出現null reference的例外
直到你使用new **()**來告訴系統我需要一塊空間來存放資料
這時,變數就會指向該記憶體位置

總算能進入今天的正文了 Class(類別)

什麼是物件

在現實生活中 一本書是個物件 一輛車是個物件 一個人也是個物件
每個物件都有對應的行為和特徵
我們不可分割的最大海外領土中國
將物件導向程式設計(Object Oriented Programming)
稱為 面向對象編程
亦即用程式來模擬真實世界的物件行為
物件的特徵用屬性(Properties)來模擬
物件的行為用方法(Method)來模擬
基本上一個string 是一個物件
一個 int 也是一個物件
一個class也是一個物件
但是他算是一個比較大一點的物件(機器)
由string(齒輪),method(螺絲)等等小物件所組裝起來

講了這麼多 看看怎麼宣告類別吧

存取修飾詞 class 類別名稱{

}

public class MyClass{
}

通常我們會新增一個檔案來放一個類別
在方案總管中 對你的專案按下右鍵
點選加入 新增類別
https://ithelp.ithome.com.tw/upload/images/20200904/201095496N0pY5uqZr.png
在紅色地方輸入你的類別名稱
https://ithelp.ithome.com.tw/upload/images/20200904/20109549gujnMadmGz.png

Class 需要宣告在namespace 的大括號裡面

一個Class 看起來像什麼

我宣告了一個Car類別
裡面有以下的東西

using System;

namespace Practice
{
    public class Car
    {
        //私有屬性 通常稱為field
        private int speed = 0;
        private string breed;

        //公有屬性(property) 可以被外部存取
        public String Color { get; set; }
        public int Year { get; set; }

        //建構式
        public Car()
        {
            breed = "Benz";
        }
        public Car(string setBreed)
        {
            breed = setBreed;
        }

        //方法(method)
        public void FordWard() // 前進
        {
            Console.WriteLine("車子前進了");
        }
        public void BackWard() // 後退
        {
            Console.WriteLine("車子後退了");
        }

        public void Accelerate(int acc) //加速
        {
            speed += acc; //speed = speed + acc
        }
        public void GetBreed() //取得牌子
        {
             Console.WriteLine("車子的牌子是"+breed);
        }
    }
}

實例化類別

我們在main 裡面打上下面的程式碼

void Main(){
    Car MyCar = new Car();
}

要實例化類別
語法像
類別名稱 變數名稱 = new 類別名稱()

引用Class方法

void Main(){
    Car MyCar = new Car();
    MyCar.FordWard();
    //車子前進了
    MyCar.BackWard();
    //車子後退了
}

建構式(Constructor)

void Main(){
    Car MyCar = new Car();
    MyCar.GetBreed();
    //車子的牌子是Benz
    //因為我們在實例化車子Car()的時候會呼叫breed="Benz"
    
    Car MySuperCar = new Car("Bugetti")
    MyCar.GetBreed();
    //車子的牌子是Bugetti
    //因為我們在實例化車子時帶了string 參數 因此會對應到Car(string SetBreed)的方法
}

我們可以將實例化要做一些初始設定的工作放在建構式
其實還有解構式
但是我懶得介紹><(我很少用到)
通常會用在資源連線等釋放
有興趣的請自行參閱

屬性(Property)

我們宣告了Color跟Year兩種公有屬性 我們可以在外部存取他

void Main(){
    Car MyCar = new Car();
    MyCar.Color = "yellow";
    MyCar.Year = 2020;
    
    Console.WriteLine(MyCar.Color);//yellow
    Console.WriteLine(MyCar.Year);//2020
}

有一種類別裡面只放property

像是

public class Book
    {
        public string Name { get; set; }
        public int ISBN { get; set; }
        public int Price { get; set; }
        public DateTime PublishYear { get; set; }
        public string Author { get; set; }
    }

我們通常稱呼這種類別為Model
裡面不包含任何邏輯(Method等等)
之後會用到 所以先介紹

其實get set大有文章

但是我明天還有事要早起
之後會再補上
<(_ _)>


上一篇
[Day3] 方法,那是什麼能吃嗎
下一篇
[Day5] try and error 修正錯誤前進吧!
系列文
C# 從入門到WebApi30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言