![](/img/trans.png)
[英]Is it ok to use a reference return of the converted pointer's value in C#?
[英]C# Delegate Use Object field's value without reference
我有一個在運行時定義的委托。 我希望它檢查字典是否包含特定鍵。 委托參數之一是對字典的ref
,因此字典始終是最新版本(而不是凍結副本)。
然而,關鍵是查找的object
領域,但我不想給它傳遞ref
到該對象。 我只想獲取字段值並像使用常量(凍結副本)一樣使用它。
這是確切的代碼段。 我將引用傳遞給netController,這使我可以使用ContainsID()
檢查是否存在某些內容。 ID參數來自msg
對象,但是我只想使用該值而不引用容器對象。
Func<netController, bool> resolveFunc = delegate (netController nc)
{
return nc.ObjectRegister.ContainsID(msg.parentObjectID);
};
nc
在此委托范圍內,但msg
不在范圍內。 這是可行的,還是所有內容都需要作為參數傳遞?
注意:我說的是字典,但實際上是一個類似字典的對象。 ContainsID()
是用於一個包裝ContainsKey()
不用擔心這部分。
這被委托稱為對變量的隱式捕獲,這絕對是可能的。
只要msg
不在創建委托的行的范圍內,C#就會捕獲它,並允許您在代碼內使用它:
Func<Controller,bool> MakeChecker(Message msg) {
return nc => nc.ObjectRegister.ContainsID(msg.parentObjectID);
}
上面的方法從創建委托的上下文中隱式捕獲msg
,而不是將其作為委托參數傳遞。 我使用lambda語法代替了匿名委托語法:
Func<Controller,bool> MakeChecker(Message msg) {
return delegate (netController nc) {
return nc.ObjectRegister.ContainsID(msg.parentObjectID);
}
}
如何將其存儲到委托中?
像這樣:
Message msg = ...
Func<Controller,bool> myChecker = MakeChecker(msg);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.