程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 由實例計數器引出(C#)

由實例計數器引出(C#)

編輯:C#入門知識

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved