隐式类型转换中显式申明的非必要性
生活随笔
收集整理的這篇文章主要介紹了
隐式类型转换中显式申明的非必要性
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一直都會有意無意地使用到類型的轉換。int a = 5.23;string s = "abc" + intValue;也許在看書的時候你也會看到int a = (int)5.23;string s = "abc"+(string)intValue; 這樣的寫法。我想也應該會有很多人像我一樣想過這樣的顯式真是畫蛇添足了,當然我們可以選擇簡潔的隱式,也可以選擇看起來更專業一點的顯式。那么就僅此而以嗎,對的這里的效果確實如此,至少是表面上看起來一樣了。
????我也就這樣理解了,直到我看到一個顯式的轉換
namespace?test4
{
????public?class?Car
????{
????????private?int?speed?=?10;
????????public?Car()?{?}
????}
????public?class?ACar?:?Car
????{
????????public?int?speed?=?20;
????}
????class?Program
????{
????????static?void?Main(string[]?args)
????????{
????????????Car?a?=?new?ACar();
????????????ACar?b?=?(ACar)a;
????????????b.speed?=?30;
????????}
????}
} 很啰嗦的一堆不是么,我們只要看這個句就夠了
Car a = new ACar();
ACar b = (ACar)a;
b.speed = 30;
不知道你是如何來理解它的,不過告訴你它是可以正確運行的,或者你根本就沒看到有什么不對的,那么讓我們分析一下。
ACar繼承于Car,ACar也是一種Car,則ACar可以擁有Car的一切公有功能,還有除此之外的一些自己的功能,如果是這樣ACar a = new Car();一個Car對象當然只能運行Car的方法,如果給a一個ACar特有的消息,那就是一個子虛烏有的功能了,我們說這是一種不安全的賦值,在編譯器上是不可通過的。相反的Car a = new ACar()就是安全的。
又正如前面所說的ACar b = (ACar)a;把一個Car的對象賦值給ACar變量,那么它也算得是不安全的了,那又是否可以通過呢。這就是顯式也叫強制類型轉換的原因了,如果這樣,ACar b = a;那么不用運行了,編譯的時候就會返給你錯誤的(編譯器畢竟還不能如人一樣聰明到可以分析如此的復雜)。
我們這里也就是把一個ACar的對象賦值給一個Car指針,再被賦值給ACar指針,最后就是ACar b = new ACar();
????那么這么說來不是顯式的功能更強大么,為何又要沒有顯式的必要。我們應該都會知道一個道理--任何的好處都是要以犧牲別一部分為前提的,這里犧牲的就是安全性。如果在你不知道或者不能完全控制指針之間的確切關系的話,那就是一種很嚴重的潛在危險了。當然顯式轉換的錯誤在程序runtime里也會有檢測,但我想那并不是我們程序員想要的。
????所以我們有一個原則,那就是在類型中盡量使用隱式轉換,在實在有必要的地方才使用顯卡轉換。我相信就算是int a = (int)2.35在runtime里也會被加入了動態檢測的列隊,而這一切都是可以在編譯時就可以完成的。
????我也就這樣理解了,直到我看到一個顯式的轉換
namespace?test4
{
????public?class?Car
????{
????????private?int?speed?=?10;
????????public?Car()?{?}
????}
????public?class?ACar?:?Car
????{
????????public?int?speed?=?20;
????}
????class?Program
????{
????????static?void?Main(string[]?args)
????????{
????????????Car?a?=?new?ACar();
????????????ACar?b?=?(ACar)a;
????????????b.speed?=?30;
????????}
????}
} 很啰嗦的一堆不是么,我們只要看這個句就夠了
Car a = new ACar();
ACar b = (ACar)a;
b.speed = 30;
不知道你是如何來理解它的,不過告訴你它是可以正確運行的,或者你根本就沒看到有什么不對的,那么讓我們分析一下。
ACar繼承于Car,ACar也是一種Car,則ACar可以擁有Car的一切公有功能,還有除此之外的一些自己的功能,如果是這樣ACar a = new Car();一個Car對象當然只能運行Car的方法,如果給a一個ACar特有的消息,那就是一個子虛烏有的功能了,我們說這是一種不安全的賦值,在編譯器上是不可通過的。相反的Car a = new ACar()就是安全的。
又正如前面所說的ACar b = (ACar)a;把一個Car的對象賦值給ACar變量,那么它也算得是不安全的了,那又是否可以通過呢。這就是顯式也叫強制類型轉換的原因了,如果這樣,ACar b = a;那么不用運行了,編譯的時候就會返給你錯誤的(編譯器畢竟還不能如人一樣聰明到可以分析如此的復雜)。
我們這里也就是把一個ACar的對象賦值給一個Car指針,再被賦值給ACar指針,最后就是ACar b = new ACar();
????那么這么說來不是顯式的功能更強大么,為何又要沒有顯式的必要。我們應該都會知道一個道理--任何的好處都是要以犧牲別一部分為前提的,這里犧牲的就是安全性。如果在你不知道或者不能完全控制指針之間的確切關系的話,那就是一種很嚴重的潛在危險了。當然顯式轉換的錯誤在程序runtime里也會有檢測,但我想那并不是我們程序員想要的。
????所以我們有一個原則,那就是在類型中盡量使用隱式轉換,在實在有必要的地方才使用顯卡轉換。我相信就算是int a = (int)2.35在runtime里也會被加入了動態檢測的列隊,而這一切都是可以在編譯時就可以完成的。
轉載于:https://www.cnblogs.com/duchunwang/archive/2008/06/11/1217071.html
總結
以上是生活随笔為你收集整理的隐式类型转换中显式申明的非必要性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 外国wince学习论坛收集
- 下一篇: [原]当你用%查不到记录的时候怎么办?