zoukankan      html  css  js  c++  java
  • C# 一句很简单而又很经典的代码

    一.知识点

    二.问题

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

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

    再看下面这段代码有没有问题?

     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。然后大佬提示我不是的,然后我才误打误撞,恍然大悟,是因为枚举值传递是副本传递,再进行赋值操作没有意义。现在想想,能出这个问题的大佬,真的很强,一道很简单的问题,但是考察的东西真的很多很多。

        

  • 相关阅读:
    mysqldump 导出数据库为DBname的表名为Tname的表结构 导出数据库的所有表的表结构
    mysqldump 备份某张表 Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions,
    nfs missing codepage or helper program, or other error
    date 增加一个小时 减少一个小时
    mysqldump 备份单个数据库
    mysql删除账户
    怎么删除某个用户的所有帖子?
    mongodb删除重复数据
    ReSharper2018破解详细方法
    激活windows和office
  • 原文地址:https://www.cnblogs.com/u3ddjw/p/11109679.html
Copyright © 2011-2022 走看看