好久沒發表文章了,說也有趣,突然感覺C#中的有些類,為什麼,其構造器是不可見的?
而且通常這些類在一個程序中往往只有一個實例存在。於是,我做了個實驗結果如下:
由該例子引出:
using System;
namespace ConsoleApplication1
{
///
/// Class1 的摘要說明。
///
class Class1
{
///
/// 應用程序的主入口點。
///
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此處添加代碼以啟動應用程序
Class2 c1=Class2.Init;
Class2 c2=Class2.Init;
c2.refDis();
Class3 c3=new Class3();
Class3 c4=c3;
c4.refDis();
Class3 c5=new Class3();
c5.refDis();
Console.ReadLine();
}
}
class Class2
{
static int ref_2=0;
private Class2()
{
++ref_2;
}
public static readonly Class2 Init=new Class2();
public void refDis()
{
Console.WriteLine("Class2 的引用: "+ref_2);
}
}
class Class3
{
static int ref_3=0;
public Class3(){++ref_3;}
public void refDis()
{
Console.WriteLine("Class3 的引用: "+ref_3);
}
}
}
輸出結果:
Class2 的引用: 1
Class3 的引用: 1
Class3 的引用: 2
看了上面的結果也許你會感到有些吃驚,也許不會,不是嗎?很多情況下,我們都試圖
來得到一個類的實例有多少?通常會想到的做法是實例計數器。是的,用一個static變量
來做實例計數器是在合適不過的了。可是,也有些時候,我們並不希望,我們的實例太多
如:DataRead它始終只有一個。那麼,我們該怎麼做呢?看到了上面我的實驗結果了嗎?
啊哏,發現什麼了嗎?public static readonly Class2 Init=new Class2();
對這一句很感興趣是嗎?你有什麼異議嗎?去掉那個static行嗎?那麼好吧,如你所願。
象這樣:public readonly Class2 Init=new Class2(); 讓我們看看會發生什麼,啊噢
瞧見了。沒辦法實例化操作了。呵呵。。。別擔心,讓我來進一步說明,static成員被
放在靜態存儲區,是在程序加載初期就完成配置的。那麼很顯然,Init的值,事實上是
在一開始,就new了一個對象給它。那麼它持有該對象的一個引用。下面讓我們看看這兩句
Class2 c1=Class2.Init;
Class2 c2=Class2.Init;
看上去沒什麼特別的,是啊,根據我上面的說法,這僅僅只是在傳遞引用。所以實例計數器
始終是一,因為,我說了,是在程序的一開始,就完成了配置。那麼下面的這幾句,就是最好
的說明:
//傳遞引用並未實例新對象,因此實例計數器依然是1
Class3 c3=new Class3();
Class3 c4=c3;
c4.refDis();
//分配了新的實例一次,實例計數器的值加1。也就是2
Class3 c5=new Class3();
c5.refDis();