了解私有集访问器

时间:2014-04-01 12:25:00

标签: c# struct private

如果我有结构

struct S
{
    int I;
}

在我的班上我有一个这样的访问者:

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

这是否意味着我仍然可以在C类之外修改结构的值?我可以吗 编辑:这里犯了一个错误:

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

或者结构的成员是否仍受私有修饰符保护?

2 个答案:

答案 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将返回结构实例的副本,因为它是一个值类型,因此,即使您可以设置该副本的字段值,也无法分配副本回到酒店,所以你实际上并没有影响房产价值。由于这个原因,我甚至不确定编译器是否会接受该代码。如上所述,您可以自己测试一下。