.net學習之類與對象、new關鍵字、構造函數、常量和只讀變量、枚舉、結構、垃圾回收、靜態成員、靜態類等

1.類與對象的關係
類是對一類事務的統稱,是抽象的,不能拿來直接使用,好比汽車,沒有具體指哪一輛汽車
對象是一個具體存在的,看的見,摸得着的,能夠拿來直接使用,好比我家的那輛剛剛買的新汽車,就是具體的對象
對象是根據類這個模板建立出來的,類裏面有哪些特性或者功能對象裏面也有,多不得,少不得程序員

2.new 一個對象作了哪些事情?
Person person = new Person();new是一個運算符
(1)在內存中開闢一塊合適大小的空間
(2)在這個空間裏建立對象
(3)調用這個對象的構造函數
(4)返回這個空間的引用地址算法

3.訪問修飾符
類的訪問修飾符只有public和internal,內部類的訪問修飾符能夠爲private函數

4.屬性
屬性的本質是一個get和一個set方法,而set方法中定義了一個參數名稱爲value,因此咱們能夠在set方法中訪問value
屬性就是對字段的封裝
屬性自己不存值,值是存在屬性封裝的對應的字段中
只要類中的字段要被外界訪問,就須要把這個字段封裝爲屬性this

5.構造函數
(1)構造函數訪問修飾符通常狀況下是public,沒有返回值,方法的名稱與類名相同
(2)構造函數在建立這個對象的時候被自動調用,程序員沒法手動調用
(3)構造函數有什麼用?若是咱們但願在建立這個類的對象的同時須要執行一些代碼,咱們就能夠將這些代碼寫到構造函數中
(4)this關鍵字表明當前對象,當前運行在內存中的那一個對象,this關鍵字能夠調用其餘的構造函數
(5)構造函數調用構造函數:
public Dog(int age,string name):this(age)
{

}
public Dog(int age)
{

}
調用的時候:Dog dog = new Dog(2,"旺財");程序會先調用Dog(int age)構造函數,而後在調用Dog(int age,string name)構造函數
(6)隱式構造函數:若是程序員沒有爲類手動添加構造函數,C#編譯器在編譯的時候會自動添加一個無參數的構造函數
若是添加了構造函數,C#編譯器在編譯的時候則不會添加編碼

6.常量和只讀變量
(1)const修飾的數據叫作常量,
常量一旦聲明常量的值就不能改變,由於C#編譯器在編譯的時候聲明常量的那句代碼不見了,在使用常量的地方就用常量的值替換了
好比
const string name = "小明";
Console.WriteLine(name);
編譯以後變爲
Console.WriteLine("小明");因此不能賦值對象

readonly修飾的變量只讀變量
readonly string name = "小明";
public Person()
{繼承

}
編譯後
readonly string name ;
public Person()
{
this.name = "小明";
}
const和readonly的區別:
const不能修改值,readonly只能在構造函數中修改值
const在編譯的時候就要肯定值,readonly在運行時要肯定值生命週期

7.枚舉
枚舉是一個值類型,每個枚舉成員都對應了一個整型的數值,這個數值默認是從0開始遞增
枚舉和int類型轉換:int a = (int)Direction.South; int i = 2; Direction d = (Direction)i;
枚舉和string類型轉換:string str = "South"; Direction d = (Direction)Enum.Parse(typeof(Direction),str,true); //true表示忽略
大小寫
枚舉值所對應的數值默認是int類型的,能夠在枚舉的名字後面加一個冒號來指定這個數值的類型,只能是整型的(byte,short。。。)
如:
enum Direction:byte
{

}
好處:限定變量的取值範圍,在編碼過程當中不容易出錯事務

8.結構struct
(1)結構中能夠定義字段、屬性、方法、構造函數,也能夠經過new關鍵字來建立對象
(2)無參數的構造函數不管如何C#編譯器都會自動生成,因此咱們不能顯示的聲明無參數的構造函數
(3)在構造函數中必需要爲結構體的全部的字段賦值
(4)在構造函數中爲屬性賦值,不認爲是對字段賦值,由於屬性不必定是去操做字段
(5)結構是一個值類型,在傳遞結構變量的時候,會將結構對象裏面的每個字段複製一份,而後拷貝到新的對象中
(6)不能定義自動屬性,由於自動屬性會生成一個字段,而這個字段必需要求在構造函數中,而咱們又不知道這個字段
(7)聲明結構體對象能夠不new關鍵字,可是這個時候結構體對象的字段沒有初始值,由於沒有調用構造函數,而構造函數中必須爲字段賦
值,因此經過new關鍵字建立的結構體對象的字段就有默認值。
(8)當咱們要表示一個輕量級的對象的時候,就能夠定位結構以提升速度。根據傳值的影響來選擇,但願傳引用就定義爲類,但願傳拷貝就
定義爲結構內存

9.垃圾回收
託管代碼:被CLR管理的代碼
非託管代碼:不被CLR管理的代碼
應用程序域:當。net應用程序在CLR中運行的時候,CLR會建立一個單獨的應用程序域,讓。net應用程序在應用程序域中運行
分配在棧空間的變量一旦執行完其所在的做用域(即"{ }"中),這個變量就會CLR當即回收
分配在堆裏面的對象沒有任何對象引用的時候,這個對象就被標記爲「垃圾對象」,等待垃圾回收期回收。
GC會定時的清理堆空間中的垃圾對象,GC清理垃圾對象的頻率程序員沒法決定,由CLR自動控制
當一個對象被標記爲「垃圾對象」的時候,這個對象不必定當即被回收
垃圾回收運行機制:
垃圾回收會根據應用程序的運行狀況來使用合適的算法,其中一種算法以下:
CLR會預先開闢一塊空間,當建立對象的時候會放在第0代的內存中,當第0代的空間滿的時候,GC開始回收第0代,不被標記垃圾的對象會移
動到第1代內存中,而後第0代空間變爲空,當再次建立對象的時候會存儲在第0代空間,一直這樣重複,第1代空間不滿的時候不會回收。當
第1代空間滿的時候,會垃圾回收第1代,而後把老的對象移動到第1代,新對象存儲在第0代。第1代到第2代是和第0代到第1代同樣,當三代
都滿的時候會報異常說內存溢出

GC.GetGeneration(p)獲取指定對象是屬於第幾代,總共有3代,從0開始,0,1,2
GC.Collect();當即讓垃圾回收器對全部的代進行垃圾回收
GC.Collect(0);表示對第0代回收GC.Collect(1);表示對第0代和第1代回收

Person p = new Person();
GC.GetGeneration(p);值爲0
GC.Collect();
GC.GetGeneration(p);值爲1
GC.Collect();
GC.GetGeneration(p);值爲2
GC.Collect();
GC.GetGeneration(p);值爲2
10.析構函數
析構函數不能有訪問修飾符,不能有參數,全部不能被繼承或重載,在對象被垃圾回收器回收的時候,析構函數被GC自動調用,當沒有垃圾
對象的時候不會被調用,
執行一些清理善後的操做
~Person()
{

}
11.靜態成員
(1)在這個類第一次被加載的時候,這個類下面全部的靜態成員會被加載,靜態成員是屬於類的,實例成員是屬於對象的
(2)靜態成員只能被建立一次,因此靜態成員只有一份,實例成員有多少個對象就建立多少次
(3)靜態成員被建立在靜態存儲區中,一旦建立直到程序退出纔會被回收
(4)何時定義爲靜態的?變量須要被共享的時候,方法須要被反覆調用的時候
(5)靜態方法中不能直接調用實例成員,由於靜態方法被調用的時候,對象有可能沒有建立
(6)this/base關鍵字在靜態方法中不能使用,由於有可能對象不存在
(7)在實例方法中能夠調用靜態成員,由於這個時候靜態成員確定存在
靜態成員和實例成員區別:
(1)生命週期不一樣,靜態成員在程序退出時纔會被回收,實例成員則在該對象被垃圾回收器回收時纔會被回收
(2)存儲的位置不一樣,靜態成員存儲在靜態存儲區中,實例成員存儲在堆的對象裏面

12.靜態類(1)靜態類中只能聲明靜態成員(2)靜態類中不能有實例構造函數(3)靜態類中不能被實例化,由於沒有實例成員,實例化無心義(4)靜態類不能被繼承,由於本質是一個抽象的密封類,因此不能被繼承也不能被實例化(5)若是一個類下面的全部成員都須要被共享,那麼就能夠把這個類定義爲靜態類(6)不能聲明一個靜態類的變量,好比靜態類Person p;靜態構造函數:非靜態類也能夠有靜態構造函數靜態類的成員第一次被訪問以前就會執行靜態構造函數靜態構造函數只被執行一次

相關文章
相關標籤/搜索