C# 理解私有集访问器

C# 理解私有集访问器,c#,struct,private,C#,Struct,Private,如果我有一个结构 struct S { int I; } 在我的类中,我有这样一个访问器: class C { public S MyStruct {get; private set;} } 这是否意味着我仍然可以在C类之外修改结构的值?我能做什么 编辑:此处出错: C MyClass = new C(); C.S.I = 5; 或者结构的成员仍然受到私有修饰符的保护?属性getter将返回结构实例的副本,因为它是一个值类型,因此,即使您可以设置该副本的字段值,您无法将副本

如果我有一个结构

struct S
{
    int I;
}
在我的类中,我有这样一个访问器:

class C
{
    public S MyStruct {get; private set;}
}
这是否意味着我仍然可以在C类之外修改结构的值?我能做什么 编辑:此处出错:

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

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

属性getter将返回结构实例的副本,因为它是一个值类型,因此,即使您可以设置该副本的字段值,您无法将副本分配回属性,因此您实际上没有影响属性值。我甚至不确定编译器是否会因为这个原因接受该代码。不过,正如建议的那样,您可以自己测试它。

属性getter将返回结构实例的副本,因为它是一个值类型,因此,即使您可以设置该副本的字段值,也无法将副本分配回属性,因此您实际上没有影响属性值。我甚至不确定编译器是否会因为这个原因接受该代码。不过,正如建议的那样,您可以自己测试它。

私有setter只允许从类内部进行访问

例如:

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
会给您一个副本

示例(使用上述定义):

但是,这是允许的:

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

私有setter只允许从类内部进行访问

例如:

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
会给您一个副本

示例(使用上述定义):

但是,这是允许的:

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

当你尝试这样做时发生了什么?似乎你可以用5分钟和一个编译器来回答,但是不,私有setter不能保护属性值的内部位。我不是C#开发者,但是,
struct
是否意味着
属性
获取
类C
中的
获取值副本?因此,您的代码不会修改类
C
C MyClass=new MyClass()
中的
S
实例中的数据,这有什么作用呢???@Bathsheba尽管您不是C#开发人员,但您的确是对的。顺便说一句,这甚至不会编译,有几个原因:)当你试着这么做的时候发生了什么?似乎你可以用5分钟和一个编译器来回答,但是不,私有setter不能保护属性值的内部位。我不是C#开发者,但是,
结构
是否意味着
属性
获取
C类
中的值副本?因此,您的代码不会修改类
C
C MyClass=new MyClass()
中的
S
实例中的数据,这有什么作用呢???@Bathsheba尽管您不是C#开发人员,但您的确是对的。顺便说一句,这甚至不会编译,原因有几个:)在我发表评论时,它确实没有回答这个问题。而且。。。现在它是:)在我发表评论时,它确实没有回答这个问题。而且。。。现在它做到了:)