如果我有一個結構瞭解私人set訪問
struct S
{
int I;
}
,並在我的課我有一個這樣的訪問:
class C
{
public S MyStruct {get; private set;}
}
這是否意味着我仍然可以修改該結構的值在C類之外?我可以做 編輯:犯了一個錯誤的位置:
C MyClass = new C();
C.S.I = 5;
或由私營修改仍然受到保護的結構的成員?
如果我有一個結構瞭解私人set訪問
struct S
{
int I;
}
,並在我的課我有一個這樣的訪問:
class C
{
public S MyStruct {get; private set;}
}
這是否意味着我仍然可以修改該結構的值在C類之外?我可以做 編輯:犯了一個錯誤的位置:
C MyClass = new C();
C.S.I = 5;
或由私營修改仍然受到保護的結構的成員?
私人二傳手只允許在課堂上進行訪問。
例子:
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
當您訪問的MyStruct
像S.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
在我評論的時候,它確實沒有回答這個問題。和...現在它:) –
屬性getter將返回結構實例的一個副本,因爲它是一個值類型,所以即使您可以設置該副本的字段值,也不能將該副本分配回屬性所以你並沒有真正影響財產價值。我甚至不確定編譯器會因爲這個原因而接受這些代碼。正如所暗示的那樣,你可以爲自己測試一下。
當你嘗試過什麼事? – DaveParsons
好像你可以用5分鐘的時間和一個編譯器回答一些問題,但不是,私人設置者不能保護屬性值的內部位。 – asawyer
我不是C#開發人員*但*,不'結構'是否意味着'C類'中的屬性'get'獲取值副本?那麼你的代碼不會修改'C'類中'S'實例的數據? – Bathsheba