2014-07-22 23 views
2

對不起,關於最後的帖子...這是另一個。關於c的點(。)運算符#

到目前爲止,我似乎人們使用運營商(。):

結構的

(1)進入構件

(2)訪問靜態/恆一類的成員

( 3)訪問字面一個枚舉類型

的(例如,那些dayofweek.cs http://referencesource.microsoft.com/#mscorlib/system/dayofweek.cs

的withou t具有該結構/類/對象的對象/實例

我知道操作符的含義可以取決於其操作數;

但其中一些看起來有點奇怪。

例如,在(3)的情況下:

在C#,我可以寫: DayOfWeek a; if (a == DayOfWeek.Sunday) *do something...*;

但是在C中,我只能寫: DayOfWeek a; if (a == Sunday) *do something...*

對於另一個例子,在的情況下,(1):

在C中,之後,纔會具有這樣的結構,我們可以做操作到其構件的實例;

但在C#,就像在https://stackoverflow.com/questions/24888864/two-things-about-source-code-of-struct-datatime-in-c-sharp,我們可以直接使用名稱(例如,DataTime)的結構來訪問它的成員(即Maxticks),即DataTime.Maxticks

有明顯的差一些,右?

我在哪裏可以閱讀此操作的詳細教程或文檔,說明如何使用此操作?只有語言規範?

**我實際上並不喜歡通過逐個使用這個操作的例子來學習,因爲他們沒有告訴我「如何使用它」,而只是「我能做什麼用它」;雖然這兩個是不同的。

+1

閱讀靜態關鍵字。 –

+1

我建議您閱讀[幫助](http://stackoverflow.com/help/)部分[我可以詢問什麼主題?](http://stackoverflow.com/help/on-topic)。 –

+0

這是關於作用域... [instanceName]。[instanceMember],[ClassName]。[StaticMember],[EnumName]。[EnumMember],this。[CurrentInstanceMember] - 左側定義範圍。基本上總是意味着「在左側範圍內」,然後右側是您嘗試訪問的範圍的哪一部分。 – Tim

回答

1

正如您所注意到的,.運算符用於訪問成員。

如果該成員標記爲static,那麼可以通過類名引用它,因爲類中只有一個靜態「實例」(並且由運行時實例化)。這就是你所看到的DateTime.MaxTicks

枚舉不是static,但它們的成員以相同的方式訪問,因爲您需要合格具有枚舉名稱的成員名稱。從C#規範(V 5.0,部分14.3):

從所有其它代碼,枚舉成員的名稱必須以 其枚舉類型的名稱限定。枚舉成員沒有任何已聲明的 可訪問性 - 如果可以訪問包含枚舉類型 的枚舉成員,則該枚舉成員是可訪問的。

.的一個用途是限定某些內容(例如,當您明確聲明某個類將從哪個命名空間中出來時)。

基本上,只要你想訪問某個東西的成員就可以使用.。只要知道它是一個實例還是靜態變量,就會知道是否需要該類型的實例,或者是否可以使用類名稱。 .也可以用來限定某些東西的名稱,當爲類指定名稱空間或使用枚舉時使用該名稱。

+0

「枚舉不是'靜態的,但它們的成員以相同的方式訪問」這是我的問題的地方......在哪裏可以找到這個規則????? –

+0

@ J.C。添加了一些關於''的內容。運算符被用於名稱限定,並且規範的相關部分指出這是枚舉所必需的。希望這有助於! – BradleyDotNET

+0

再次感謝您!在發佈評論之後,我查看了一些做枚舉變量賦值的例子,並且認爲這樣的限定是必要的。我也試圖在C中產生相同的情況,但我失敗了; C不允許出現這種情況(即賦予不同的枚舉成員相同的名稱),而C#則可以。儘管如此,在C#中這個資格(在enum成員訪問中)看起來是非常必要的,即使在這種情況下也是如此,這裏可能是對lang設計的一種折衷! –

0

在C中,只有我們有一個結構的實例,我們才能對其成員做 操作;

但在C#,就像在約結構 DATATIME的源代碼在c#兩件事情,我們可以直接使用 結構的名稱(即,DATATIME)來訪問它的構件(即,Maxticks),即,DATATIME .Maxticks

顯然有一些區別吧?

我們可以使用類的名稱,然後點,我們要打電話,當類的方法是static方法的方法。在這種情況下,該方法屬於類,而不屬於我們使用new關鍵字創建的對象。

從C#規格:

的方法是一種用於實現可以通過 對象或類執行的計算或操作的部件。通過類訪問靜態方法 。實例方法通過類的實例 來訪問。

一個關於static關鍵字最好的解釋可以MSDN找到。

至於在C#中訪問struct的成員,您可以使用與C#中的class的成員相同的運算符(點運算符)。這就是爲什麼你需要DayOfWeek.Sunday的原因。

+0

非常感謝...但是對於DayOfWeek部分,DayOfWeek是枚舉,而不是類;我在哪裏可以找到一個官方文檔,說「星期天」是枚舉DayOfWeek的七個值之一,可以使用'DayOfWeek.Sunday'檢索?畢竟,這似乎不被允許在C? –

+0

@ J.C。你歡迎老兄。鏈接http://msdn.microsoft.com/en-us/library/system.dayofweek(v=vs.110).aspx提供了您正在查找的文檔。請讓我知道,如果有幫助。謝謝 – Christos

+0

非常感謝您的幫助!根據人們對我的反饋以及我最近的經驗,MSDN是一個C#程序員(特別是像我這樣的初學者)可以獲得大量信息並珍愛這門語言的地方。關鍵是如何使用它!對於這個問題,真正的問題可能是:檔案成員訪問範圍,明確的解決方案和資格。 –

0

認爲它是導航命名空間。你的項目結構可能是:

  • MyApp的
    • 形式
      • 的MainForm
        • ShowForm()
        • ISOPEN()
      • SomeClass的
        • SomeStaticMethod()
        • NonStaticMethod()
      • OtherClass
        • SomeEnum
          • EnumValueOne
          • EnumValueTwo
      • ThisRepo

所有這一切都將被調用,進口,或訪問使用點符號類似的方式,儘管他們不同的目的和結構。在MainForm上調用靜態ShowForm() void將會是MyApp.Forms.MainForm.ShowForm(),就像引用OtherClass中的枚舉一樣,將會像MyApp.Classes.OtherClass.SomeEnum.EnumValueTwo一樣完成。

當您向您的課程添加using聲明時,您顯然不需要執行完整限定名稱空間,但希望這會顯示該概念。