a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C# > 正文

C# 靜態變量與靜態方法實例研究

2020-01-24 03:42:43
字體:
來源:轉載
供稿:網友
程序如下:
復制代碼 代碼如下:

public static string 英漢(string english,翻譯結果 一個或多個)
{
string 英漢辭典 = Settings.Default.辭典所在目錄+"haou_dict.xml";
try
{
if (File.Exists(英漢辭典))
{
XDocument dictionary = XDocument.Load(英漢辭典);
var query = from p in dictionary.Descendants("Name")
where p.Value.ToLower() == english.ToLower()
select p.Parent.Element("Content");
if (query.FirstOrDefault() == null)
{
return null;
}
else//可以翻譯
{
if (一個或多個==翻譯結果.多個)
{
return query.FirstOrDefault().Value.Trim();
}
else if (一個或多個 == 翻譯結果.一個)
{
return 得到第一個漢字詞(query.FirstOrDefault().Value);
}
throw new Exception("參數錯誤!");
}
}
else
{
throw new Exception("詞典文件不存在!");
}
}
catch (Exception)
{
throw new Exception("詞典文件出錯!");
}
}

分析了一下,原因在于每次調用這個方法時都會去載入黃條處這個英漢辭典,如果執行2000次,就會載入2000次,自然速度慢,有沒有什么辦法在程序運行時只載入一次呢?想起在尚學堂看過的設計模式中有一個單例工廠模式,使用了靜態變量,似乎能夠解決,實例驗證:
先定義一個類:
復制代碼 代碼如下:

class 翻譯{
public static XDocument 英漢辭典內容 = 英漢辭典初始化();
public XDocument 構造英漢辭典內容;
public 翻譯()
{
構造英漢辭典內容 = 英漢辭典初始化();
}
public static XDocument 英漢辭典初始化()
{
if (File.Exists(英漢辭典文件))
{
return XDocument.Load(英漢辭典文件);
}
else
{
throw new Exception("英漢詞典文件不存在!");
}
}
}

主程序:
復制代碼 代碼如下:

var one = 翻譯.英漢辭典內容;
var two = 翻譯.英漢辭典內容;
if (one==two)
{
MessageBox.Show("相同");
}
else
{
MessageBox.Show("不同");
}
one = new 翻譯().構造英漢辭典內容;
two = new 翻譯().構造英漢辭典內容;
if (one == two)
{
MessageBox.Show("相同");
}
else
{
MessageBox.Show("不同");
}

結果:

image

 

image

分析如下:
無論是使用靜態的翻譯.英漢辭典內容,還是new 翻譯().構造英漢辭典內容,他們都調用了 英漢辭典初始化() ,但是靜態變量中的值只會初始化一次,后面每次訪問,都是上次處理過的值,所以第一次顯示的結果是相同,也就是說one,two的值其實是一個,第二個two訪問的其實是第一次one初始化后的值;而使用類的構造函數來初始化變量每次都會重復初始化,自然其結果不同.
再比如(以下內容為轉載):
復制代碼 代碼如下:

class Program
{
static void Main(string[] args)
{//輸出未經定義的靜態變量,結果為0;也說明了,在C#中未賦初值的變量系統自動賦為0
Console.WriteLine(sort.i);
//靜態變量的訪問方法(類名.靜態變量名),而且還可以在外部操作靜態變量呢,可見靜態變量并不神秘;
sort.i = 5;
//輸出5
Console.WriteLine(sort.i);
//還可以通過構造函數對靜態變量初值呢,呵
sort sortTest = new sort();
//輸出構造函數中的賦值 3;
Console.WriteLine(sort.i);
}
}
class sort
{
public static int i;
public sort()
{
i = 3;
}
}

總結:在類內部訪問靜態變量時,直接用靜態變量名即可,不用以(類名.靜態變量名),這樣的方式訪問,
除了有靜態變量之外,還有靜態類實例,還有靜態方法.但用法都是大同小異;
如:public static void myFun(){} //靜態方法
private static Random MyRandom=new Random(); //靜態類實例
之所以有時聲明為私有靜態變量,是為了讓它只初始化一次.這樣節省了內存空間
但又想讓它在外部是不可訪問的,這樣利用私有這個訪問限定符就搞定了.
私有靜態:安全又節省空間.
例:如果想在每次實例化類的時間生成一組隨機數,但產生隨機數是要用到一個類的,即Random,這個類不是靜態類,它要產生實例,用產生的實例來生成隨機數,但如果在每次類實例化時都產生一個Random實例,那內存空間簡直是極大的浪費,所以可以用:
private static Random MyRandom=new Random();
這樣每次類實例化時,都會用同一個Random實例MyRandom來產生隨機數
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 亚洲欧美一区二区三区久久 | 亚洲欧洲精品一区二区三区 | 高清av在线 | 99国产精品99久久久久久 | 久久9久| 日本精品视频在线观看 | 成人av观看| 日韩爱爱网 | av在线不卡播放 | 免费黄色看片 | 午夜免费观看视频 | 日韩一区精品 | 精品久久一区 | 日韩av一区二区三区在线 | 可以免费在线看黄的网站 | 狠狠亚洲| 九九久久精品 | 久久青青 | 在线亚洲精品 | 国产精品一区欧美 | 日韩a∨ | 日韩一区二区三区精品 | 伊人网综合在线 | 国产精品久久一区二区三区 | 国产福利在线视频 | 亚洲精品日韩激情在线电影 | 爱爱视频在线免费观看 | 欧美黄色网络 | 欧美伦理一区二区 | 一区综合 | 色婷婷综合久久久久中文一区二 | 黄色a视频| 一级在线观看 | 久久久国产精品入口麻豆 | 人人爱干| 欧美成人h | 久久久久久一区 | 国产成人精品无人区一区 | 欧洲毛片 | 亚洲免费一级片 | 亚洲激情第一页 |