目錄
值類型
引用類型
修改stu3的值 stu也被修改了 為什么? (對象之間)
值類型中,值全在棧中單獨存儲,變量之間不會影響
結構體中,結構體全在棧中,結構體與結構體之間也不會相互影響
靜態資源區
值類型
值類型的儲存只需要一段儲存 用來存放實際的數據 ?在棧中儲存
int a = 10;
引用類型
需要兩段內存
第一段(等式前)儲存實際的數據 它在棧中儲存
第二段(等式后) 是一個應用指針,指向數據在堆內存中儲存數據的位置 ?地址儲存在棧中?通過棧中的地址快速的找到堆中的數據
對象與對象之間不會相互影響 ?通過new出來的對象都會在堆內存中開辟一塊新的空間?
class Student
{public int age;public string name;public Student(int age, string name){this.age = age;this.name = name;}
}static void Main(string[] args)
{Student stu = new Student(20,"小明");Student stu1 = new Student(30,"李四");}
修改stu3的值 stu也被修改了 為什么? (對象之間)
因為將stu中存儲的地址賦值給了stu3 ?它們兩個是共用的一個地址 指向同一個堆內存 所以一個修改另外一個也會修改
Student類的對象之間,棧中的?stu3 = stu(stu3沒有使用new重新開辟一塊新的空間?),其地址指向同一個堆內存中儲存的數據
Student stu3 = stu; stu3.age = 100; Console.WriteLine(stu3.age);//100 Console.WriteLine(stu.age); // 20? 100? 輸出為100
null ?空 空對象 空引用 ?空對象會被垃圾回收機制回收(GC)
棧內存空間小 讀取速度快
堆內存空間大 讀取速度慢
值類型中,值全在棧中單獨存儲,變量之間不會影響
int num = 10;
int num1 = num;
num = 20;
Console.WriteLine(num); //20
Console.WriteLine(num1);//10
結構體中,結構體全在棧中,結構體與結構體之間也不會相互影響
static void Main(string[] args)
{
//結構體全在棧中
Dog d1 = new Dog("阿黃",2);
Dog d2 = new Dog();
// 結構體與結構體之間不會相互影響
d1.age = 100;
Console.WriteLine(d1.age);
Console.WriteLine(d2.age);
Dog d3 = d1;
d1.age = 1000;
Console.WriteLine(d1.age); // 1000
Console.WriteLine(d3.age); // 2
}struct Dog{public string name;public int age;
//結構體即使 自己定義了 有參的構造函數 默認的無參的也會存在,如定義的 d2,但是類中會被覆蓋public Dog(string name, int age){this.name = name;this.age = age;}}
在結構體中,即使自己定義了 有參的構造函數 ?默認的無參的也會存在,如定義的 d2,但是類中會被覆蓋,若使用無參的還得再定義一個無參的構造函數。
靜態資源區
?對于字符串常量來說 實際是儲存在靜態資源區的 ?即使在堆中用的字符串也是存放在靜態資源區的 ?因為 如果用到重復的字符串時 他們指向的地址是一樣的 ?會解決內存問題 ?字符串在靜態資源區中是不會被改變的 ? 看到的修改其實只是修改指向的位置 ?內容并沒有修改
const string name = "小明";//const 定義常量
?