为什么它不会产生错误?如果我尝试在主progrm文件中更改此结构的私有字段,则会生成错误,但不会在结构实现中生成错误。
public struct MyStruct
{
private int privateField;
public int MyField
{
get { return privateField; }
set { if (value >= 0) privateField = value; else value = 0 }
}
public void SomeMethod (MyStyruct s)
{
s.privateField = 10; // no error here.
}
}
答案 0 :(得分:6)
私人成员仅限于类或 struct 而不是对象。在这种情况下,即使s
是与this
不同的对象,它仍然有效。
答案 1 :(得分:4)
这种行为并非特定于结构 - 它也适用于类。
private
表示该字段只能在该类型中访问。它并不意味着仅在类型"的相同实例中暗示"。
鉴于您尝试从同一类型中访问私有字段,即使它是同一类型的不同实例,private
应该允许访问。
答案 2 :(得分:3)
private
表示它只能在struct
的范围内使用。它是一个访问修饰符,表示此变量的访问级别,private
仅对struct
本身。{/ p>
您应该使用您的属性在结构之外更改它,例如在main
中。
您的方法SomeMethod
是结构的一部分,因此您可以更改其私有成员。
虽然,你访问它的方式有点不寻常。
答案 3 :(得分:3)
首先,这与它是一个结构还是一个类无关 - 或者实际上它是一个字段还是其他成员。
C#中的可访问性取决于代码的位置,而不是它是“此对象”还是其他对象。
有关详细信息,请参阅C#规范的第3.5节。例如,从3.5.2开始:
成员的辅助功能域包含允许访问该成员的程序文本(可能是不相交的)部分。
[...]
如果
M
的声明可访问性为private
,则M
的辅助功能域是T
的程序文本。
答案 4 :(得分:1)
因为SomeMethod
是结构本身的一个方法。您不会在类上收到错误 - 允许本地成员修改私有字段。
答案 5 :(得分:1)
private
修饰符表示只能从其类型中访问成员。它不会限制对其实例的访问。
答案 6 :(得分:1)
这是允许的,因为传入的类型也是MyStruct。此结构可以从相同类型的结构中访问私有成员。
正如其他人所指出的那样,这种行为对于类类型也是一样的。