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

[ 1713 查看 / 15 回复 ]

点击关闭鉴定图章
public class Test
{
    public struct Obj
    {
              public static string Str="str";
    }
}

为什么不用实例化test就可以调用Test中的struct
如以下形式:
Test.Obj.Str
本主题由 管理员 张波老师 于 2010-9-20 16:40:13 执行 设置精华/取消 操作
TOP

语法基础不过关,请大家解答以下
TOP

这个命题是比较有意思,但也有很大 迷惑性 的。。
关键就在,public struct Obj,这是个什么东西
TOP

  1. class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine(Test.Obj.Str);
            }
        }


        class Test
        {
            public struct Obj
            {
                public static string Str = "str";
            }
        }
复制代码
最好的办法是用代码说话。。
仔细看看,public struct Obj。。这个语法是在 ‘定义’一个 结构体——而非使用(使用的话,是需要new出对象来的)。。

换句话说,这样的定义方式,在外层定义了一个 ‘类’——然后,在这个类的内部 ‘嵌套’了一个 结构体——这个应该是可以叫做 ‘嵌套类’——Java是叫‘内部类’,但Java没有 结构体 ,所以,我不知道这个是不是应该称为 ‘嵌套结构’。
TOP

对于嵌套类而言,要访问 内部那个 类的某个成员。。
这是比较有趣的问题。。

1.当这个 内部类(结构)的成员是 静态成员的话,那就是用 类.成员 的方式去访问。(需要注意的是,这里的类——是 外部类.内部类 这样的标识方式)
Test.Obj就是前面 类.成员 中 代替‘类’这个占位符。(Test.Obj).Str 这样,是不是就容易理解了?

2.麻烦的是,如果这个内部类的 成员 是 实例成员的话。。这样是需要把内部类 new出来的(如果是结构体,又刚好可以不需要new——这个就更复杂了。。我们先把 结构 当作 类来new)
  1. class Program
        {
            static void Main(string[] args)
            {
                Test.Obj test = new Test.Obj();

                test.Str = "chenjian";

                Console.WriteLine(test.Str);
            }
        }


        class Test
        {
            public struct Obj
            {
                public string Str;

            }
        }
复制代码
TOP

  1. class Program
        {
            static void Main(string[] args)
            {
                Test.Obj test;          /*//这个等号赋值,对于结构体可以省略!! = new Test.Obj();*/

                test.Str = "chenjian";

                Console.WriteLine(test.Str);
            }
        }


        class Test
        {
            public struct Obj
            {
                public string Str;

            }
        }
复制代码
TOP

public class Test
{
    public struct Obj
    {
              public static string Str="str";
    }
}

为什么不用实例化test就可以调用Test中的struct
如以下形式:
Test.Obj.Str


楼主的这个问题,其实访问的就是一个 “外部类.内部类.静态成员”——这时候是没有任何对象实例的。——即所有的内存都是使用的栈内存,没有在堆上开辟内存的。。

应该是说,这里Obj是真正的 类型(结构),而其外部类Test只是一个修饰符 Test.Obj 这才是一个完整的 类型!这一点确实不太容易理解。。

必须对 类 和 对象 有很强烈而直观的感受。
TOP

仔细看图。。Test.Obj.Str ——其中,Test.Obj 两个标识符都是 绿色的——IDE告诉我们,他们联合起来组成一个类。。基本上可以用 命名空间 来理解。。


 附件: 您所在的用户组无法下载或查看附件
TOP

佩服那
TOP

其实在C#中,struct类型本身就是隐式static的
下来做个试验:
using System;
using System.Text;
namespace Test
{
    class Program
    {
        static void Main()
        {
            Console.WriteLine("Test.Obj.Str={0}",Test.Obj.Str);
            Test.Obj.Str = "Changed";
            Console.WriteLine("Test.Obj.Str={0}", Test.Obj.Str);

        }
    }
    public class Test
    {
        public struct Obj
        {
            public static string Str = "str";
        }
    }

}
从这个试验中我们可以看出:改变了Obj.Str整个Test中的Obj.Str的值就改变了。
TOP