2 回答

TA貢獻(xiàn)1884條經(jīng)驗(yàn) 獲得超4個(gè)贊
期望您進(jìn)行如下設(shè)計(jì):
public async Task<IEnumerable<Ticket>> GetTicket(int id)
{
return await _memoryCache.GetOrCreateAsync(_cachingFunctionalty.BuildCachingName(id), entry =>
{
var localId = id;
entry.SlidingExpiration = TimeSpan.FromSeconds(10);
return GetTicket_uncached(localId);
});
}
現(xiàn)在您沒有可以在閉包范圍之外修改的變量,Re-sharper會(huì)發(fā)出警告,只要理論上有可能在正在執(zhí)行的閉包之外修改變量,從而導(dǎo)致不可預(yù)測(cè)的結(jié)果。同樣適用于其他方法。在實(shí)際操作中,您應(yīng)該對(duì)所有其他對(duì)象遵循相同的操作,可以在閉包范圍之外對(duì)其進(jìn)行修改,從而創(chuàng)建本地版本

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超4個(gè)贊
此消息來自“堆分配查看器”插件。創(chuàng)建lambda并傳遞Func
給時(shí)GetOrCreateAsync
,您要從調(diào)用方法(GetTicket
)中捕獲一些值,并在以后使用它們。
編譯此代碼時(shí),編譯器會(huì)將此lambda重寫為一個(gè)保存值的類,以及一個(gè)主體與lambda主體相同的方法,盡管它將使用在此新類中捕獲的值,而不是原始的方法調(diào)用。
堆分配查看器插件的意思是,在運(yùn)行時(shí)這里發(fā)生了隱藏分配-正在分配此新的編譯器生成的類,分配了值并調(diào)用了方法。
插件告訴您id
正在捕獲和分配此新類-在lambda中這很明顯,因?yàn)槟诖a中看到了它。但是您也正在捕獲this
,因?yàn)樗?code>GetTicket_uncached是一個(gè)實(shí)例方法而不是靜態(tài)方法。沒有this
,您將無法調(diào)用實(shí)例方法,因此id
和this
都將在編譯器生成的類中被捕獲和分配。
您無法擺脫id
變量的分配,但是this
如果您將其GetTicket_uncached
設(shè)為靜態(tài),則可以擺脫引用(但這可能需要傳入ServiceAddress
,在這種情況下,堆分配查看器會(huì)告訴您您正在關(guān)閉分配現(xiàn)在id
和ServiceAddress
)。
您可以在ReSharper幫助頁面中看到有關(guān)“隱式捕獲關(guān)閉”警告的更多詳細(xì)信息。在討論不同的場(chǎng)景和警告消息時(shí),有關(guān)分配類以捕獲變量的背景詳細(xì)信息很有用。
- 2 回答
- 0 關(guān)注
- 191 瀏覽
添加回答
舉報(bào)