实例成员

类声明相当于模板/图纸,你可以基于它创建任意多个类实例。

实例成员:类的每一个实例都是独立个体,拥有一套专属数据成员,与同类其他实例互不干扰。这类成员被称为实例成员,因为它们绑定于类的实例对象。

静态成员:实例成员是默认类型;你也可以声明静态成员,静态成员归属类本身,而非实例对象。后续课程会讲解。

下面举例子说明

class Program
{
    static void Main(string[] args)
    {
        Factory factoryFox = new Factory();
        Robot robot1 = new Robot();
        Robot robot2 = new Robot();
        Robot robot3 = new Robot();
    }
}

class Factory
{

}

class Robot
{
    public string name;

    public void SayHello()
    {
        Console.WriteLine($"Hello erveryone my name is {name},I come form Foxdevelop.com");
    }
}Code language: C# (cs)

这个例子中,有两个类Factory和Robot,Robot里面有一个函数和一个字段name。Factory中没有name字段。

主函数中创建了一个Factory实例和三个Robot实例。

我们看内存的存储结构。

三个机器人 robot1,robot2,robot3,都各自有一个自己的name,它们是不同的存储位置的,互不影响。修改robot1,不会影响robot2.

    static void Main(string[] args)
    {
        Factory factoryFox = new Factory();
        Robot robot1 = new Robot();
        Robot robot2 = new Robot();
        Robot robot3 = new Robot();

        robot1.name = "Tom"; //三个name互不影响 独立的
        robot2.name = "Jack";
        robot3.name = "Smith";
    }Code language: C# (cs)

函数成员只有一份

上面是name,每个实例都有一个独立的name,互不影响,修改其中一个实例的name,不会影响另外的实例的name。我们知道类里面除了字段成员,还有一个函数成员的

类里面的函数成员,是不是只有一份。多个实例共用

函数(方法)代码本体:全局只有一份,所有实例共用

类编译后,方法的机器指令代码存放在方法表(Method Table),属于类型本身,堆里所有该类实例都共享这一份代码,不会每个对象复制一套函数。

例如下面Robot里面的SayHello

class Robot
{
    public string name;

    public void SayHello()
    {
        Console.WriteLine($"Hello erveryone my name is {name},I come form Foxdevelop.com");
    }
}Code language: C# (cs)

其实内存中,除了堆和栈,还有其他几个区域的,例如函数是存放在方法表里面的。Method Table

类里面的函数,是存放在方法表。当要调用这个函数的时候,就去执行这个方法表的函数,函数是共享的。

    static void Main(string[] args)
    {
        Factory factoryFox = new Factory();
        Robot robot1 = new Robot();
        Robot robot2 = new Robot();
        Robot robot3 = new Robot();

        robot1.name = "Tom";
        robot2.name = "Jack";
        robot3.name = "Smith";

        robot1.SayHello();
        robot2.SayHello();
        robot3.SayHello();
    }Code language: C# (cs)

例如上面代码,最后三个,调用SayHello,其实都是同一个函数,但是函数里面的局部变量是不应用的,另外函数里面访问字段成员也是不一样的,和实例有关系。

    public void SayHello()
    {
        Console.WriteLine($"Hello erveryone my name is {name},I come form Foxdevelop.com");
    }Code language: C# (cs)

例如当是robot1调用SayHello的时候,name就算Tom,当robot2调用SayHello的时候,name就算Jack…

Previous:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注