1.ref、out:參數傳遞的兩種方式
ref:引用傳遞
using System;
namespace CalculatorApplication
{class NumberManipulator{public void swap(ref int x, ref int y){int temp;temp = x; /* 保存 x 的值 */x = y; ? ?/* 把 y 賦值給 x */y = temp; /* 把 temp 賦值給 y */}static void Main(string[] args){NumberManipulator n = new NumberManipulator();/* 局部變量定義 */int a = 100;int b = 200;Console.WriteLine("在交換之前,a 的值: {0}", a);Console.WriteLine("在交換之前,b 的值: {0}", b);/* 調用函數來交換值 */n.swap(ref a, ref b);Console.WriteLine("在交換之后,a 的值: {0}", a);Console.WriteLine("在交換之后,b 的值: {0}", b);Console.ReadLine();}}
}
out: 輸出傳參
假設在函數調用前變量a的值為5;
此函數的實現使用輸出傳參,在方法內第一次修改a=1,第二次修改a=2,第三次修改為a=3,那么a的值會在執行此函數后為3;
unity中的射線檢測的第三個參數就是通過輸出值傳遞被擊中
物體的信息
public static bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance);
還有一種就是最普通的值傳遞;
2.如何給bool賦值null
有些類型不能為空值,int,bool,float等;
使用"?"可讓它們變成可空類型
賦值方法 bool? a=null;
a從bool類型的值變為可空bool值;
3."??"運算符
如果第一個操作數的值為 null,則運算符返回第二個操作數的值,否則返回第一個操作數的值
例子:a=b??c 如果b等于null則a等于c(不管c的值是不是null)
4、交錯數組
5、數組作為參數的兩種方式
函數的參數中有數組時,可以傳遞數組的指針和將數組整體作為參數.
數組指針作為參數:
數組整體作為參數:
?需要 在方法定義時配上關鍵字params;
6.結構體
與c和c++的結構體有所不同,參考文檔
結構體的對象存儲在棧中,適合體積小且簡單的類型,訪問速度快。
類的對象存儲在堆中,適合體積大且復雜的語句塊,但訪問速度慢,棧中只存有對象的引用。
例如:
有一個類是Book類, 執行語句Book a;
a只是Book類的一個引用還沒有分配內存,a在棧中。
當a=new Book()時,才為a分配了一個對象,這個對象在堆中,a作為內存位置的引用還是在棧中;
7.枚舉(enum)
作用就是獲取一個列表內成員在當前列表的序號,從0開始;
8.訪問修飾符
用于封裝后對封裝數據的權限設置
五種:public,private,protected,Internal,protected Internal.
前三個和c++沒啥區別;
類的默認就是Internal,也就是所有程序里都可以用這個類;
protected Internal“訪問限于當前程序集或派生自包含類的類型”,目前沒看見過這個;
9.類的成員函數
構造函數+析構函數+其他函數
構造函數:無返回值(也沒有void),和類同名,默認無參數,可以手動實現帶參構造;
析構函數:和類同名,前面帶一個 “~”,無法繼承無法重載,在類被銷毀時調用;
2023.12.6補充:
除了構造函數,類的成員函數默認都為private;
10.靜態成員
有點像單例,同一個類的對象再怎么多,這個類的靜態成員的實例都不會隨著對象的生成而增多,永遠只有一個;
靜態成員在對象生成前就已經存在了;
所以可以直接通過類名來訪問靜態成員;
而且靜態函數只能訪問靜態變量;
可以用來實現Main函數;
11、多態(重點內容)
同一個方法,能實現不同的效果;
靜態多態:
靜態多態理解為函數的多態;
同一個函數,實現不同的效果 =>函數重載,同一個函數,參數不同,效果不同。
動態多態:
動態多態理解為類的多態;
依靠抽象類和虛方法來實現:abstract和virtual
理解:一個類聲明為抽象類(加上abstract),其派生類可以重寫其內部的函數;
在抽象類里聲明為abstract的函數不能寫出函數主體,只能聲明,不能定義,不然會報錯
派生類不實現重寫抽象類的抽象函數會報錯
重寫抽象函數時無法改變訪問修飾符
將抽象函數聲明為Virtual可以在不同的派生類里實現不同的方法。
實測感覺直接用abstract也可以實現Virtual的這個功能,不知道Virtual還有沒有其他特殊用法
2023.12.6補充:
abstract修飾函數的申明,子類必須去定義基類里申明為abstract的函數,因為去定義這個函數;
virtuai修飾整個函數,子類可以去重寫也可以不重寫;
override修飾的函數,子類里必須去重寫這個函數;
12、接口
關鍵字:interface
接口的作用就是使得繼承自這個接口的類有相似的結構,都會實現接口內的函數這個特性就使得子類都有相似的結構;
13、預處理命令
很實用的是,#region和#endregion組合可以實現自定義代碼塊的折疊;
#region 注釋
代碼
#endregion