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#开发人员,但您的确是对的。顺便说一句,这甚至不会编译,原因有几个:)在我发表评论时,它确实没有回答这个问题。而且。。。现在它是:)在我发表评论时,它确实没有回答这个问题。而且。。。现在它做到了:)