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

相关文章
相关标签/搜索