类声明相当于模板/图纸,你可以基于它创建任意多个类实例。
实例成员:类的每一个实例都是独立个体,拥有一套专属数据成员,与同类其他实例互不干扰。这类成员被称为实例成员,因为它们绑定于类的实例对象。
静态成员:实例成员是默认类型;你也可以声明静态成员,静态成员归属类本身,而非实例对象。后续课程会讲解。
下面举例子说明
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…