標籤:

NET Framework 為什麼只是重載了Double和Float浮點數的運算符?

為什麼.NET framework(本人用的4.7)中只是重載了double,float等浮點數相關的運算符,沒有重載int,long等;而且反編譯之後,我看不出這個重載有何意義?望大神解惑...


關鍵點在它上面的NonVersionableAttribute里。

https://github.com/dotnet/coreclr/blob/master/src/mscorlib/shared/System/Runtime/Versioning/NonVersionableAttribute.cs

該個Attribute的文檔描述如下:

The [NonVersionable] attribute is applied to indicate that the implementation of a particular member or layout of a struct cannot be changed for given platform in incompatible way.

This allows cross-module inlining of methods and data structures whose implementation is never changed in ReadyToRun native images. Any changes to such members or types would be breaking changes for ReadyToRun.

說的就是該個Attribute是為ReadyToRun這個功能服務的,你寫了這個標籤意味著你能夠保證你不會改變這個方法或者數據結構的實現。任何改變這個功能下就會是一個破壞性改變。

那麼這個ReadyToRun是什麼呢?其實它是C#生成本地代碼的一個技術約束。

https://github.com/dotnet/coreclr/blob/master/Documentation/botr/readytorun-overview.md

我們在他們的描述里可以看到,這個Attribute出現的緣由在Version Resilient Native Code Generation=&>Non-Virtual Method Calls - CALL=&>Performance Impact里。

這裡面在怎麼避免非虛函數調用帶來的跨版本氣泡式內聯的消耗里說到默認是不做跨版本氣泡式的內聯的,但是你要做你可以用這個Attribute表明你放棄了改變這個方法的權力,那麼這個方法就會被認為是一個重要的方法,那麼它就能被內聯。

所以這裡之所以做了這樣的決定,是為了保證這個ReadyToRun的功能下也有高效的實現,而Int32的整形應該是默認保證了這種行為,所以沒有被重寫。


推薦閱讀:

如何優雅地產生一組符合正態分布的隨機數?
如何看待PHP成為.NET的一門編程語言?
怎麼看待.net core 2.0發布?
為什麼大名鼎鼎的Spring在.NET平台上無以為繼?

TAG:C# | NETCore |