2013-02-27 58 views
0

我碰到這個代碼就來了:爲什麼可以直接引用此類及其成員?

pc = new PendingCommands(pause, wait); 
PendingCommands.ProcessCommands = true; 

我不知道兩件事情:

1)沒有編碼器的意思寫:pc.ProcessCommands =真的嗎?

2)爲什麼第二行甚至被允許? PendingCommands沒有標記靜態...

如果我用鼠標右鍵單擊「計算機」,選擇「轉到定義」或「轉至聲明」,就需要我在這裏(在同一類/文件):

public static PendingCommands pc = null; 

如果我用鼠標右鍵單擊「PendingCommands」(無論從點),然後選擇「轉到定義」或「轉至聲明」,就需要我在這裏(在一個單獨的類/文件):

public class PendingCommands : IDisposable 

「ProcessCommands」成員在「PendingCommands」類中定義ss這樣:

public volatile static bool ProcessCommands = true; 

我錯過了什麼嗎?

+0

'編碼器的意思是寫:pc.ProcessCommands = true?'不,他沒有。 'PendingCommands不是標記爲靜態的'是的,但是'ProcessCommands'被聲明爲靜態的並且屬於類,而不是對象。 – 2013-02-27 20:16:09

回答

2

看看這個:

public volatile static bool ProcessCommands = true; 

注意如何ProcessCommands是靜態的。這意味着它與類型(PendingCommands)有關,而不是該類型的實例。

這幾乎肯定不是一個好的設計(公共領域很少的,靜態的可變領域很少有,揮發性領域很少有),但它解釋了爲什麼它的優良寫PendingCommands.ProcessCommands = true;

很難知道它是否真的意思是是靜態的 - 不管它只是一個錯誤,或者它是否被設計成沒有更多信息,不幸的是。 (我會擔心使用只是場的基礎上,這個類,但是......)

注意你提到「PendingCommands沒有標記靜態」 - 這不是的類必須是靜態的。靜態類只是一個靜態成員,並且不能實例化(或用作變量類型等)。這是你正在訪問的會員這很重要。

1

即使類本身不是static,也可以通過類名訪問任何類的static字段。

1

1)這是錯的嗎?編碼員的意思是寫:pc.ProcessCommands = true

可能 - 沒有完整的文檔PendingCommands沒有辦法知道。

2)爲什麼第二行甚至被允許? PendingCommands未標記爲靜態...

PendingCommands類可以不被標記爲static,但ProcessCommands屬性。

+0

文檔?!?哈!完整的文檔?!? ROTFLMAO。 – 2013-02-27 21:07:46

1

ProcessCommands可以訪問,因爲它是static。刪除static關鍵字,它只能在類的實例中訪問。即pc

PendingCommands.ProcessCommands = true可能是一個錯誤,除非打算將PendingCommands用作單例。也就是說,只打算成爲該類的一個實例,因此靜態方法ProcessCommands將處理其唯一實例的所有「命令」。

相關問題