面向零基础新手的 C# 基础知识 15

15

本节课需要记忆的不多,难点主要在理解上。

这节课主要解决三个问题:

  • .Net 运行库对类的工作机制是怎么样的?
  • 构造函数
  • 静态方法

15.1 垃圾回收机制与.Net 运行库工作原理

首先,让我们再来看一下微软的文档:

属于构造,使用类,可以通过组合其他类型的变量、方法和事件创建自己的自定义类型。 类好比是蓝图。 它定义类型的数据和行为。 如果类未声明为静态,客户端代码就可以通过创建分配给变量的对象实例来使用该类。 变量会一直保留在内存中,直至对变量的所有引用超出范围为止。 超出范围时,CLR 将对其进行标记,以便用于垃圾回收。 如果类声明为静态,则内存中只有一个副本,且客户端代码只能通过类本身,而不是实例变量来访问它。 有关详细信息,请参阅静态类和静态类成员

在上过课之后,我发现,上一节课主要讲的就是第一句话,而红色标注的地方就是这节课的重点。

微软说的并非“不是人话”,只是我语文太差罢了。

Bob说,在讲明白类之前,首先,我们需要弄明白创建类时的底层工作机制。

当我们发出创建类的命令时,类似:

car myCar  = new car();

.Net 运行库就在内存中给我们找地方放存储实例化类。也就是经常听到的“寻址”。放好之后,该如何访问呢?

上节课讲过,对象是能访问的,而类是不能操作的。所以,我们就可以用操作实例的名字来改变内存中的数据。实际上,每当我们以为输入

myCar.Name = "常凯申";

这样的代码的时候,是在操作数据,实际上,我们并没有直接操作,只是通过myCar这个名字让.Net 运行库去操作罢了。

就好比是一个桶,上面有一个把手,我想没人会用手捧着水桶,一般人都是拿着把手走的。所以,这个把手就是我们拿起水桶的途径,也就是句柄

当然,一个水桶会有不止一个把手(虽然不怎么美观),一个内存数据也可以有不止一个句柄。比如:

car myCar = new car();

car hiscar;

hiscar = myCar;

这样实验下来,myCar和hiscar的数据都是互动的。

 

那么,在什么情况下,.Net运行库会删除内存数据呢?

如果我们继续用水桶做比喻的话,要是把手没了,就没人会去拿了吧?

也就是说,当句柄消失的时候,内存中的数据也就会在将来某个时候被删除了。

所以,当:

myCar = null ;

hiscar = null;

的时候,在不远的将来,内存中的数据将会消失。

或者说,当水桶老化的时候,这个桶也没用了吧?

因此,当该类的代码执行完毕的时候,内存中的数据也将被回收。

15.2 构造函数

还是先从定义类说起吧:

car myCar =  new Car();

请大家先观察一下这行代码,有没有发现这行普通的代码有什么一直没注意到的东西?

 

是的。目前就我们的知识水平来说,只有方法、函数等才能、必须在名称后加上()来表示调用。

那么,能不能这么认为,我们建立实例化类的时候,是不是就是调用了函数?

就是这样。这个函数就叫做构造函数。

如果你什么都不写,通常为空({}),VS会自动生成那一行代码的。

构造函数通常被用于快速设置属性(从网络读取、数据库查询),就像这里的车一样,我想让所有车类一初始化的时候就设置属性,就可以这么写:

public car()
{
this.make = "Old Fashion";
}

当然,带参数也是可以的:

public car(string mmake,string  mmdoel ,int yyear, string  ccolor)
{
make = mmake;
model = mmdoel;
year = yyear;
Color = ccolor;
}

注意了不要和类的方法搞混了!类的方法是这样的:

public void example()

//void可替换

{

}

还有,在程序中定义方法、函数是这样的:

private static void proin()

//void可替换

{

}

15.3 静态

静态不是普通的类,它是具现化的。也就是,能够直接被访问的。比如,最最熟悉的:

Console.WriteLine("");

就是一种静态类。

如MSDN文档所说,静态类不能创建副本,“只有一个把手”。当然,像之前的实例之类也就不能创建了。至于为什么要用静态,Bob说了,“他不讲”。

 

futa: