定义的类中,内部如何能实例化自身?

froushow 2016-07-19 02:51:16
在看c#编程时,看到一个问题,求各位大仙指点下:
下面例子程序员定义了一个MathClass类,为何在类的内部能实例化自身呢?百思不得其解,请指点迷津。

using System;

class MathClass
{
static void Main()
{
MathClass m = new MathClass(); //为何在类的内部能实例化自身呢?
for (int i = 1; i <= 5; i++)
{
Console.WriteLine(i * 2);
}
System.Console.ReadKey();
}
}
...全文
1001 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangyu0517 2016-07-20
  • 打赏
  • 举报
回复
之前例子C++。可能我说的不清楚,区别在于成员是引用(指针)还是实例(C#都是用的new,无法直接实例),表示成员始终指向另外一个相同类型的实例对象而并非自己,和链表差不多的意思
wangyu0517 2016-07-20
  • 打赏
  • 举报
回复
struct test
    {
    int number;
    float socre;
    test *next;
    }
struct test
    {
    int number;
    float socre;
    test  next;
    }
我叫小菜菜 2016-07-19
  • 打赏
  • 举报
回复
class Person
{  
   Person father;
   Person mather;
   Person [] child;
}
好好琢磨下有没有问题
wangyu0517 2016-07-19
  • 打赏
  • 举报
回复
MathClass m = new MathClass();语法上是完全没错的,把MathClass当成无关的类来理解就行了。 只不过这种“自己使用自己的”方法,通常用不到,或者用于特殊设计。了解下面几个要点。 1、static要点,包括static构造函数,static成员函数,static成员变量。 2、属性要点,为什么要定义属性,却不定义字段。 3、“自己创建自己”用于构建特殊的环境,包括单键模式 池模式 工厂模式都用到这个技巧。百度了解一下。 以上几点配合使用,就是为了构建高效、安全的访问模式,创造特殊的对象模型。
wangyu0517 2016-07-19
  • 打赏
  • 举报
回复
你给的例子另外一个原因就是成员函数是static静态的,也就是说不必先实例化MathClass再调用void Main(),因为静态总是存在。上面刚刚我说的也不太好,但意思都是对的。 MathClass m = new MathClass();常见用于static成员函数,就是实例化一个对象。调用的时候注意是否会无限new内存就行了。因为其特殊性,产生了单列模式的设计方法。单例模式是一种常用的软件设计模式。通过单例模式可以保证系统中一个类只有一个实例。
wangyu0517 2016-07-19
  • 打赏
  • 举报
回复
MathClass m = new MathClass();这段代码意思是,栈上开辟一个内存,把内存地址赋给堆上定义的一个引用变量m。 sp大神说的没错,很形象,我来补充一下。 1、这句话对不对的关键在于执行MathClass m = new MathClass()时,系统到底有没有定义MathClass 。 显然如果这样使用public MathClass m定义一个成员,编译不会通过的,因为编译时会通过类声明来获取这个类的详细信息,类声明本身使用了自己。就像5楼说的,编译器要根据类有哪些类型成员,来计算类的内存大小,MathClass 本身大小都未知,所以成员变量不能有他。如果把它放到成员函数里面就没错,因为编译的时候成员函数的内容对该类没有影响,你可以理解函数只是一段代码的指针,而成员函数在函数的基础上限定了访问权限,编译只检查语法。 2、针对你的内部实例化自己这句话。,class MathClass {int a, int b, MathClass c, void fuction()};这才是实例化自己的例子,当然是不行的,错误的。但是把MathClass c使用在 void fuction()内部就是可行的。在函数内部不等同于对象内部,对象只是包含一个成员函数的引用,不关心函数的内容。特别的有static修饰符。
froushow 2016-07-19
  • 打赏
  • 举报
回复
谢谢@dongxinxi,这里高人还真多,我初学c#,谢谢3位的指点,你们在答复中提到的很多思想是我无法从书上看到的。
froushow 2016-07-19
  • 打赏
  • 举报
回复
两位大仙的解答让我醍醐灌顶,尤其是SP1234,谢谢。
  • 打赏
  • 举报
回复
这可能需要从代码变为程序,然后启动开始讲起?你的程序编译后,会按一定的结构(自己去查PE文件)存储至dll中,当应用程序启动时,会主动去加载需要的dll至内存,找到要运行的代码段的地址,然后加载运行 自编译后,类的元数据大小(Marshal.SizeOf)就是确定的(指针类型暂且算作Marshal.SizeOf(IntPtr),不纠结这个) 而实例化一个类,实际只是申请一段上面长度已经确定的内存空间,然后将其引用或者地址,赋值给载入到栈的变量,仅此而已
  • 打赏
  • 举报
回复
对象是离散的、独立的。首先要想明白这个道理,能破除大多数误导。 你在一个对象实体中(属性啊,方法内部啊,等等地方),可以引用别的同类型的对象实体,也可以引用自己。没有任何问题。就好行把图纸放在房间里一样自然。
  • 打赏
  • 举报
回复
一个类型所定义的内容,既包括数据,又包括可执行代码。运行时用什么属性来引用 A 类对象,或者可执行代码中用什么变量来引用 A 类代码,完全无关。 这就好像你装修好的房间里边可以放任何装修改图纸,可以是以前用过的,可以是将使用的,可以是本房间的装修图纸。而这个图纸可以用来引用一个真实的实体。但是它本身并不是真实的实体。 你房间里放一个隔壁老王家的装修图纸,虽然这个图纸可以用来引用隔壁老王家,并不等于把隔壁老王家安装到你的房间里了。所以如果你分不清楚“引用”跟“实体”的关系时,也不要说什么“房间嵌套了房间”这种话。
  • 打赏
  • 举报
回复
没有什么实例化自身”的说法,这个说法是混乱的。 比如说类型
class A
{
    public string a;
    public A[ ] b;
    public A x;
}
那么这个类型定义了一个属性B,是一个A类对象的数组,这怎么知道b数组中就有单元引用了“自身”? x 是一个引用,可以引用任何兼容A类的对象。而A是一个类型,并不是对象。这并不冲突。 好比如说,装修一个房子要有图纸。然后房子装修好了之后,这个图纸放在房间里了,你敢说“怎么房子里还有房子自身呢?”这种话么?这岂不是3岁小孩子才会说出的混乱的问题吗? A 类就是一个“图纸”,是定义。而x或者b是变量,在运行时才可以引用基于此定义而实例化的任何对象。其中b数组中可以引用任何A类对象,包括可以引用x变量已经引用的同一个对象。
sgyiliya 2016-07-19
  • 打赏
  • 举报
回复
这个叫“”嵌套类“”,也叫包含类,自己包含自己的实例,这样是可以的。

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧