由例項計數器引出(C#) (轉)

worldblog發表於2007-12-15
由例項計數器引出(C#) (轉)[@more@]

由例項計數器引出()

好久沒發表文章了,說也有趣,突然感覺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();

一切都和想象中的一樣。我想,這就是生活。盡情享受,毫無疑問,這是對的。那麼下回再見
(完)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993844/,如需轉載,請註明出處,否則將追究法律責任。

相關文章