按自己的想法去理解事件和泛型(C )

2021-09-22 09:55:31 字數 3705 閱讀 6608

不喜歡官方的表達方式,喜歡按照自己的想法去理解一些抽象的東西,我是乙個喜歡簡單怕麻煩的人。

考慮到委託使用的一些缺陷,就有了事件。委託是不安全的,打個比方,如果把委託當作共有字段,那麼事件就相當於是屬性的概念。

事件就是被限制使用的委託變數,事件裡面封裝了乙個多播委託。

事件語法:public event 委託型別 事件名;

事件的作用:事件的作用與委託變數一樣,只是功能上比委託變數有更多的限制。比如:只能通過+=或者-=來繫結方法。只能在類內部呼叫事件。

當乙個結果發生時,有可能引起另外的一些反應,這就好像因果關係。而事件則是這個因與果的內部聯絡。

事件的本質:委託的乙個例項,新增了event關鍵字修飾。

委託是一種型別,事件是委託型別的例項。

和委託的區別:

整個windows系統都是通過事件驅動的,事件都有觸發條件。

在webform或者winform中,我們經常看到:

private

void button1_click(object

sender, eventargs e)

上面是乙個按鈕的單擊事件。從上可以看到三個事件因素:

我們在winform中都是通過如下的方式來註冊事件的。

this.button1.click += new system.eventhandler(this.button1_click);
eventhandler就是乙個委託:

public

delegate

void eventhandler(object sender, eventargs e);

這也就是為什麼我們註冊的事件總是有sender和e這兩個引數,因為委託就是這樣宣告的。我們來自定義乙個事件:

public

event

eventhandler onsay;

public

form1()

void form1_onsay(object

sender, eventargs e)

我們通過reflector工具來檢視:

事件onsay中,其實是2個方法,我們來看下原始碼:

public

void

add_onsay(eventhandler value)

while (onsay !=handler2);

}public

void

remove_onsay(eventhandler value)

while (onsay !=handler2);

}

這裡可以看出對事件的操作,其實最終還是體現在對委託的操作。

為什麼要有泛型?

更好的實現**復用,但是它不是通過物件導向的思想來實現**復用。物件導向慣用的三板斧:封裝、繼承、多型。

我們先來看一下**,假設在乙個類中有多個方法,他們的操作很類似,可能僅僅只是傳入的引數型別不同而已

using

system;

namespace

genericsdemo

",i.gettype()));

}public

void strshow(string

s)

", s.gettype()));}}

}

如果乙個類中存在多個這樣的方法,我們總不能把所有的方法都這麼寫一遍吧,有沒有一種方式來將這些方法進行合併呢?

這個時候我們會想到object是任何型別的父類,任何父類出現的地方,都可以使用子類來代替。接下來,我們來改造一下**實現:

public

void objshow(object

obj)

", obj.gettype()));

}

我們來看下呼叫:

方法是合併了,但是現在存在什麼樣的問題?出現了裝箱拆箱,嚴重影響效能。而且不夠安全,因為如果當我把**進行如下修改時,會發生什麼

public

void objshow(object

obj)

", obj.gettype()));

console.writeline(string.format("

objshow方法,引數型別,引數值

", obj.gettype(),convert.toint32(obj)));

}

呼叫**:_methodtest.objshow("a");

編譯時不會報錯,但是執行時就報錯了。也就是說通過

object

來作為引數傳遞,其實是存在嚴重的安全隱患的。

那麼有沒有什麼辦法來解決這兩個問題呢?

c#2.0

泛型的出現正是基於這樣的需求。

呼叫**:_methodtest.genericsshow(1);

這樣依賴,泛型方法在申明的時候能夠實現類似於objet的效果,在呼叫時先確定型別,這樣就達到了安全檢查的目的。

泛型就像是使用了乙個型別佔位符,而這一特性在使用集合時更能體現其強大之處。

也正是由於泛型太強大了,強大得像孫悟空一樣,我們需要弄一道緊箍咒來對其進行束縛,否則不容易控制。這時,就有了泛型約束,它在泛型方法或者泛型委託宣告之時就對其進行限定。限定關鍵字通過where。

public

class

student

}public

void studentshow(t t) where

t : student

", t.gettype()));

}public

void genericsshow(t t)

", t.gettype()));

}public

void genericsshow(t t)

", t.gettype()));

}

需要注意的是,這裡使用了泛型過載,這個時候編譯是可以正常通過的,可是注意了,呼叫的時候就出現問題了

為什麼會這樣呢?因為泛型的型別引數在編譯器並不能確定其型別,而過載時進行型別檢查傳送在例項方法被呼叫時。

同時需要注意的是,當一般方法和泛型方法同時呼叫時,優先選擇一般方法,因為編譯器會進行型別推斷。

泛型的運用遠不止於此,它還支援泛型繼承、泛型介面、泛型類、泛型委託等。

C 泛型自己的理解和總結

萬事開頭難,今天先從隨筆開始,記錄工作中平時不太注意到的知識點。今天開始說下泛型。泛型在我們專案中很是常見,使用很廣泛,我覺的它有以下幾個優點。1.安全性。2.效能。3.二進位制 的重用。4.的擴充套件。下面從 方面分析下這些優點。1.安全性。這段 只有執行起來的時候才會報錯,秉著錯誤得先發現的原則...

java學習篇 用我自己的方式理解事件

用我自己的方式理解事件。每個物件都有它的堆疊和執行空間,以及相應的表結構。表中記錄有與該物件有關的資訊。而所謂的給某乙個源物件註冊乙個事件,其實就是 在給物件的相應的表結構中,新增 事件a 事件a的處理方法的函式入口位址 於是,當乙個事件a,產生時,那麼,給物件通過查表,可以看到該事件a的處理方法函...

c 對於委託,事件,泛型的理解

1.委託 我對委託的理解是乙個公共資源,可以把委託比作外賣小哥,外賣小哥可以幫商家a送貨,也可以幫商家b送貨,並且這些商家也不需要知道買他們東西的人的住址,這個送貨的過程就是交給外賣小哥去做的。這樣的話,分工很明確,自然整個過程的效率也提高了。委託是一種型別 委託型別 同意需要定義,例項化,之後才能...