一个很有趣的问题

C# 结构体不可以包含自身,但是类的话可以包含自身。

形式大概就是这样:

    public class A
    {
        public int Data;
        public A _This;

    }

后来突发奇想,就把class 关键字改成 struct

    public struct A
    {
        public int Data;
        public A _This;

    }

自然而然这是无法通过编译的……

不甘寂寞的我,又去试验了C++的编译器

不出意外,还是报错了,但是错误提示是A为不完整的类型,g++和VS C++编译器都是一样的提示。因为整个结构体都还没声明完成却又被嵌套使用了,所以这里编译器直接报错了。

但是C#不一样,值类型和引用类型的区别就在这里,因为值类型的内存分配形式的缘故,一旦声明了一个结构体,那么就会为这个结构体里面所有值类型成员变量分配托管内存空间,

一旦嵌套自身,那么就是无限的嵌套下去,所以就可以看到下面这个错误提示~

 类与结构体的区别就在于类可为空值,我们在类中嵌套自身,编译器实际上不会为这个自身类型的成员分配空间(如果你作死的话那就另外说,类在初始化的时候不能把自身类型的成员变量初始化)

也就是不能存在这种形式:

   public class A
    {
        int a;
        A _A = new A();
}//C#6.0语法
    public class A
    {
        int a;
        public A()
        {
            _A = new A();
        }
        A _A ;
    }//等效形式

虽然很简单,也虽然现在的编译器很高级,这种形式的错误很容易就能够检测出来,肯定啦,这叫做直接代码嵌套,如果是间接代码嵌套就没有那么容易检测出来了。

为什么我突然想起来这个呢?我也不知道为什么,我只是想起来N久以前我的项目里面出现过间接嵌套,直接导致死循环。那时候就是有一个结果很久都没得出结果,断点定位的时候发现并没有错(后来发现是代码又循环执行了一次)

具体是什么项目我也忘了,玩过太多项目(虽然没有完成任何一个,时间太散,做到一半突然发现又有一个值得研究的东西了)

 

这一次就记到这里,只是为了提醒自己别忘了还有这个隐老虎(好像我想起来我做的是什么了,DFA~那时候状态图的转换那里)

posted @ 2016-12-06 21:27  丹麦的鱼  阅读(266)  评论(0编辑  收藏  举报