类中结构字段的保护级别

Jul*_*ult 9 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

来自C++编程,并且已经读过保护规则几乎相同,因为有一个类我会期望它能够工作,即使That结构和Demo方法都是如此private.

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

Cod*_*ray 10

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

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

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

通常,你会想要在C#中使用一个类,而不是一个结构.当您使用该类时,请注意Microsoft的C#设计指南倾向于建议不要暴露公共字段.相反,他们建议您使用由私有字段支持的公共属性.这里给出了对该指南背后的基本原理的更全面的阐述.例如:

class TimePeriod
{
    private double seconds;

    public double Seconds
    {
        get { return seconds; }
        set { seconds = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

class TimePeriod
{
    public double Seconds { get; set; }
}
Run Code Online (Sandbox Code Playgroud)