【Kotlin填坑-03】類訪問器get和set :不要自己調用自己啊!
閱讀本文大約需要2.3333分鐘,來看Kotlin的同學們請看第三段代碼即可。
另外本文以及代碼可能(劃掉)、一定會引起C#使用者的不適。請閱讀後(劃掉)、直接進行批判。
由於我自己學習的課程的原因,不得不用起了C升這門語言(畢竟C#的那個#是音樂的升音符,以此表示對這門語言的不滿)
畢竟 @金旭亮 金老師曾說過Kotlin一些特性C#不是都有嗎有什麼好高興的呢。我就懷著寫Kotlin的心寫起了C#。。。
由於不了解C#,然後我就出現了問題,具體代碼:【.NET 4.5】
【為了照顧C升廚我特地在知乎編輯器裡面按了回車。我VS裡面是直接把左大括弧的換行關掉了,還特地把大寫的string改成了小寫】
class WeatherInfo n{n public string pathPrefix = "../../weather/";n public string picPath1 n { n get { return picPath1; } n set { picPath1 = pathPrefix + value; } n }n}n
給我報了一個StackOverflowException。
嗯很好。。。知乎編程組的大佬馬上跟我說這是遞歸調用然後炸了。
我不信邪啊。我在Kotlin裡面寫好好的呢怎麼在C升裡面就不行了?垃圾語言(滑稽)
我在想我熟悉的Kotlin好像不存在這樣的問題。
然後我就抄過來寫了這麼一個代碼:
class WeatherInfo {n var pathPrefix = "../../weather/"n var picPath1: String?n get() = picPath1n set(value) {n picPath1 = pathPrefix + valuen }n}n
一運行……
--大忽悠他腿咋麻了?
--你跺你也麻!
爆棧什麼的妥妥的!
哪裡不對勁?打鐵還需自身硬!Kotlin的get set可不是像上面那麼寫噠!
寫著寫著就把field這東西給忘了。
正確的內容:(當然也可以把get的時候拿來當做添加prefix)
class WeatherInfo {n var pathPrefix = "../../weather/"n var picPath1:String?=""n get()=fieldn set(value) {n field = pathPrefix + valuen }n}n
因為Kotlin有field做「緩衝」啊。這一點就比C升不知道高到**去了?【如果C#也有類似的field寫法請務必讓我改正嘲諷的心態】
查閱了一些資料後:
我想懟一下這篇文章最後的那段代碼c# 3.0 get set 默認值。居然和我一樣的作死??這和我寫的道理一樣啊,這麼寫不遞歸爆棧有鬼了好嗎?看了一下居然是2016年的文章。難不成.NET3.5的這麼寫就能運行?
public string test { n get n { n if (test == null) n { n return "默認值"; n } n else n { n return test; n } n } n set { test = value; } n } n
本著科學的態度我還特地用3.5開了一個工程。一運行。哇,果斷爆棧。批判一番。
查閱了一些資料發現C#你得多些一個private屬性拿來「緩衝」【如果C#也有類似的field寫法請務必讓我改正嘲諷的心態】
最後就整出了一個寫法……沒有field的情況下總感覺多此一舉啊。
class WeatherInfo n{n public string pathPrefix = "../../weather/";n private string _picPath1;n public string picPath1 n { n get { return _picPath1; } n set { _picPath1 = pathPrefix + value; } n }n}n
我愛Kotlin
以上得死。
推薦閱讀:
※這樣理解面向對象的封裝,繼承,多態是否正確?
※如何理解「在面向對象編程的時候,方法或者函數的參數最好是介面或者抽象類」?
※封裝和抽象的區別是什麼?
※怎麼通俗的解釋COM組件?
