public class Person {
private string name;
public string Name {
get { return name; }
set {
if (name != value) {
name = value;
OnNameChanged();
}
}
}
public event EventHandler NameChanged;
protected virtual void OnNameChanged() {
NameChanged?.Invoke(this, EventArgs.Empty);
}
}
在這個示例中,我們聲明了一個私有字段?_name
?作為存儲名稱的后端字段,并將其封裝在公共屬性?Name
?中。在 setter 方法中,我們首先檢查新值是否與舊值相同。如果不同,我們才更新存儲字段,并調(diào)用?OnNameChanged()
?方法來引發(fā)?NameChanged
?事件。
注意,OnNameChanged
?方法是使用?protected
?訪問修飾符進(jìn)行定義的。這允許在繼承類中覆蓋此方法,并添加進(jìn)一步的處理邏輯。在此方法中,我們通過執(zhí)行空檢查來安全地調(diào)用?NameChanged
?事件,以確保未向事件委托傳遞 null 引用。
現(xiàn)在,你可以訂閱?NameChanged
?事件,并在每次?Name
?屬性更改時收到通知:
var person = new Person();
person.NameChanged += (sender, e) => {
Console.WriteLine($"Name changed to: {((Person)sender).Name}");
};
person.Name = "Alice"; // "Name changed to: Alice" 將被輸出到控制臺
person.Name = "Bob"; // "Name changed to: Bob" 將被輸出到控制臺
在此例中,我們創(chuàng)建了一個新的?Person
?對象,并訂閱了其?NameChanged
?事件。然后,我們兩次設(shè)置該對象的?Name
?屬性,從而引發(fā)對應(yīng)的事件并顯示名稱已更改的消息。
這段代碼涉及以下知識點:
- 事件:
NameChanged
?是一個事件,它是?Person
?類中聲明的一個類型為?EventHandler
?的公共事件。通過這個事件,Person
?類向其他對象(比如現(xiàn)在正在編寫的代碼)通知其名稱屬性已更改。 - 匿名函數(shù):
=>
?符號后面跟著一段匿名函數(shù)表達(dá)式,它被傳遞給?NameChanged +=
?的右側(cè)。這個匿名函數(shù)接受兩個參數(shù)?sender
?和?e
,它們分別表示觸發(fā)事件的對象和事件數(shù)據(jù)。匿名函數(shù)的主體內(nèi)有一行代碼,輸出一個字符串,其中包含名稱屬性新的值,以及觸發(fā)事件的對象的名稱。 - 字符串插值(string interpolation):使用?
$
?符號將字符串格式化為帶大括號?{}
?的占位符,表示需要插入變量或表達(dá)式的位置。大括號內(nèi)的表達(dá)式是一個用圓括號括起來的成員訪問表達(dá)式,它在運行時被求職,用于獲取修改后的名稱屬性的值。
NameChanged += 的加號是什么意思?
+=
?表示向事件添加一個處理程序(event handler)。在這種情況下,它將匿名函數(shù)賦值給?NameChanged
?事件。當(dāng)?NameChanged
?事件被觸發(fā)時,事件發(fā)出通知以便所有已注冊的事件處理程序都能執(zhí)行其邏輯操作。通過使用?+=
?操作符,可以將多個事件處理程序添加到同一事件中,從而實現(xiàn)事件的多播 (Multicasting)。
public event EventHandler NameChanged; 這段代碼是什么意思?
這段代碼定義了一個?NameChanged
?事件,它使用?EventHandler
?委托來表示事件處理程序的方法。?EventHandler
?委托是 .NET 框架中預(yù)定義的一種類型,用于表示不接受任何參數(shù)并返回空值的方法。文章來源:http://www.zghlxwxcb.cn/news/detail-476386.html
此外,event
?關(guān)鍵字聲明了該字段為一個事件,該事件只能在類內(nèi)部被觸發(fā)和訂閱。 這意味著其他代碼無法直接觸發(fā)或調(diào)用該事件。 若要觸發(fā)該事件,必須通過調(diào)用它的公共方法來實現(xiàn)。 例如,在該類中可能有一個名為?OnNameChanged
?的保護(hù)虛擬方法,該方法會立即引發(fā)?NameChanged
?事件。 泛型版本的?EventHandler<TEventArgs>
?委托也可用于代替?EventHandler
?委托,以提供更強類型的事件參數(shù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-476386.html
到了這里,關(guān)于關(guān)于set變更通知涉及的一些知識點的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!