C # анонимные вспомогательные поля с неавтоматическими свойствами - PullRequest
5 голосов
/ 05 августа 2011

Я хочу сделать закрытую переменную-член, которая будет закрытой даже для класса, которому она принадлежит, и доступ к нему могут получить ТОЛЬКО ее методы получения и установки. Я знаю, что вы можете сделать это с автоматическими свойствами, такими как

private int MyInt{ get; set;}

Но я хочу иметь возможность изменять метод получения и установки, чтобы (например) я мог регистрировать, сколько раз поле было установлено (даже классом-владельцем). Как то так

private int MyInt
{
    get{ return hiddenValue; }
    set{ hiddenValue = value; Console.Out.WriteLine("MyInt has been set");}
}

где "hiddenValue" - член, который доступен только в методах получения и установки. Зачем? потому что я параноик-защитник, я даже не доверяю себе: p.

Возможно ли это в C #? и если да, то каков синтаксис?

Спасибо.

Ответы [ 5 ]

6 голосов
/ 05 августа 2011

Вы действительно должны доверять себе.

И нет, вы не можете сделать переменную настолько закрытой, что даже инкапсулирующий класс не сможет ее увидеть.

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

class Foo 
{
    class Bar // nested
    {
        private int _value;
        public int Value 
        {
            get { return _value; }
            set { _value = value; /* logic */ }
        }
    }
}

Foo может создать экземпляр Bar, получить значение bar.Value, но не может получить значение _value.

4 голосов
/ 05 августа 2011

Невозможно с любым языком в .Net. И это хорошо. Защитное кодирование - это хорошо, но когда становится параноиком, это сводит с ума других разработчиков, которым нужно его поддерживать.

3 голосов
/ 05 августа 2011

Аспектно-ориентированное программирование (AOP) может помочь, что в двух словах позволяет вам вводить код по вашему выбору до и / или после вызова метода.

Извлечение http://code.google.com/p/easyprop/, чтобиблиотека AOP, специально разработанная для наблюдения за изменениями свойств, и есть примеры для работы с автоматическими свойствами.

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

2 голосов
/ 05 августа 2011

Нет, это не возможно в C #.

Ваш лучший выбор - стать менее параноиком.: P

1 голос
/ 05 августа 2011

То, что вы пытаетесь сделать, не может быть достигнуто в .NET.

Даже скрытое поле поддержки будет видно в коде IL. То есть, пока вы не видите его во время разработки (в VS), оно будет там после компиляции.

...