C#很簡(jiǎn)單而又很經(jīng)典的一句代碼實(shí)例
一.知識(shí)點(diǎn)
二.問題
如果以上四個(gè)問題,你很自信,那么以下,您就不要看了,因?yàn)槲蚁胝f的東西真的很簡(jiǎn)單。
如果你開始懷疑自己,可以繼續(xù)向下看。你自己到底真的理解嗎???
再看下面這段代碼有沒有問題?
class Program { static void Main(string[] args) { Transform t = new Transform(); t.v.x = 1; t.ShowV(); Console.Read(); } } struct Vector { public float x; public float y; public float z; } class Transform { public Vector v { get; set; } public void ShowV() { Console.WriteLine(v.x+"..."+v.y+"..."+v.z); } }
如果你覺得沒有問題,那么你需要看看。這時(shí)候會(huì)編譯報(bào)錯(cuò),為啥,怎么回事。
第6行編譯報(bào)錯(cuò):
三.分析
如果你非常清楚屬性的本質(zhì)的話,那么上述代碼可以進(jìn)行轉(zhuǎn)換,將屬性轉(zhuǎn)換為普通方法。(屬性的本質(zhì)就是方法嘛)
class Program { static void Main(string[] args) { Transform t = new Transform(); t.GetVector().x = 1; t.ShowV(); Console.Read(); } } struct Vector { public float x; public float y; public float z; } class Transform { public Vector v; //set public void SetVector(Vector v) { this.v = v; } //get public Vector GetVector() { return v; } public void ShowV() { Console.WriteLine(v.x + "..." + v.y + "..." + v.z); } }
果然上述的改寫只是將屬性的寫法轉(zhuǎn)為本質(zhì)寫法-寫成兩個(gè)普通的方法。結(jié)果還是報(bào)一樣的編譯錯(cuò)誤。
,編譯報(bào)錯(cuò)提示還是一樣的CS1612
再修改一下
Transform t = new Transform(); // t.GetVector().x = 10; 這邊編譯報(bào)錯(cuò) Vector v2 = t.GetVector(); v2.x = 10; t.ShowV(); Console.Read();
編譯打印結(jié)構(gòu)是 0..0..0。
壓根就沒變,當(dāng)然沒有變啊,因?yàn)関2是副本,你更改的只是副本,并沒有改變t中的v,同理,通過t.GetVector()也是一個(gè)副本,沒有意義。所以C#語法在對(duì)于這種情況,幫我們做了一個(gè)處理,如果寫了這樣的代碼,直接給出編譯報(bào)錯(cuò)。C#還是很智能的。就是如果我們錯(cuò)誤的進(jìn)行一個(gè)無意義的操作,會(huì)直接給出提示。這里給C#語法贊一個(gè)。
四.雜談
這一段代碼雖然好像很簡(jiǎn)單,但是真的藏的很深,樓主工作三年。記得曾經(jīng)有一次去網(wǎng)易二面,被一個(gè)大佬問到這個(gè)問題,懵逼了,就亂猜吧,一開始說,那個(gè)枚舉值中的x只是get,沒有set。然后大佬提示我不是的,然后我才誤打誤撞,恍然大悟,是因?yàn)槊杜e值傳遞是副本傳遞,再進(jìn)行賦值操作沒有意義?,F(xiàn)在想想,能出這個(gè)問題的大佬,真的很強(qiáng),一道很簡(jiǎn)單的問題,但是考察的東西真的很多很多。
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Windows 8 Metro用C#連接SQLite及創(chuàng)建數(shù)據(jù)庫,數(shù)據(jù)表的增刪改查的實(shí)現(xiàn)
本篇文章小編為大家介紹,Windows 8 Metro用C#連接SQLite及創(chuàng)建數(shù)據(jù)庫,數(shù)據(jù)表的增刪改查的實(shí)現(xiàn)。需要的朋友參考下2013-04-04C#實(shí)現(xiàn)的文件上傳下載工具類完整實(shí)例【上傳文件自動(dòng)命名】
這篇文章主要介紹了C#實(shí)現(xiàn)的文件上傳下載工具類,結(jié)合完整實(shí)例形式分析了C#操作文件上傳與下載功能,并且還可針對(duì)上傳文件自動(dòng)命名以避免服務(wù)器中的文件名重復(fù),需要的朋友可以參考下2017-11-11- 這篇文章主要介紹了C#打開和關(guān)閉可執(zhí)行文件,以QQ應(yīng)用程序?yàn)槔?,需要的朋友可以參考?/div> 2015-12-12
在C#的類或結(jié)構(gòu)中重寫ToString方法的用法簡(jiǎn)介
這篇文章主要介紹了在C#的類或結(jié)構(gòu)中重寫ToString方法的用法簡(jiǎn)介,需要的朋友可以參考下2016-01-01SuperSocket入門--Telnet服務(wù)器和客戶端請(qǐng)求處理
本文的控制臺(tái)項(xiàng)目是根據(jù)SuperSocket官方Telnet示例代碼進(jìn)行調(diào)試的,官方示例代碼:Telnet示例。下面跟著小編一起來看下吧2017-01-01使用c#實(shí)現(xiàn)隨機(jī)數(shù)猜數(shù)游戲的示例代碼
這篇文章主要介紹了使用c#實(shí)現(xiàn)隨機(jī)數(shù)猜數(shù)游戲的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09c#調(diào)用qq郵箱smtp發(fā)送郵件修改版代碼分享
c#調(diào)用qq郵箱發(fā)送郵件的方法,網(wǎng)上找到的有錯(cuò)誤,這里修改了一下提供給大家使用2013-12-12C#中的時(shí)間顯示格式(12小時(shí)制VS24小時(shí)制)
這篇文章主要介紹了C#中的時(shí)間顯示格式(12小時(shí)制VS24小時(shí)制),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01最新評(píng)論