类中结构字段的保护级别

时间:2011-03-28 08:36:05

标签: c# struct visibility protection

我对C#编程很新,所以这可能是初学者的问题。

我得到“'A.Test.That.Fails'由于以下代码段中的保护级别”错误而无法访问,我无法理解原因。

namespace A
{
    class Test
    {
        public void Demo()
        {
            That[] it = new That[42];
            it[0].fails = 21;
        }

        public struct That
        {
            int fails;
        }
    }
}

来自C ++编程并且已经读过保护规则几乎相同,因为即使That结构和Demo方法都是{private结构,我也希望它能够工作。 {1}}。

正如旁注所示,非常感谢指向C ++程序员总结范围和保护规则的某个页面的链接。

5 个答案:

答案 0 :(得分:10)

其他答案已经有了答案,所以我不会在这里击败死马。您需要声明字段public才能从外部代码访问它。

在C ++中,结构和类是等价的,唯一的区别是它们各自成员的默认访问级别。

然而,在C#中并非如此。通常,您只应将结构用于不可变(不会更改)的小型短期对象。结构具有值类型语义,其中类具有引用类型语义。如果您正在学习使用C#编程,那么理解值类型和引用类型之间的区别非常重要。 Jon Skeet发表了an article,试图提供这种解释。但你肯定希望为C#找一本好的入门书,更详细地讨论这些问题。

通常,您需要在C#中使用类,而不是结构。当您使用该类时,请注意Microsoft的C#设计指南倾向于建议反对公开公共字段。相反,他们建议您使用由私有字段支持的公共属性。更全面地阐述该指南背后的基本原理here。例如:

class TimePeriod
{
    private double seconds;

    public double Seconds
    {
        get { return seconds; }
        set { seconds = value; }
    }
}

或者您可以使用更简单的“自动属性”语法,该语法使编译器自动生成该私有支持字段:

class TimePeriod
{
    public double Seconds { get; set; }
}

答案 1 :(得分:4)

C#中的结构字段(和类字段)的默认访问修饰符是private。因此int fails;对您的结构是私有的,除非您将其公开。

答案 2 :(得分:2)

请参阅this question

的答案

默认情况下,该成员被声明为私有 - 您需要在其前面加上public修饰符。

答案 3 :(得分:2)

由于fails不是public ..默认情况下,struct甚至class中的字段为private

根据MSDN

  

成员的访问级别 struct 成员(包括嵌套类和结构)是私有 默认即可。

答案 4 :(得分:1)

Test的私有成员限制测试本身,并且在Test之外不可用。演示不在测试范围内。父母是谁是无所谓。

在Test中定义Demo,您可以访问私有成员。