一.知识点



 

二.问题

如果以上四个问题,你很自信,那么以下,您就不要看了,因为我想说的东西真的很简单。

如果你开始怀疑自己,可以继续向下看。你自己到底真的理解吗???

再看下面这段代码有没有问题?
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 }
如果你觉得没有问题,那么你需要看看。这时候会编译报错,为啥,怎么回事。

  第6行编译报错:

三.分析

  如果你非常清楚属性的本质的话,那么上述代码可以进行转换,将属性转换为普通方法。(属性的本质就是方法嘛)
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); } }
  果然上述的改写只是将属性的写法转为本质写法-写成两个普通的方法。结果还是报一样的编译错误。

   ,编译报错提示还是一样的CS1612

  再修改一下 
Transform t = new Transform(); // t.GetVector().x = 10; 这边编译报错 Vector v2 =
t.GetVector(); v2.x= 10; t.ShowV(); Console.Read();
  编译打印结构是 0..0..0。


  压根就没变,当然没有变啊,因为v2是副本,你更改的只是副本,并没有改变t中的v,同理,通过t.GetVector()也是一个副本,没有意义。所以C#语法在对于这种情况,帮我们做了一个处理,如果写了这样的代码,直接给出编译报错。C#还是很智能的。就是如果我们错误的进行一个无意义的操作,会直接给出提示。这里给C#语法赞一个。

四.杂谈


  这一段代码虽然好像很简单,但是真的藏的很深,楼主工作三年。记得曾经有一次去网易二面,被一个大佬问到这个问题,懵逼了,就乱猜吧,一开始说,那个枚举值中的x只是get,没有set。然后大佬提示我不是的,然后我才误打误撞,恍然大悟,是因为枚举值传递是副本传递,再进行赋值操作没有意义。现在想想,能出这个问题的大佬,真的很强,一道很简单的问题,但是考察的东西真的很多很多。

    

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信