Struct - доступ к приватным полям - PullRequest
3 голосов
/ 15 февраля 2012

Почему не генерируется ошибка?
Если я попытаюсь изменить личное поле этой структуры в основном программном файле - это приведет к ошибке, но не в реализации структуры.

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 ]

6 голосов
/ 15 февраля 2012

Закрытые члены ограничены классом или struct , а не объект . В этом случае, хотя s отличается от this, он все равно работает.

4 голосов
/ 15 февраля 2012

Такое поведение не относится к структурам - оно относится и к классам.

private означает, что поле доступно только внутри типа.Это не означает, что «только внутри одного экземпляра типа».

Если вы пытаетесь получить доступ к закрытому полю из того же типа , даже если это другой экземпляр того же типа , private должен разрешить доступ.

3 голосов
/ 15 февраля 2012

Во-первых, это не имеет никакого отношения к тому, является ли это структурой или классом - или действительно ли это поле или какой-то другой член.

Доступность в C # определяется в зависимости от того, где находится код, а не от того,это «этот объект» или другой объект.

Раздел 3.5 спецификации C # для более подробной информации.Например, начиная с 3.5.2:

Домен доступности члена состоит из (возможно, непересекающихся) разделов программного текста, в которых разрешен доступ к члену.

[...]

Если заявленная доступность M равна private, домен доступности M является текстом программы T.

3 голосов
/ 15 февраля 2012

private означает, что он может использоваться только в области действия struct.Это модификатор доступа, который говорит, что уровень доступа к этой переменной, функции равен private только для самого struct.

Вы должны использовать свое свойство, чтобы изменить его вне структуры, в main дляпример.

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

Хотя способ доступа к нему немного необычен.

1 голос
/ 15 февраля 2012

Это разрешено, потому что переданный тип также является MyStruct.Эта структура может обращаться к закрытым членам из структуры того же типа.

Как уже отмечали другие, это поведение одинаково и для типов классов.

1 голос
/ 15 февраля 2012

Модификатор private означает, что доступ к элементу возможен только из его типа.Он не ограничивает доступ изнутри экземпляра .

1 голос
/ 15 февраля 2012

Потому что SomeMethod - это метод самой структуры.Вы также не получите ошибку в классе - локальные члены могут изменять личные поля.

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