如果我有结构
struct S
{
int I;
}
在我的班上我有一个这样的访问者:
class C
{
public S MyStruct {get; private set;}
}
这是否意味着我仍然可以在C类之外修改结构的值?我可以吗 编辑:这里犯了一个错误:
C MyClass = new C();
C.S.I = 5;
或者结构的成员是否仍受私有修饰符保护?
答案 0 :(得分: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
当您使用MyStruct
访问S.I
的成员时,您必须区分类和结构!如果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
答案 1 :(得分:1)
属性getter将返回结构实例的副本,因为它是一个值类型,因此,即使您可以设置该副本的字段值,也无法分配副本回到酒店,所以你实际上并没有影响房产价值。由于这个原因,我甚至不确定编译器是否会接受该代码。如上所述,您可以自己测试一下。