• 深入分析结构体——结构体里有属性必须new才能使用?


    游哥今天遇到了一个关于结构体的神现象。
    简单点来说就是:
    一个结构体,里面没有属性,可以不new就使用。但在结构体里面写了个属性就必须要new才能使用,这是为什么呢?

    直接上代码:

    struct Dog    //狗的结构体
    {
        public int age;
    }
    struct Cat   //猫的结构体
    {
        public int Age { get; set; }
    }
    class Program
    {
        public static void Main()
        {
            //情况A
            Dog dog1;
            dog1.age = 3;                 //片段1
            Console.WriteLine(dog1.age);  //不出错
            Cat cat1;
            cat1.Age = 3;                 //编译错误
            Console.WriteLine(cat1.Age);  //片段2
    
            //情况B
            Dog dog2 = new Dog();
            dog2.age = 3;                 //片段3
            Console.WriteLine(dog2.age);  //不出错
            Cat cat2 = new Cat();
            cat2.Age = 3;                 //片段4
            Console.WriteLine(cat2.Age);  //不出错
        }
    }

    片断4不报错,而片断2则报错。
    这里面涉及很多技术细节,你能知道这是为什么吗?


    游哥来解答:
    1.结构体里只有字段,没有属性。狗类分析:
    片断1,不出错。众所周知,结构体可以不new就使用。
    片断3,不出错。不new不出错,new了就更不出错了。

    2.结构体可以new,也可以不new。new与不new的区别是,new为会每一个成员字段赋一个默认初值(还记得default关键字吗),而不new则不会这么做。
    3.任何一个属性,编译器都会自动生成一个与之对应的字段来保存数据,比如这里的Age属性,就会产生出一个_age来为其保存数据。(它可能不叫_age,这不是重点,总之你看不到这个字段,但它确实存在。)
    4.了解一下,什么叫数据结构和算法吧。其实有点扯远了,简单来说,可以这么理解,字段就是数据结构,而方法和属性访问器就是算法了。(字段保存数据,而方法和属性访问器对这些数据进行加工计算)。
    5.为什么要提出数据结构和算法,我要说的重点是:要调用结构体的算法(各部门请注意,我要来计算了),必须先让所有的数据就就绪(那些字段都赋了初值了吗)。意思就是说,你要调用结构体的任何一个方法或属性访问器之前,必须要给所有的字段赋初始。编译器不会去关心你的算法涉及了哪些字段(编译器不检查你的方法体)。甚至是你的算法没有涉及任何字段的访问,编译器依然要求你将所有的字段都赋上初值才能使用。

    6.结构里有属性。猫类分析:
    片断2,编译错误。那个隐藏的_age没有赋初值,而你写cat1.Age=3,是调用了Age的set访问器,set访问器是一个算法,你要使用这个算法,必须先将所有字段赋初始,而你的_age没有赋初值,所以就编译错误了。
    片断4,不会出错。你在new Cat()时,对_age进行了赋初始操作,所以后面就不出错了。

    一点浅见 欢迎批评指正

  • 相关阅读:
    国内免费网络硬盘个人汇总
    SQL Server 2008 R2 (MS官方全版本),AIO,含x86和x64
    宣称支持REST的Web框架到底有多REST?
    flex(flash)下的pdf处理组件
    Visual Studio 2010 Pro Power Tools给VS2010的UI进行重大升级
    对XML里的属性或元素进行模糊搜索的方法
    Expression Blend 4 SP1现在可以支持Flash UI组件
    可选参数在.NET中全面开花
    Flex与JS交互完全攻略
    Flash Builder 4.0.1更新放出.同步更新框架为Flex SDK 4.1!支持最新的AIR 2正式版和Flash Player 10.1![图文]
  • 原文地址:https://www.cnblogs.com/zhouyou96/p/2973747.html
Copyright © 2020-2023  润新知