創作內容

2 GP

Unity C# ?、?.、??=、?:、throw、ref、in、out、params 功能說明

作者:蝦米coco│2020-05-31 16:13:48│巴幣:4│人氣:763
?

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 structreadonly ref struct

限制:
1.ref和in在使用前要先初始化,而out不需要
2.如果類型的兩個成員之間,唯一的區別在於其中一個有ref 參數,而另一個有out 或 in 參數,則會發生編譯器錯誤
3.但如果一種方法有refinout 參數,而另一種方法有實值參數,則可以對方法進行多載
4.不可為下列幾種方法使用 refinout 關鍵字
1.使用 async 修飾詞定義的 async 方法
2.迭代器方法,其包括 yield returnyield 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.ValueTypeSystem.Object
5.ref結構不能是類型參數。
6.ref lambda 運算式局部函數無法捕獲結構變數。
7.ref結構變數不能在async方法中使用。 但是,您可以在同步方法ref中使用結構變數,例如,在返回TaskTask<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 引數不能被呼叫的方法修改
限制:
您不可為下列幾種方法使用 inref 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.您不可為下列幾種方法使用inref 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
    }
}

引用網址:https://home.gamer.com.tw/TrackBack.php?sn=4800999
All rights reserved. 版權所有,保留一切權利

相關創作

留言共 0 篇留言

我要留言提醒:您尚未登入,請先登入再留言

2喜歡★pk123634 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:風車... 後一篇:Unity C# rea...

追蹤私訊切換新版閱覽

作品資料夾

shane8124各位帥哥美女們
新聞學院的戀愛預報 112#開學前夕 更新看更多我要大聲說昨天20:00


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】