C# 一句很簡單而又很經典的代碼

一.知識點

 

二.問題

若是以上四個問題,你很自信,那麼如下,您就不要看了,由於我想說的東西真的很簡單。html

若是你開始懷疑本身,能夠繼續向下看。你本身到底真的理解嗎???this

再看下面這段代碼有沒有問題?spa

 1  class Program  2  {  3         static void Main(string[] args)  4  {  5             Transform t = new Transform();  6             t.v.x = 1;  7  t.ShowV();  8  Console.Read();  9  } 10  } 11 
12     struct Vector 13  { 14         public float x; 15         public float y; 16         public float z; 17  } 18 
19     class Transform 20  { 21         public Vector v { get; set; } 22         public void ShowV() 23  { 24             Console.WriteLine(v.x+"..."+v.y+"..."+v.z); 25  } 26     }

若是你以爲沒有問題,那麼你須要看看。這時候會編譯報錯,爲啥,怎麼回事。3d

  第6行編譯報錯:code

三.分析

  若是你很是清楚屬性的本質的話,那麼上述代碼能夠進行轉換,將屬性轉換爲普通方法。(屬性的本質就是方法嘛)orm

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); } }

  果真上述的改寫只是將屬性的寫法轉爲本質寫法-寫成兩個普通的方法。結果仍是報同樣的編譯錯誤。htm

   ,編譯報錯提示仍是同樣的CS1612blog

  再修改一下 get

Transform t = new Transform(); // t.GetVector().x = 10; 這邊編譯報錯
            Vector v2 = t.GetVector(); v2.x = 10; t.ShowV(); Console.Read();

  編譯打印結構是 0..0..0。string

  壓根就沒變,固然沒有變啊,由於v2是副本,你更改的只是副本,並無改變t中的v,同理,經過t.GetVector()也是一個副本,沒有意義。因此C#語法在對於這種狀況,幫咱們作了一個處理,若是寫了這樣的代碼,直接給出編譯報錯。C#仍是很智能的。就是若是咱們錯誤的進行一個無心義的操做,會直接給出提示。這裏給C#語法贊一個。

四.雜談

  這一段代碼雖然好像很簡單,可是真的藏的很深,樓主工做三年。記得曾經有一次去網易二面,被一個大佬問到這個問題,懵逼了,就亂猜吧,一開始說,那個枚舉值中的x只是get,沒有set。而後大佬提示我不是的,而後我才誤打誤撞,恍然大悟,是由於枚舉值傳遞是副本傳遞,再進行賦值操做沒有意義。如今想一想,能出這個問題的大佬,真的很強,一道很簡單的問題,可是考察的東西真的不少不少。

    

原文出處:https://www.cnblogs.com/u3ddjw/p/11109679.html

相關文章
相關標籤/搜索