C# 类型实例化的语法糖--unity下诡异结果

类型实例化语法糖就是如下的用法:

public class Abc
{
    public int ID { get; set; }
 
    public string Name { get; set; }
 
    public string Url { get; set; }
}

我们没有为上面的类声明构造函数,但是我们可以像下面的形式来实例化它

public static void Main(string[] args) {
        var abc = new Abc{
            ID=1,
            Name="Ice",
            Url="http://www.cnblogs.com/"
        };
    }

关于语法糖的其他用法,可以google或者百度之。

语法糖的这用用法,只是编译器提供的便捷方法而已,其等价于:

var abc = new Abc();
abc.ID = 1;
abc.Name = "Ice";
abc.Url = "http://www.cnblogs.com";

 

 

-----------------------------------------------心怀鬼胎的分界线--------------------------------------------------------------------------------

 

分界线前面,简单介绍了下实例化语法糖的用法。而,下面我将提到的是,在代码过程中遇到的诡异事件。

我写了这样的代码:

class A
{
    public class A1
    {
        public int id = 1;
        public bool isActive = true;
    }
    public int index;
}



A.A1 a1 = new A.A1(){
    id = 2,
    isActive = false    
};

然后打印id,和isActive的值,发现了诡异的事情,于是写了几个测试用例,结果如下:

实验结果如下:
a1.id ===>2
a1.isActive===> true

实验用例:
(1) isActive 不设置默认值,
    分三种情况:
        a、在new时不设置值,输出值为false。
        b、在new时设置为false,输出值为false。
        c、在new时设置为true,输出值为true。
(2) isActive 设置默认值为false,
    分三种情况:
        a、在new时不设置值,输出值为false。
        b、在new时设置为false,输出值为false。
        c、在new时设置为true,输出值为true。
(3) isActive 设置默认值为true,
    分三种情况:
        a、在new时不设置值,输出值为true
        b、在new时设置为false,输出值为true
        c、在new时设置为true,输出值为true。

标红的为诡异的事情,因为按照语法糖的解释来说,输出值应该为false的。

这一点,求解释吧。对了,我用的环境是untiy4.6.5。用的框架是unity 3.5 .net full base class libraries .

有人说,干嘛要这么较真呢,不用语法糖就是了。我想说,对于一个很完善的项目,到处都是语法糖用法,你也不可能把同事的代码去给他改了吧

 

-----------------------后续-------------------------------------

终于还是忍不住,在C# ConsoleApplication下试了试,结果发现,木有任何诡异的问题。不管是 .Net4.0Client Profile 还是.Net3.5 Client Profile.

但是同样的代码,在unity工程下的C#代码内就存在问题。不论是用的 Unity3.5 .net Subnet Base Class Libraries 还是unity 3.5 .net full base Class Libraries。

使用类型语法糖的同学们,自己注意下吧。

posted on 2016-04-11 13:40  Ming明、  阅读(1333)  评论(1编辑  收藏  举报