創作內容

1 GP

Unity C# 事件 功能說明

作者:蝦米coco│2020-05-23 15:25:14│巴幣:2│人氣:542
事件(可以標記為公共、私有、受保護、內部、受保護的內部或私有保護)
也可附加抽象、虛擬、靜態、密封
簡單說事件是建立在委派的語言支援上
事件一種物件廣播有事發生的方式。 任何其他元件皆可以訂閱事件,並在引發事件時收到通知。
1.通常事件長這樣
EventArgs需要有using System;

public event EventHandler<FileListArgs//類別要繼承 EventArgs才可使用>//已經定義好的委派Progress;
//不用在打public delegate void EventHandler<FileListArgs>(object sender, SampleEventArgs e);
可是要使用+=有(object sender, SampleEventArgs e)方法才能載入方法
2.可使用Progress?.Invoke(this, new FileListArgs(file)//放類別的);引發事件

3.使用+= 運算子訂閱事件和-=退訂

4.通常的命名首碼"On"後跟事件名稱,若要引發事件,您會加入標記為 protected virtual ProtectedOverridable (Visual Basic) 的方法

5.事件以委派為基礎,而且是多點傳送的委派

6.可以使用Lambda建立
EventHandler<FileFoundArgs> onFileFound = (sender, eventArgs) =>{    Console.WriteLine(eventArgs.FoundFile);    filesFound++;};fileLister.FileFound += onFileFound;

7.如果使用了 Lambda 的主體的缺點
   1.移除就無法正確運作。 它會有不同的委派執行個體,不以無訊息模式執行任何動作。
   2.在類別之外的程式碼無法引發事件,也不能執行任何其他作業。

8.void OnEventRaised(object sender, EventArgs args);
如果事件種類不需要任何其他參數,您仍將同時提供這兩個參數。 您應該使用特殊值 EventArgs.Empty 來表示您的事件不包含任何額外的資訊。

9.您不應該將  class (參考型別) 變更為 struct (實值型別)。 這是因為處理取消的通訊協定需要以傳址方式傳遞事件引數。 如果進行了相同的變更,則檔案搜尋類別永遠不會觀察到任何事件訂閱者所做的任何變更。 新的結構複本會用於每個訂閱者,且該複本和檔案搜尋物件看到的複本不同。

10.甚麼時候使用委派
1.如果您的程式碼必須呼叫訂閱者所提供的程式碼,則應該使用以委派為基礎的設計
2.必須將電腦函式提供給您使用List.Sort() 所建置的程式碼,才能適當地排序項目。
3. 必須提供具有委派的 LINQ 查詢,才能判斷要傳回的項目
     甚麼時候使用事件
1.如果您的程式碼可以完成其所有工作,而不需要呼叫任何訂閱者,則應該使用以事件為基礎的設計
2.請考量Progress 事件。 它會報告工作的進度。 不論是否有任何接聽程式,工作都會繼續進行。FileSearcher 是另一個範例。 它仍然會搜尋並尋找所有看到的檔案,即使未附加任何事件訂閱者也是一樣。 UX 控制項仍然會正常運作,即使沒有任何訂閱者接聽事件也是一樣。 它們都會使用以事件為基礎的設計。

11.事件通常是公共類成員。 相比之下,委託通常作為參數傳遞,並存儲為私有類成員(如果它們全部存儲)。

12.事件可使用 static 關鍵字宣告為靜態事件。 這可隨時向呼叫端提供事件,即使沒有任何類別執行個體存在

13.自訂事件資料類別名稱應該以 EventArgs結尾,並且繼承EventArgs

14.事件屬性會比事件欄位來得慢些,因為每個事件委派都必須先擷取,然後才能夠叫用。 記憶體和速度之間會有所折衷。 如果您的類別定義許多不常引發的事件,您會想要實作事件屬性
internal(可加在屬性、方法、類別、事件)
作用:宣告為內部存取,只有內部類型或成員只能在相同組件的檔案內存取

使用事件屬性處理多個事件//事件屬性需要使用到EventHandlerList


  1. 定義在類別中引發事件的委派集合。
  2. 定義每個事件的索引鍵。
  3. 在引發事件的類別中定義事件屬性。
  4. 使用委派集合實作事件屬性的 add 和 remove 存取子方法。
  5. 使用公用事件屬性,在處理事件的類別中新增和移除事件處理常式委派。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class Exercisc : MonoBehaviour
{
     void Start()
    {
        MyClass my = new MyClass(new MoneyClassEventArgs(300,400,500));
        my.Money_change += OnAddMoney;
        my.Money_change += OnSum;
        my.OnEvent();
        Debug.Log("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~1");
        my.Money_change += OnAddMoney;
        my.OnEvent();
        Debug.Log("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2");
        my.Money_change -= OnAddMoney;
        my.OnEvent();
        my.Money_change += OnAddMoney;
        Debug.Log("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~3");
        my.Money_change -= OnSum;
        my.OnEvent();
//結果
A:=300B:=400C:=500
A+B+C=1200
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~1
A:=300B:=400C:=500
A+B+C=1200
A:=300B:=400C:=500
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2
A:=300B:=400C:=500
A+B+C=1200
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~3
A:=300B:=400C:=500
A:=300B:=400C:=500

    }

    private void OnAddMoney(object sender,MoneyClassEventArgs my_money)
    {
        Debug.Log("A:=" + my_money.a_money + "B:=" + my_money.b_money + "C:=" + my_money.c_money);
    }
    public void OnSum(object sender,MoneyClassEventArgs my_money)
    {
        Debug.Log("A+B+C=" +(my_money.a_money+ my_money.b_money+ my_money.c_money) );
    }
}
public class MyClass
{
    public event EventHandler<MoneyClassEventArgs> Money_change;
    public MoneyClassEventArgs money_num;
    public MyClass(MoneyClassEventArgsmoney)
    {
        money_num= money;
    }
    public//觸發事件本來要是protected的但是這樣不能調用讓我偷懶一下 virtual void OnEvent()
    {
        Money_change?.Invoke(this, new MoneyClassEventArgs(money_num.a_money, money_num.b_money, money_num.c_money));
    }
}
public class MoneyClassEventArgs: EventArgs
{
    public int a_money { set; get; }
    public int b_money { set; get; }
    public int c_money { set; get; }
    public MoneyClassEventArgs(int a,int b, int c)
    {
        a_money = a;
        b_money = b;
        c_money = c;
    }
}
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=4792090
All rights reserved. 版權所有,保留一切權利

相關創作

留言共 0 篇留言

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

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

前一篇:石頭一顆... 後一篇:Unity C# is、...

追蹤私訊切換新版閱覽

作品資料夾

robert286 ლ(´•д• ̀ლ
ლ(´•д• ̀ლ看更多我要大聲說9小時前


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

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