2014-04-01 122 views
0

如果我有一個結構瞭解私人set訪問

struct S 
{ 
    int I; 
} 

,並在我的課我有一個這樣的訪問:

class C 
{ 
    public S MyStruct {get; private set;} 
} 

這是否意味着我仍然可以修改該結構的值在C類之外?我可以做 編輯:犯了一個錯誤的位置:

C MyClass = new C(); 
C.S.I = 5; 

或由私營修改仍然受到保護的結構的成員?

+7

當你嘗試過什麼事? – DaveParsons

+0

好像你可以用5分鐘的時間和一個編譯器回答一些問題,但不是,私人設置者不能保護屬性值的內部位。 – asawyer

+2

我不是C#開發人員*但*,不'結構'是否意味着'C類'中的屬性'get'獲取值副本?那麼你的代碼不會修改'C'類中'S'實例的數據? – Bathsheba

回答

3

私人二傳手只允許在課堂上進行訪問。

例子:

struct MyStruct { public int I; } 
class MyClass { public MyStruct S {get; private set;} } 
MyClass C = new MyClass(); 
C.S = new MyStruct(); // not allowed as private setter 

當您訪問的MyStructS.I你有class和struct區分一員!如果MyStruct是一個類,您將能夠更改其值並影響S的成員變量。如果它是一個結構體,則不能更改該值,因爲S.I會爲您提供副本。

例子(使用上面的定義):

C.S.I = 5; // not allowed as MyStruct is a struct 

但是這是允許的:

class MyStruct { public int I; } // it is a class now! 
class MyClass { public MyStruct S {get; private set;} } 
MyClass C = new MyClass(); 
C.S.I = 5; // allowed even though setter for S is private 
+0

在我評論的時候,它確實沒有回答這個問題。和...現在它:) –

1

屬性getter將返回結構實例的一個副本,因爲它是一個值類型,所以即使您可以設置該副本的字段值,也不能將該副本分配回屬性所以你並沒有真正影響財產價值。我甚至不確定編譯器會因爲這個原因而接受這些代碼。正如所暗示的那樣,你可以爲自己測試一下。