委託常常和事件在一起使用,可以理解委託是方法的容器,事件則是委託的另一種表現形式。委託和事件雖然寫得還比較多,不過也只是用的熟練而已,趁週末沒課好好鞏固下基礎,一點一點積累吧。
1.乙個簡單的小例子
class上面的**應該很好理解,但是在starteat方法並不知道什麼時候該呼叫哪個方法進行輸出,因此在呼叫之前還需要定義乙個列舉eatwhat來進行判斷,也就是starteat(string str,eatwhat eatwhat)。傳入的eatwhat列舉判斷是吃蘋果還是梨子。但是這種寫法擴充套件性太差了,如果再加乙個吃西瓜的方法,那麼還要更新列舉,這樣反覆的增加方法和列舉顯然不是乙個很好的做法。program
}class
people
public
void eatpear(string
s)
public
void starteat(string
str)
}
顯然這裡要使用委託,為什麼要使用委託?最本質的原因是利用委託可使starteat得到乙個引數,而這個引數是方法,這樣我們想呼叫什麼就可以呼叫什麼了。
class2.多播委託program
}public
delegate
void eatdelegate(string
name);
class
people
public
void eatpear(string
s)
public
void starteat(string
str,eatdelegate eatdelegate)
}
委託的特殊之處在於,我們以前定義的所有物件都包含資料,而委託包含的只是方法的位址。在上面例子的基礎上,我們還可以實現多播委託。多播委託就是講多個方法賦給同乙個委託,當呼叫這個委託的時候,將依次呼叫其繫結的方法。下面是對program類的改動。
class3.委託和事件program
}
在上面的例子中,我們給starteat方法傳參時需要傳入2個引數,而且還需要在main方法中得到委託物件。因此我們可以將委託封裝到people類裡面,使傳參時只傳入乙個引數,這就是用到了封裝的思想。
class現在我們的委託物件和一般的變數沒有什麼區別,外部類訪問到people物件就可以拿到這個委託變數。假如現在在類裡面宣告乙個字段,一般我們會封裝字段採用屬性。同樣的,對於委託我們也要封裝,這樣在類的內部,委託變數總是私有,但是在外部,依舊可以使用+=和-=的訪問操作。接下來我們對**進行改寫。program
}class
people
public
void eatpear(string
s)
public
void starteat(string
str)}}
C 基礎之委託
因為委託也是面試常常問道的問題,分享一下我的理解。為什麼使用委託。delegate void mydelegate 定義委託 mydelegate md 宣告委託 md new mydelegate obj.method 委託的例項化 mymethod d 把引數傳遞給方法 委託把方法當做引數傳到另...
c 之基礎委託非同步
大家知道委託就相當於c 裡面的函式指標,相信大家都很很了解,看看如下簡單 來回想一下委託 public delegate void ad xu xus new xu ad b new ad xus.add b xus.ex b console.readline class xupublic void...
c 基礎之Action T 委託
當要把方法傳給其他方法時,需要使用委託。委託實現為派生自基類system.multicastdelegate類,system.multicastdelegate類又派生自基類system.delegate.當前使用場景是資料庫上下文登錄檔時,在底層已註冊框架的基礎資料表,導致業務系統需要傳入dbmo...