iT邦幫忙

2023 iThome 鐵人賽

DAY 14
0

先複習一下上次的結尾處

namespace WebApplication2;

public class BankAccount
{
    public string Number { get; }
    public string Owner { get; set; }
    public decimal Balance { get; }
    
    private static int _sAccountNumberSeed = 1234567890;
}

還記得前面有提到, C# 是一個強型別的語言,所以在上面定義變數的地方都需要宣告變數的型別

💡 Value Type (實質類別):存取的是實際的數值,也就是記憶體位址。
每次異動都會配置一個新的記憶體位置

  1. 定義數值 (存取的記憶體大小不同)
    1. int:整數
    2. double
    3. decimal:十進位浮點
    4. float:浮點數
  2. 布林: bool (預設為 false)
  3. 字元:char (’z’)
  4. DateTime
//Value Type
int i; // 宣告 *此時尚未配置記憶體位址,無法直接使用
int x;
i = 1; // 設定初始值 *系統自動配置記憶體
x = i; // x = 1 *系統複製 i 的記憶體內容至另一個記憶體位址

Console.WriteLine(i); // i=1
Console.WriteLine(x); // x=1

i = 3; // 系統不需要再配置新的記憶體位置,它會將 i 的值設定為 3,原記憶體位置並不會拋棄並回收
x = 4;

Console.WriteLine(i); // i=3
Console.WriteLine(x); // x=4

💡 Reference Type (參考類別)

  1. List
  2. 字串:string(”Hello World”)
string today = "2023"

// 自定義 Person
Person person1 = new Person();
//物件必須要透過「new Class名稱()」的方式建立,沒有指向任何物件的 reference(參考) 變數,則存放著「null」
person1.Name = "Alice";
person1.Age = 30;

// 將 person1的數值賦予给person2,共同指向同一个物件
Person person2 = person1;

// 因為 person1 跟 person2 指向的記憶體為相同,因此修改 person2 的值會影響 person1
person2.Age = 35;

Console.WriteLine($"person1: {person1.Name}, Age: {person1.Age}"); //"Alice", 35
Console.WriteLine($"person2: {person2.Name}, Age: {person2.Age}"); //"Alice", 35

從記憶體角度來看

物件存在記憶體的方式有兩種

堆疊(stack):先進後出,後進先出; LIFO (last in, first out)

堆積(heap):不管順序,不會特別做排序,只將資料統一集中。

C# 執行時期會將拿到的記憶體空間切出 stack & heap 區域

  • value type:Stack中變數儲存的內容是"實值"。
  • reference type:在Stack中變數儲存的是"參考"(指向Heap記憶體位址),而實值是存在Heap。

參考文章:


上一篇
C# 撰寫規則
下一篇
C# OOP
系列文
往後端邁進的菜前端30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言