2012-09-03 117 views
0

如果我想在一個私有類中設置我的屬性,所以它應該只能在這個類中使用和設置這個屬性,有什麼更好的方法?這財產:私人方法或私人獲取/設置?

public string Name { private get; private set } 

private string Name { get; set } 

嗯並且還有

private string Name { private get; private set } 
+0

你要設置的屬性類的私有變量? –

+0

@KundanSinghChouhan是的,我是這麼認爲的......不知道我得到它,你想^^ – silla

+0

@Sila我已經加了我的答案。看一看。 –

回答

5

你試過編譯你的例子嗎?只有中間的一個會翻譯。

如果要指定額外的輔助功能級關鍵字,則只能在其中一個訪問器(getter/setter)上執行此操作,並且該訪問器的該級別必須比整個屬性的可訪問性更具限制性。

在這裏,你看到的規則:Restricting Accessor Accessibility

+0

是的,你是對的。不知何故,我不能編譯,如果使用私人獲得;私人設置只有當我使用私人獲得或設置 – silla

+0

@silla這是因爲你設置屬性與一個訪問修飾符,同時設置所有可能的訪問器與另一個。使用get和set private將其設置爲公共部分否定公共部分,所以它不會編譯。如果你把它設置爲私有,獲取和設置是自動私有的,因此沒有必要將它們設置.... –

0

更好的方法取決於你想要什麼:

public string Name { private get; private set }該物業是public沒有人可以閱讀或寫信給它,除了課堂本身。那完全沒用,所以只用 private string Name { get; set }

一般來說,如果你查看像情侶的方法(這實際上是)該財產

private string get_Name() { } 

private string set_Name(value) { } 

具有以應用標識符屬性get/set變得明顯,我希望有可能的原因。

+0

@downvoter:謹慎解釋? – Tigran

+0

僅供參考,我不是downvoter。我想你的意思是'私人無效set_Name(字符串值){}'。 –

+0

'public string Name {private get;私人設置; }'不會編譯'無法爲屬​​性或索引器'Program.Name''的訪問器指定可訪問性修飾符' – Alex78191

1
public string Name { get; private set; } 

這是我認爲你想要做的。

除非你只想讓你的班級看到它,否則在財產公開的時候試圖讓私人獲得私密是沒有意義的。在這種情況下,你應該使用:

private string Name { get; set; } 

更新:在二讀,你一定要在第二個例子。

12

值得一提的是原本,C#不會讓你設置一個getter或setter不同的接入,所以唯一可能的選擇是:

public string Name { get; set; } 
protected internal string Name { get; set; } 
internal string Name { get; set; } 
protected string Name { get; set; } 
private string Name { get; set; } 

(就此而言,你不能擁有自動屬性,並且總是必須自己寫一個支持字段,但是我們會忽略它,僅僅因爲我們會用這種方式來縮短範例)。

這是有不同的接入兩個,最常見的是更嚴格的setter比吸氣經常有用的。因此,

public string Name { get; private set; } 

喜歡被引入。現在

,通過該擴展,這似乎合乎邏輯,足以讓:

public string Name { private get; private set; } 
private string Name { private get; private set; } 

然而,這兩個是表達?

第二個是不是太糟糕了,這只是無謂地重複。儘管如此,很可能一些混淆的想法讓我們在那裏(很可能是不完整的重構)。好的代碼和表達你在做計算機做什麼(如果有的話,更是如此)所做的一樣,更好地表達清楚。

因此,如果你最終得到{ private get; private set; }這樣的結果,那麼它很可能是值得再次考慮並思考你真正想在這裏說些什麼的。華友世紀因爲它是一個編譯器錯誤。

釷第一種情況更是雪上加霜。它說:「這個屬性是公開的,除了私有的setter和私有的getter。」這不是一個例外,「這是一件事,除了所有的時間」都不是真正的表達。雙倍支持編譯器不讓我們這樣做。

+0

只要是迂腐:如果不指定一個getter或setter不同的訪問權限,有五分之一的可能性:'保護內部字符串名稱{get;組; }' –

+0

@JeppeStigNielsen是的。我認爲'受到保護的內部'的一半概念並不在C#1.0中,後來纔出現,但是快速搜索似乎表明它始終存在。 –

+0

'內部'現在意外''私人'。 –

0

如果你真的想你的要求,那麼你並不需要的屬性,你應該使用private場。

0

對於私有成員,你並不需要定義存取。 只是這樣做:

private string _name;