2014-10-07 404 views
0

這個問題可能看起來很愚蠢,但我想了解背後的概念,我在TestClass中有一個屬性(即TestNumber)。什麼是在課堂內調用屬性的正確方法?

public class TestClass 
{ 
    private uint testNumber=0; 
    public uint TestNumber 
    { 
     get { return testNumber; } 
     set { testNumber = value; } 
    } 

    public TestClass() 
    { 
     TestNumber = 0; 
     // or 
     testNumber = 0; 
    } 
} 

現在,如果我想setget類的外部屬性的值,我可以簡單地做到以下幾點,

TestClass tc = new TestClass(); 
tc.TestNumber = 10; 

但我的問題是,如果我想訪問這個屬性在同一個班級中,我有兩個選項 我可以使用

testNumber = 0;

TestNumber = 0;,所以哪一個是正確的&爲什麼?

謝謝!

+2

兩者都是合法的。但是如果你使用屬性,那麼* setter *代碼將被執行。此問題(或類似問題)已經[問](http://stackoverflow.com/q/295104/1997232)。 – Sinatr 2014-10-07 12:28:31

回答

2

取決於你想要做什麼......

  • 你想直接設置變量?
  • 你想調用setter邏輯嗎?

的電流設定沒有做什麼特別的:

set { testNumber = value; } 

哪天威力。如果類中有任何大量的邏輯,那麼可能需要更新該邏輯,以便在該時間到來時使用setter而不是變量。相反,然而,一些的類內部的邏輯可能明確而不是想要使用setter的邏輯,並可能想要繼續直接設置變量。

封裝很有趣,因爲類中的任何東西都可以選擇執行兩者,而其中的不同邏輯可能試圖實現非常不同的事情。

作爲個人喜好的事情,我經常喜歡使用命名約定,暗示變量是我不想直接設置的變量。我見過的最常見的慣例是用下劃線前綴:

private uint _testNumber = 0; 

按照慣例上,我們把它作爲一個指標,這個變量並不意味着直接設置了球隊,所以任何事情需要直接設置它是顯而易見的,顯然這樣做,即使只是隨便看一眼代碼。 (這也有助於intellisense,因爲如果有人試圖設置「測試編號」,那麼當一個類型名稱的智能感知將默認爲屬性,而不是變量)

1

儘管兩者都是有效的,後者是更好,因爲你可以使用setter/getters邏輯(如果它更多,然後簡單地返回/設置後場的值)。因此,對於您的會員,您只有一個訪問點,而不是許多可能的訪問點。

1

幾乎99%的時間你想使用的屬性。爲什麼?
它的簡單性能使您可以在場景背後添加邏輯,而代碼像以前一樣繼續工作。
通過使用該屬性,您可以節省自己在更新其他部分時錯過某些部分的頭痛感,在您使用課程中的任何位置傳播邏輯。
你有沒有想過爲什麼在c#中引入自動屬性?
其中一個原因是它允許您使用該屬性,隨意暴露它,並繼續編寫應用程序的其餘部分,然後如果您需要在其中編寫一些邏輯,則可以在不中斷的情況下有效地執行該操作現有的代碼!這只是感覺像普通的田野。你只需在第一個地方寫下房產,然後按照你的意願去做。

Have a look at here too.它可能有幫助。

相關問題