System.Linq捉虫记 | 论变量命名的重要性
生活随笔
收集整理的這篇文章主要介紹了
System.Linq捉虫记 | 论变量命名的重要性
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言
下面這段代碼,你能發現什么問題嗎?
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的輸出結果嗎?
是4 5 4 5還是4 5 14 15?
其實答案是:
你沒看錯,第2次會出現3個元素。
原因
這并不是我們的代碼有問題,而是System.Linq的Bug。
我們直接調試了dotnet/runtime源代碼,發現調用TakeLast時生成了ListPartition對象:
關鍵是_maxIndexInclusive賦值是5(Count),按我的理解不應該是4(Index)嗎!?
這就導致了下面的問題,當我們增加了元素后,它是這樣計算的:
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結論
我懷疑,這是由于2個程序員分別實現的功能,導致對變量名含義理解不一致造成的BUG。
這也說明,起個意義明確的變量名是多么重要啊!
總結
以上是生活随笔為你收集整理的System.Linq捉虫记 | 论变量命名的重要性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#基础:理解装箱与拆箱
- 下一篇: .Net之SoapCore简单使用