System.Linq捉虫记 | 论变量命名的重要性
生活随笔
收集整理的這篇文章主要介紹了
System.Linq捉虫记 | 论变量命名的重要性
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
前言
下面這段代碼,你能發(fā)現(xiàn)什么問題嗎?
List<int>?a?=?new?List<int>{?1,?2,?3,?4,?5?};var?last2?=?a.TakeLast(2);foreach?(var?item?in?last2) {?Console.WriteLine(item); }a.AddRange(new[]?{?11,?12,?13,?14,?15?});foreach?(var?item?in?last2) {Console.WriteLine(item);? }你能說出2次Console.WriteLine的輸出結(jié)果嗎?
是4 5 4 5還是4 5 14 15?
其實答案是:
你沒看錯,第2次會出現(xiàn)3個元素。
原因
這并不是我們的代碼有問題,而是System.Linq的Bug。
我們直接調(diào)試了dotnet/runtime源代碼,發(fā)現(xiàn)調(diào)用TakeLast時生成了ListPartition對象:
關(guān)鍵是_maxIndexInclusive賦值是5(Count),按我的理解不應(yīng)該是4(Index)嗎!?
這就導(dǎo)致了下面的問題,當(dāng)我們增加了元素后,它是這樣計算的:
private?int?Count {get{int?count?=?_source.Count;if?(count?<=?_minIndexInclusive){return?0;}return?Math.Min(count?-?1,?_maxIndexInclusive)?-?_minIndexInclusive?+?1;} }在這里,_maxIndexInclusive又是按Index理解的:
Math.Min(count?-?1,?_maxIndexInclusive)?-?_minIndexInclusive?+?1如果還是將_maxIndexInclusive按Count理解,就是正確的了:
Math.Min(count,?_maxIndexInclusive)?-?_minIndexInclusive結(jié)論
我懷疑,這是由于2個程序員分別實現(xiàn)的功能,導(dǎo)致對變量名含義理解不一致造成的BUG。
這也說明,起個意義明確的變量名是多么重要啊!
總結(jié)
以上是生活随笔為你收集整理的System.Linq捉虫记 | 论变量命名的重要性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#基础:理解装箱与拆箱
- 下一篇: iNeuOS工业互联网,增加一批PLC、