?
int?
int x =null//不行
int? y =null//可以
簡要說明:可以使int 或string有null
?.運算子和?[ ]
A?.B
A?[num]//判斷陣列[num]是不是空值
簡要說明:如果A不是null就傳回B
A?.B??=C
簡要說明:如果A是null就會把C值賦予左邊
限制:1.??=左側操作符必須是變數、屬性或索引子元素
2.不可以多載
?:運算子
A?B:C
簡要說明:A要是能判斷true或false陳訴句如果是T傳回B,如果是F傳回C
限制:1.??=左側操作符必須是變數、屬性或索引子元素
2.不可以多載
throw運算式(感覺在寫程式的程式才會用到)
功用:當出現例外狀況發出訊號
限制
1.只能必須出現在 if else 陳述式中
2.可以使用在??和?:中
ref關鍵字(可以用在foreach、方法、區域變數、方法傳回值)
功用1.在方法簽章和方法呼叫中,以傳址方式將引數傳遞給方法//需要初始化
2.在方法簽章中,以傳參考方式將值傳回給呼叫者
3.在成員主體中,指出參考傳回值儲存在本機作為呼叫者想要修改的參考,或是一般而言,以參考存取另一個值的區域變數
4.在 struct 宣告中來宣告 ref struct 或 readonly ref struct
限制:
1.ref和in在使用前要先初始化,而out不需要
2.如果類型的兩個成員之間,唯一的區別在於其中一個有ref 參數,而另一個有out 或 in 參數,則會發生編譯器錯誤
3.但如果一種方法有ref、in 或 out 參數,而另一種方法有實值參數,則可以對方法進行多載
4.不可為下列幾種方法使用 ref、in 和 out 關鍵字
1.使用 async 修飾詞定義的 async 方法 2.迭代器方法,其包括 yield return 或 yield break 陳述式
5.,擴充方法具有以下限制
1.關鍵字out不能用於擴充方法的第一個參數
2.ref當參數不是結構,或者泛型類型不受約束為結構時,關鍵字不能用於擴展方法的第一個參數
3.除非in第一個參數是結構,否則無法使用關鍵字。in關鍵字不能在任何泛型類型上使用,即使約束為結構。
6.ref的方法的return也要加ref,也可能將傳回值宣告為ref readonly
7.ref 區域變數無法初始化至非 ref 傳回值
1.ref結構不能是陣列的元素類型。
2.ref結構不能是類或非ref結構欄位的已聲明類型。
3.ref結構不能實現介面。
4.ref結構不能載入到System.ValueType或System.Object。
5.ref結構不能是類型參數。
6.ref lambda 運算式或局部函數無法捕獲結構變數。
7.ref結構變數不能在async方法中使用。 但是,您可以在同步方法ref中使用結構變數,例如,在返回Task或Task<TResult>中。
8.ref結構變數不能用於發上層器。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Exercisc : MonoBehaviour
{
public void Initialization_A(ref string equipment_name,ref int attack_number,ref int money_number)
{
equipment_name = "null";
attack_number = 0;
money_number = 0;
}
public void Initialization_B( string equipment_name, ref int attack_number, ref int money_number)
{
equipment_name = "null";
attack_number =1;
money_number = 1;
}
public void Display(string equipment_name, int attack_number, int money_number)
{
Debug.Log("裝備" + equipment_name + "攻擊力" + attack_number + "價值多少" + money_number);
}
void Start()
{
string equipment ="木棍";
int attack=10, money=100;//要先初始化
Initialization_A(ref equipment, ref attack,ref money);
Display( equipment, attack, money);//裝備null攻擊力0價值0
equipment = "小刀";
Initialization_B( equipment, ref attack, ref money);
Display(equipment, attack, money);//裝備小刀攻擊力1價值1
ref int apple =ref int banana;
int banana=0,mango=0,orange=20;
ref int apple = ref banana;//可以讓這兩個數變成共變數,當apple值變時banana也會變,同樣的banana值變時apple也會變
apple = 150;
Debug.Log("第一期:芒果價格:" + mango + "蘋果價格:" + apple + "香蕉價格:" + banana + "橘子價格:" + orange);
apple =ref mango;//apple只能和一個連接所以他會和apple斷開,但是接受連接(右邊)的變數可以連接多個。
apple = 100;
//mango = ref orange;不行
Debug.Log("第二期芒果價格:" + mango + "蘋果價格:" + apple + "香蕉價格:" + banana +"橘子價格:"+orange);
ref int watermelon = ref mango;//mango已經有mango了不過還是可以連結watermelon,所以修改一個值剩下的都會變
watermelon = 1000;
Debug.Log("第三期芒果價格:" + mango + "蘋果價格:" + apple + "香蕉價格:" + banana + "橘子價格:" + orange+"西瓜:"+watermelon);
apple = 345;
Debug.Log("第四期芒果價格:" + mango + "蘋果價格:" + apple + "香蕉價格:" + banana + "橘子價格:" + orange + "西瓜:" + watermelon);
mango = 111;
Debug.Log("第五期芒果價格:" + mango + "蘋果價格:" + apple + "香蕉價格:" + banana + "橘子價格:" + orange + "西瓜:" + watermelon);
//
第一期:芒果價格:0蘋果價格:150香蕉價格:150橘子價格:20
第二期芒果價格:100蘋果價格:100香蕉價格:150橘子價格:20
第三期芒果價格:1000蘋果價格:1000香蕉價格:150橘子價格:20西瓜:1000
第四期芒果價格:345蘋果價格:345香蕉價格:150橘子價格:20西瓜:345
第五期芒果價格:111蘋果價格:111香蕉價格:150橘子價格:20西瓜:111
}
}
in
功用:它會使形式參數成為引數的別名,其必須為變數,in 引數不能被呼叫的方法修改
限制:您不可為下列幾種方法使用 in、ref 和 out 關鍵字:1.使用
async 修飾詞定義的 async 方法。
2.迭代器方法,其包括 yield return 或yield break 陳述式。
3.擴充方法的第一個參數不能具有修飾符in,除非該參數是結構。
4.擴充方法的第一個參數,其中該參數是泛型型別(即使該類型被約束為結構)。
public void Initialization_A(in string equipment_name,in int attack_number,in int money_number)
{
equipment_name = "null";
attack_number = 0;
money_number = 0;//不行這樣做他時能做
}
out
功用:它會使形式參數成為引數的別名,其必須為變數。 換句話說,參數上的任何作業都會在引數上進行//和ref一樣,不一樣的是out不需要初始化,需要先指派值給被呼叫的方法,方法才能傳回
限制:
1.ref和out不能同時多載
2.屬性不是變數,因此無法做為 out 參數傳遞
3.您不可為下列幾種方法使用in、ref 和out 關鍵字:
1.使用
async 修飾詞定義的 async 方法。
2.迭代器方法,其包括 yield return 或yield break 陳述式。
4.此外,擴充方法具有以下限制:
1.關鍵字out不能用於擴充方法的第一個參數。 2.ref當參數不是結構,或者泛型類型不受約束為結構時,關鍵字不能用於擴展方法的第一個參數。3.除非in第一個參數是結構,否則無法使用關鍵字。in關鍵字不能在任何泛型類型上使用,即使約束為結構。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Exercisc : MonoBehaviour
{
public void Initialization_A(out string equipment_name,out int attack_number,out int money_number)
{
equipment_name = "null";
attack_number = 0;
money_number = 0;
}
public void Initialization_B( string equipment_name, out int attack_number, out int money_number)
{
equipment_name = "null";
attack_number = 1;
money_number = 1;
}
public void Display(string equipment_name, int attack_number, int money_number)
{
Debug.Log("裝備" + equipment_name + "攻擊力" + attack_number + "價值" + money_number);
}
void Start()
{
string equipment;
int attack, money;
Initialization_A(out equipment, out attack,out money);
Display( equipment, attack, money);//裝備null攻擊力0價值0
equipment = "小刀";
Initialization_B( equipment, out attack, out money);//沒有out就只會參考值
Display(equipment, attack, money);//裝備小刀攻擊力1價值1
}
}
params
功用:使用 params 關鍵字,您可以指定方法參數,其採用可變數目的引數
限制
1.參數類型必須是單維陣組。
2.在方法宣告中,params 關鍵字後面不允許任何其他參數
3.而且方法宣告中只允許一個params 關鍵字
4.使用params參數呼叫方法時,可以傳遞:1.陣列元素類型的參數的逗號分隔清單。2.指定類型的參數陣列。3.無引數。 如果不傳送任何引數,params清單的長度為零。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Exercisc : MonoBehaviour
{
public class Equipment_obj
{
public Equipment_obj(string name, int attack,int money)
{
equipment_name = name;
attack_number = attack;
money_number = money;
}
public string equipment_name;
public int attack_number;
public int money_number;
}
public void Make( params Equipment_obj[] equip)
{
for (int i = 0; i < equip.Length; i++)
{
Debug.Log("獲得裝備"+equip[i].equipment_name +"攻擊力"+ equip[i].attack_number+"價值"+ equip[i].money_number);
}
}
void Start()
{
Equipment_obj[] equipment = { new Equipment_obj("刀子",10,100), new Equipment_obj("罐子",1,10), new Equipment_obj("石頭",5,50) };
Make(equipment);//可以現實例Equipment_obj陣列在代入
Make(new Equipment_obj("鏟子",15,150), new Equipment_obj("斧頭", 50, 500));//也可以在方法上實例
//結果
獲得裝備刀子攻擊力10價值100
獲得裝備罐子攻擊力1價值10
獲得裝備石頭攻擊力5價值50
獲得裝備鏟子攻擊力15價值150
獲得裝備斧頭攻擊力50價值500
}
}