Уровень защиты структурного поля в классе - PullRequest
9 голосов
/ 28 марта 2011

Я довольно новичок в программировании на 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.

Как примечание, мы будем очень благодарны за ссылку на некоторую страницу, обобщающую правила области видимости и защиты для программиста C ++.

Ответы [ 5 ]

10 голосов
/ 28 марта 2011

В других ответах уже есть ваш ответ, поэтому я не буду бить здесь мертвую лошадь. Вам необходимо объявить поле public, чтобы получить доступ к нему из внешнего кода.

В C ++ структуры и классы эквивалентны, единственное отличие состоит в уровне доступа по умолчанию их соответствующих членов.

Однако в C # дело обстоит иначе. Как правило, вы должны использовать структуру только для небольших, недолговечных объектов, которые являются неизменяемыми (не изменится). Структура имеет тип значения семантика, где как класс имеет ссылочный тип семантика. Очень важно понимать разницу между типами значений и ссылочными типами, если вы учитесь программировать на C #. Джон Скит опубликовал статью , которая пытается дать такое объяснение. Но вам наверняка захочется подобрать хорошую вводную книгу по C #, в которой эти вопросы рассматриваются более подробно.

Чаще всего вы захотите использовать класс в C #, а не структуру. И когда вы используете этот класс, обратите внимание, что руководящие принципы Microsoft по разработке для C # обычно рекомендуют против раскрытия открытых полей. Вместо этого они рекомендуют вам использовать публичное свойство, подкрепленное приватным полем. Более подробное изложение обоснования этого руководства дано здесь . Например:

class TimePeriod
{
    private double seconds;

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

Или вы можете использовать более простой синтаксис "автоматических свойств", при котором компилятор автоматически создает это частное поле поддержки:

class TimePeriod
{
    public double Seconds { get; set; }
}
4 голосов
/ 28 марта 2011

Модификатор доступа по умолчанию в C # для структурных полей (и полей классов): private. Так что int fails; является приватным для вашей структуры, если вы не объявите ее публичной.

2 голосов
/ 28 марта 2011

Потому что fails не public .. по умолчанию поля в struct и даже class private

Согласно MSDN

Уровень доступа для членов класса и членов struct , включая вложенные классы и структуры, private по по умолчанию .

2 голосов
/ 28 марта 2011

см. Ответ на этот вопрос

Этот член по умолчанию объявлен закрытым - перед ним необходимо поставить модификатор public.

1 голос
/ 28 марта 2011

Частные члены Test ограничиваются самим Test и недоступны вне Test. Демо вне Теста. Неважно, кто является родителем.

Определите Демо внутри Test, и вы сможете получить доступ к приватным участникам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...