2009-06-09 115 views
23

我正在檢查log4net的一些代碼,並且遇到了這個問題。C#私有,靜態和只讀

private static readonly ILog logger = LogManager.GetLogger(typeof(AdminClient)); 

我想知道爲什麼你需要有私有靜態只讀。

從我的理解私人意味着變量不能在類之外使用,除非有訪問方法或獲取屬性。

靜態意味着該變量僅在該文件中有作用域。

只讀將意味着您只能讀取值並且不能分配它。

所以,我在想這個代碼寫的人。因爲他們不希望它在類之外使用並且是靜態的,所以不希望它在文件外部使用。然而,如果有一個get屬性會靜態阻止這種形式的發生。

我想我可以理解readonly,值只能從中讀取而不能設置。

非常感謝任何建議,

+0

這一特定模式的一個有趣的題外話:我曾經宣稱這是'保護靜態只讀「,併爲我贏得了」[CA2104](https://msdn.microsoft.com/en-us/library/ms182302.aspx):不要聲明只讀可變引用類型「來自VS代碼分析的警告。如「[here](http://stackoverflow.com/a/15745885/268066)所述,」受保護的readonly`字段並不是那麼清楚,作爲`protected`,您可能期望派生類可以初始化該字段。「 將聲明更改爲`private static readonly`固定了這個。 – CrazyPyro 2015-04-13 14:50:32

回答

45
  • 私人任何人都不應使用類(甚至在子類)外的記錄器領域,如果不設置任何相關的類可以使用記錄儀登錄你的班級名稱。
  • 靜態屬性是連接到類,所以它不會重複與類的每個實例。如果你沒有設置這個,記錄器屬性將佔用系統對該對象的每個實例的內存空間(你誤解了這個)。
  • 只讀不應修改記錄器字段。
+0

很好,你在這裏全都很清楚 – 2009-07-23 04:02:11

6

靜態不意味着它不能從其他文件被訪問 - 這不是C. static關鍵字意味着記錄器對象是類變量,而不是一個實例變量,所以即使從被訪問時該類的不同對象,它們都將引用相同的記錄器對象。

9

我認爲你誤解靜態。靜態並不意味着「不能在文件外使用」。靜態意味着:每個班級都有一個。這個聲明所做的就是創建一個只能分配一次(靜態)的記錄器,只能在類中使用(不在派生類中)(私有),並且不能寫入過度初始化(只讀)。

雖然好問題!

2

c#中的static表示成員與類關聯,而不是與類的實例關聯。只讀是很重要的,因爲在c#中,大多數變量都是參考變量。 readonly表示這個變量總是引用相同的記錄器。

1

A 只讀變量與const非常相似,因爲變量在整個生命週期中都是不變的。區別在於只讀變量在運行時被初始化,const在編譯時。靜態按照外行的術語來說,表示變量的實例不依賴於它聲明的對象的實例。它的生存期從函數調用到函數調用仍然存在。靜態變量訪問速度更快,因爲其存儲在整個程序期間都保持分配。所以知道這一點,我們可以回到你的問題。

爲什麼'記錄器'是一個靜態成員?這是一個設計決定。我需要知道你是如何使用它來回答這個問題的。爲什麼只讀?因爲它看起來像是初始化了一次,並且它的實例始終在使用。我們可以確保沒有其他人在我們初始化它之後立即將其設置爲「只讀」,從而篡改記錄器的價值。

2

開發者說的是當他們在這個類的任何實例中調用logger.Info(...)時,他們想要使用一個公共(靜態)實例(因此不需要創建一個新的記錄器類實例),他們希望確定它自創建(readonly)以來沒有發生變化,並且如果我們在派生類中的虛函數中,那麼我想確保我不會錯誤地使用基類(私人的)。

1

在一個私有變量上放置一個只讀標誌的原因是聲明變量總是引用同一個對象。 這是真的,是私人使得它無形的給類以外的任何人,但這樣一來,我們可以確保我們沒有不期而遇覆蓋變量,一個新的對象,通過編寫類似

logger = LogManager.GetLogger(typeof(AdminClient)); 

別的地方我們類。隨着只讀它只是將不會編譯(除非它是以前沒有初始化,我們在(靜態)構造函數)

1

靜態變量落在「類變量」的類別,一類變量是一個有另一方面,實例變量是與類對象相關聯的變量,每當類對象被初始化時,該對象將具有其自己的該「實例變量」(非靜態)的副本,而靜態變量在運行類似於鏈接列表大小的程序的所有對象中共享。 readonly是用於使變量只讀的c#關鍵字,java不提供這樣的功能,您必須編寫一個公共方法來訪問您不想獲取的變量回火。

0

對不起,我知道這已經回答了,這真的老了,但我想讓任何人誰碰到這個文章來源於知道這是你如何建立一個「辛格爾頓」的格局。任何想了解問題中代碼示例的人都可能從學習更多關於單身人士及其使用方式(調解員,記錄員,異步回調等)中受益。關於單身
http://msdn.microsoft.com/en-us/library/ff650316.aspx
http://msdn.microsoft.com/en-us/library/ff650849.aspx

//母艦東西//關於他們非常大,所以討論
What is so bad about singletons?