【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組件?

TAG:Kotlin | C# | 面向对象编程 |