Пустые средства доступа имеют значение?Относительно типов значений и их модификации - PullRequest
3 голосов
/ 07 апреля 2010

У меня следующий код, который не работает из-за того, что "a" является типизированным значением. Но я думал, что он не будет работать даже без аксессуаров, но он сделал:

class Program
    {
        a _a  //with accessors it WONT compile
        {
            get; 
            set;
        }
        static void Main(string[] args)
        {
            Program p = new Program();
            p._a.X = 5; //when both accessors are deleted, compiler does not
                        //complain about _a.X not being as variable
        }
    }
    struct a
    {
       public int X;
    }

Он не работает, так как "a" является структурой. Но когда я удаляю средства доступа из экземпляра "_a", это работает. Я не понимаю почему. Спасибо

Ответы [ 3 ]

2 голосов
/ 07 апреля 2010

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

Если у вас есть тип значения и метод доступа, по существу, у вас есть тип значения, возвращаемый методом, который вызывает копию (следующие два примера одинаковы):

ValueType Property { get { return x; } } // Will make a copy of x
ValueType Method() { return x; }    // Will make a copy of x

Если вы теперь присваиваете возвращаемое значение, вы присваиваете копию из x. Поэтому любые изменения, внесенные в значение, возвращаемое из свойства, будут немедленно потеряны.

Когда вы удаляете {получить; } accessor, теперь у вас есть основное поле, например ::

int field;

или

ValueType field;

Что означает, что копия не сделана, что означает, что при назначении полю вы больше не назначаете копию.

1 голос
/ 07 апреля 2010

Причина, по которой p._a.X = 5; не работает, заключается в том, что p._a возвращает значение типа a. Значения не могут измениться. Но если вы поместите значение в переменную, вы можете изменить значение переменной.

1 голос
/ 07 апреля 2010

Вы не можете удалить оба средства доступа.

Таким образом:

a _a;

это работает, но больше не является свойством.


Редактировать: Со свойством значение, полученное из p._a, является результатом вызова функции.Если вы даже измените его, измененное значение никоим образом не будет «записано» в «оригинал» _a.Вместо этого вы просто измените временное значение, возвращаемое функцией getter.

C # может это позволить, но это приведет к путанице, поскольку люди ожидают, что после p._a.X = 5; int xx = p._a.X; значение xx будетбыть 5. Но это не так.Поскольку p_.a действительно не является переменной: -)


Разница в том, что с

a _a;

ваш _a является полем;в случае

a _a { get; set; }

_a является собственностью.И дело

a _a { }

не допускается.

...