Struct - 访问私有字段

时间:2012-02-14 20:04:01

标签: c# struct

为什么它不会产生错误?如果我尝试在主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.  
    }
}

7 个答案:

答案 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。此结构可以从相同类型的结构中访问私有成员。

正如其他人所指出的那样,这种行为对于类类型也是一样的。