1.ref、out:參數(shù)傳遞的兩種方式
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);
? ? ? ? ?/* 調(diào)用函數(shù)來交換值 */
? ? ? ? ?n.swap(ref a, ref b);
? ? ? ? ?Console.WriteLine("在交換之后,a 的值: {0}", a);
? ? ? ? ?Console.WriteLine("在交換之后,b 的值: {0}", b);
?
? ? ? ? ?Console.ReadLine();
? ? ? }
? ?}
}
out: 輸出傳參
假設(shè)在函數(shù)調(diào)用前變量a的值為5;
此函數(shù)的實現(xiàn)使用輸出傳參,在方法內(nèi)第一次修改a=1,第二次修改a=2,第三次修改為a=3,那么a的值會在執(zhí)行此函數(shù)后為3;
unity中的射線檢測的第三個參數(shù)就是通過輸出值傳遞被擊中
物體的信息
public static bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance);
還有一種就是最普通的值傳遞;
2.如何給bool賦值null
有些類型不能為空值,int,bool,float等;
使用"?"可讓它們變成可空類型
賦值方法 bool? a=null;
a從bool類型的值變?yōu)榭煽誦ool值;
3."??"運算符
如果第一個操作數(shù)的值為 null,則運算符返回第二個操作數(shù)的值,否則返回第一個操作數(shù)的值
例子:a=b??c 如果b等于null則a等于c(不管c的值是不是null)
4、交錯數(shù)組
5、數(shù)組作為參數(shù)的兩種方式
函數(shù)的參數(shù)中有數(shù)組時,可以傳遞數(shù)組的指針和將數(shù)組整體作為參數(shù).
數(shù)組指針作為參數(shù):
數(shù)組整體作為參數(shù):
?需要 在方法定義時配上關(guān)鍵字params;
6.結(jié)構(gòu)體
與c和c++的結(jié)構(gòu)體有所不同,參考文檔
結(jié)構(gòu)體的對象存儲在棧中,適合體積小且簡單的類型,訪問速度快。
類的對象存儲在堆中,適合體積大且復(fù)雜的語句塊,但訪問速度慢,棧中只存有對象的引用。
例如:
有一個類是Book類, 執(zhí)行語句Book a;
a只是Book類的一個引用還沒有分配內(nèi)存,a在棧中。
當(dāng)a=new Book()時,才為a分配了一個對象,這個對象在堆中,a作為內(nèi)存位置的引用還是在棧中;
7.枚舉(enum)
作用就是獲取一個列表內(nèi)成員在當(dāng)前列表的序號,從0開始;
8.訪問修飾符
用于封裝后對封裝數(shù)據(jù)的權(quán)限設(shè)置
五種:public,private,protected,Internal,protected Internal.
前三個和c++沒啥區(qū)別;
類的默認(rèn)就是Internal,也就是所有程序里都可以用這個類;
protected Internal“訪問限于當(dāng)前程序集或派生自包含類的類型”,目前沒看見過這個;
9.類的成員函數(shù)
構(gòu)造函數(shù)+析構(gòu)函數(shù)+其他函數(shù)
構(gòu)造函數(shù):無返回值(也沒有void),和類同名,默認(rèn)無參數(shù),可以手動實現(xiàn)帶參構(gòu)造;
析構(gòu)函數(shù):和類同名,前面帶一個 “~”,無法繼承無法重載,在類被銷毀時調(diào)用;
2023.12.6補充:
除了構(gòu)造函數(shù),類的成員函數(shù)默認(rèn)都為private;
10.靜態(tài)成員
有點像單例,同一個類的對象再怎么多,這個類的靜態(tài)成員的實例都不會隨著對象的生成而增多,永遠(yuǎn)只有一個;
靜態(tài)成員在對象生成前就已經(jīng)存在了;
所以可以直接通過類名來訪問靜態(tài)成員;
而且靜態(tài)函數(shù)只能訪問靜態(tài)變量;
可以用來實現(xiàn)Main函數(shù);
11、多態(tài)(重點內(nèi)容)
同一個方法,能實現(xiàn)不同的效果;
靜態(tài)多態(tài):
靜態(tài)多態(tài)理解為函數(shù)的多態(tài);
同一個函數(shù),實現(xiàn)不同的效果 =>函數(shù)重載,同一個函數(shù),參數(shù)不同,效果不同。
動態(tài)多態(tài):
動態(tài)多態(tài)理解為類的多態(tài);
依靠抽象類和虛方法來實現(xiàn):abstract和virtual
理解:一個類聲明為抽象類(加上abstract),其派生類可以重寫其內(nèi)部的函數(shù);
在抽象類里聲明為abstract的函數(shù)不能寫出函數(shù)主體,只能聲明,不能定義,不然會報錯
派生類不實現(xiàn)重寫抽象類的抽象函數(shù)會報錯
重寫抽象函數(shù)時無法改變訪問修飾符
將抽象函數(shù)聲明為Virtual可以在不同的派生類里實現(xiàn)不同的方法。
實測感覺直接用abstract也可以實現(xiàn)Virtual的這個功能,不知道Virtual還有沒有其他特殊用法
2023.12.6補充:
abstract修飾函數(shù)的申明,子類必須去定義基類里申明為abstract的函數(shù),因為去定義這個函數(shù);
virtuai修飾整個函數(shù),子類可以去重寫也可以不重寫;
override修飾的函數(shù),子類里必須去重寫這個函數(shù);
12、接口
關(guān)鍵字:interface
接口的作用就是使得繼承自這個接口的類有相似的結(jié)構(gòu),都會實現(xiàn)接口內(nèi)的函數(shù)這個特性就使得子類都有相似的結(jié)構(gòu);
13、預(yù)處理命令
很實用的是,#region和#endregion組合可以實現(xiàn)自定義代碼塊的折疊;
#region 注釋
代碼文章來源:http://www.zghlxwxcb.cn/news/detail-756697.html
#endregion文章來源地址http://www.zghlxwxcb.cn/news/detail-756697.html
到了這里,關(guān)于C# 語法筆記的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!