关于struct在class中的调用问题??

[ 1955 查看 / 15 回复 ]

上面这个说法应该是不太对。。

再三再四要明确的一点,到底是 Test 的 Obj.Str 还是 Test.Obj 的Str 。。这里牵涉到,类 和 对象 两个在OO中无比重要、重要无比的概念。

我的个人理解是,这里必须看作:Test.Obj 的Str ——也就是说,Test.Obj 不可拆分,是典型的 OuterClass.InnerClass 这样的形式。这个类(指的就是Test.Obj 这个类型,它身上定义了成员Str,如果这个成员是 static 的,则就是静态成员,如果没有被static修饰,就是 实例成员)。

所以,其实在C#中,struct类型本身就是隐式static的 这个结论是靠不住脚 的。。
如果把 static 去掉,你可以试试如何才能访问 Str 这个变量(此时就不再是 静态变量,而是实例变量了)。。我前面贴出的代码中个,就有讨论,如果没有static,该如何访问 Str 这个 实例成员变量。
TOP

  1. namespace ConsoleStructTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine(OuterClass.InnerStruct.Str);

                OuterClass.InnerStruct2 innerStruct;
                innerStruct.Str = "World";
                Console.WriteLine(innerStruct.Str);

                OuterStruct outerStruct;
                outerStruct.Str = "Hello World!";
                Console.WriteLine(outerStruct.Str);
            }
        }

        static class OuterClass
        {
            public struct InnerStruct
            {
                public static string Str = "Hello";
            }
            public struct InnerStruct2
            {
                public string Str;
            }
        }
        struct OuterStruct
        {
            public string Str;
        }

    }
复制代码
TOP

是不是应该从结构的概念上来分析这个问题,下面一段话是msdn上的

在结构声明中,除非字段被声明为 const 或 static,否则无法初始化。

结构不能声明默认构造函数(没有参数的构造函数)或析构函数。

结构在赋值时进行复制。将结构赋值给新变量时,将复制所有数据,并且对新副本所做的任何修改不会更改原始副本的数据。在使用值类型的集合(如 Dictionary<string, myStruct>)时,请务必记住这一点。

结构是值类型,而类是引用类型。

与类不同,结构的实例化可以不使用 new 运算符。

结构可以声明带参数的构造函数。

一个结构不能从另一个结构或类继承,而且不能作为一个类的基。所有结构都直接继承自 System.ValueType,后者继承自 System.Object。

结构可以实现接口。

结构可用作可以为 null 的类型,因而可向其赋 null 值。
TOP

其实在C#中,struct类型本身就是隐式static的——明白上面这位兄弟所说的这句话的意思了。。
隐式static,到底是个什么意思呢?

我的理解是,隐式静态就是 没有真正的 实例特性(动态特性就是 OO 面向对象的几大特性)。Struct由于是值类型,是被分配在 栈 上的,因此他的特性是与 int这样的 基元类型很雷同的。。他们是没有什么 多态 这种高级OO特性的。
TOP

回复 10# ls0301 的帖子

对  要不用 类. 时是不会出来结构体的。
TOP

struct本身就是值类型,不需要实例化即可使用。你在类里面定义了一个struct,其实和在前面加了static关键字的变量与方法是一个效果。
TOP