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

        

  • 相关阅读:
    Hibernate注解(一对一、一对多、多对多)
    Hibernate多表关系配置——继承
    Hibernate多表关系配置——多对多对关系映射
    Hibernate多表关系配置——一对一关系映射
    Hibernate多表关系配置——多对一关系映射
    初识Hibernate——添加数据
    Servlet学习总结
    jQuery动态添加Table行
    VS2013搭建CSDN源代码管理git
    Node.js amqplib 连接 Rabbitmq 学习笔记
  • 原文地址:https://www.cnblogs.com/u3ddjw/p/11109679.html
Copyright © 2020-2023  润新知