委託知識整理筆記
一、委託基礎
1.1 委託是什麼
與類、列舉、結構、介面一樣,委託也是一種型別。類是對物件的抽象,委託是對函式的抽象。乙個委託代表了具有相同引數列表和返回值的(具有相同簽名(signature))所有函式。
1.2 為什麼要使用委託?能給我帶來哪些好處?
有時在程式設計時,某個方法在執行時可能需要根據不同情形做不同處理並且這些情形根據時間可能還會有變動,所以這部分**沒法寫死。所以c#就設計了委託來處理這些情形,將這些變化不定的細節交由委託來處理,委託來**多個類似的處理方法。
這樣使用委託方法作為方法引數的做法,具體執行細節由被**方法完成的方式。可以避免在程式中大量使用if-else(switch)判斷語句,同時使得程式具有更好的可擴充套件性。
1.3 如何使用?使用方法步驟有哪些呢?
e.g:
1上面寫法是一種形式(靜態方法或例項方法),下面兩種方式也可實現://第一步.宣告乙個委託23
delegate
int delegateadd(int a, int
b);4
5public
class
test67
2122}23
24//
入口類25
26public
class
testb
2728
4546 }
匿名方法:
delegateadd da = delegate(int a, int b)
public
static
void g(string
s)
public
static
void
test()
}幾個常用泛型委託
action是無返回值的泛型委託,這個委託類存在不同的變體,至少0個引數,至多16個引數;
func是必須有返回值t的泛型委託,也存在不同的變體,至少0個引數,至多16個引數;
predicate 是返回值為bool的泛型委託,只有1個引數;表示定義一組條件並確定指定物件是否符合這些條件的方法。此委託由 array 和 list 類的幾種方法使用,用於在集合中搜尋元素。
public二、委託的同步呼叫、非同步呼叫與非同步**class
delegateclass
public
static
void print(t v)
public
static
int add(int a, int
b)
public
static
double addtow(double
a)
public
static
void
test()
;predicate
p= new predicate((v) =>v< 5
);
var lessthanfive=list.find(p);
if (lessthanfive!= 0
)
predicate
p1= new predicate((v) =>v>= 11
);
int notlessthanten=list.find(p1);
if (notlessthanten!= 0
)
else}}
同步呼叫
以上介紹的委託呼叫方法都是同步呼叫。其實也可以invoke方法用來進行同步呼叫。
如:f1.invoke(1,2);同步呼叫也可以叫阻塞呼叫,它將阻塞當前執行緒,然後執行呼叫,呼叫完畢後再繼續向下進行。如果是要呼叫一項耗時操作,可能會讓程式停頓很長時間,造成糟糕的使用者體驗,這時候非同步呼叫就很有必要了。
非同步呼叫
非同步呼叫不阻塞執行緒,而是把呼叫塞到執行緒池中,程式主線程或ui執行緒可以繼續執行。委託的非同步呼叫通過begininvoke和endinvoke來實現。
public執行結果:static
void printlist(listl)
}public
static
void
test()
;action
int>>aclist=printlist;
aclist.begininvoke(list,
null,null
); system.threading.thread.sleep(
600);
console.writeline(
"其他方法
");
aclist.endinvoke(result);
console.writeline(
"其他操作");
}
可以看到,主線程並沒有等待,而是直接向下執行了。但是問題依然存在,當主線程執行到endinvoke時,如果這時呼叫沒有結束(這種情況很可能出現),這時為了等待呼叫結果,執行緒依舊會被阻塞。
非同步**
用**函式,當呼叫結束時會自動呼叫**函式,解決了為等待呼叫結果而讓執行緒依舊被阻塞的局面。
public執行結果:static
void printlist(listl)
}static
void
mycallback(iasyncresultresult)
public
static
void
test()
;action
int>>aclist=printlist;
iasyncresultresult=aclist.begininvoke(list, new
asynccallback(mycallback), aclist);
system.threading.thread.sleep(
600);
console.writeline(
"其他方法");
console.writeline(
"其他操作");
}
三、應用場景
委託可應用於observer模式(觀察者模式)、子視窗傳值、非同步更新主介面(如:進度條)等。
以winform進度條為例:
namespace delegatetestpublic void progressbardel(progressbar pb, int position)
else
} private void mainform_load(object sender, eventargs e)
void progressthread()}}
}
c 委託事件整理
1.委託從字面上理解就是一種 類似於房屋中介,由租房人委託中介為其租賃房屋 委託是一種引用型別,雖然在定義委託時與方法有些相似,但不能將其稱為方法。下面定義乙個int型別兩個int引數的委託 定義委託 返回型別int,兩個引數為int public delegate int fun int a,in...
C 委託知識總結
1.什麼是委託,為什麼要使用委託 我正在埋頭苦寫程式,突然想喝水,但是又不想自己去掉杯水而打斷自己的思路,於是我就想讓女朋友去給我倒水。她去給我倒水,首先我得讓她知道我想讓她幹什麼,通知她之後我可以繼續寫自己的程式,而倒水的工作就交給了她。這樣的過程就相當於乙個委託。在程式過程中,當程式正在處理某個...
筆記 關於網路程式設計的知識整理
說起網路程式設計,首先得從計算機網路組成結構的開始講起。先回顧一下大學的計算機基礎知識,網路結構組成主要由 1 計算機系統和終端 計算機系統和終端提供的網路服務,通俗易懂的講就是網路基礎設施建設 2 通訊處理機 粗暴的解釋就是計算機網絡卡 3 通訊線路和通訊裝置 網線 雞毛無線 wifi 等 4 作...