Property Accessibility
От: Jewgenis Германия  
Дата: 20.05.06 16:10
Оценка:
Здравствуйте!
Подскажите пожалуйста новичку в мире .NET и C#: если ли смысл в определении свойства ставить private? По поводу public все понятно... но private в каких случаях использоваться может (если вообще такие есть...)? И по поводу отдельного использования прайват перед гет и сет: Я так понял, что свойства используются в основном для доступа к приватным данным класса или структуры, так зачем делать set или get приватом?
Большое спасибо!
Re: Property Accessibility
От: kpumuk Украина http://kpumuk.info/
Дата: 20.05.06 16:35
Оценка: +1
Здравствуйте, Jewgenis, Вы писали:

J>Здравствуйте!

J>Подскажите пожалуйста новичку в мире .NET и C#: если ли смысл в определении свойства ставить private? По поводу public все понятно... но private в каких случаях использоваться может (если вообще такие есть...)? И по поводу отдельного использования прайват перед гет и сет: Я так понял, что свойства используются в основном для доступа к приватным данным класса или структуры, так зачем делать set или get приватом?
J>Большое спасибо!

Конечно есть, например, для отложенной инициализации приватных полей.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Property Accessibility
От: Jewgenis Германия  
Дата: 20.05.06 18:14
Оценка:
Здравствуйте, kpumuk, Вы писали:

K>Конечно есть, например, для отложенной инициализации приватных полей.


Спасибо за ответ! Но я не очень понял, если честно... Отложенная инициализация это как? Разве поля не инициализируются при их создании? Я так понял, что свойство внутри класса смысла не имеет, потому что ко всем полям внутри класса я и без свойств обратиться могу... Разъясните, плиз, чайнику...
Re[3]: Property Accessibility
От: kpumuk Украина http://kpumuk.info/
Дата: 20.05.06 18:27
Оценка:
Здравствуйте, Jewgenis, Вы писали:

J>Спасибо за ответ! Но я не очень понял, если честно... Отложенная инициализация это как? Разве поля не инициализируются при их создании? Я так понял, что свойство внутри класса смысла не имеет, потому что ко всем полям внутри класса я и без свойств обратиться могу... Разъясните, плиз, чайнику...


Все очень просто. Предположим есть у вас класс A, создание и инициализация которого очень тяжелая (по времени, ресурсам или еще как). В классе B вам нужен объект класса A, но не всегда, а только при каких-то обстоятельствах (например, пользователь полез в закоулки программы и кликнул на какой-нибудь баттон).

Создавать сразу объект A не имеет смысла, он ведь может и не понадобиться. Вот пример:

class A
{
    public A()
    {
        // длительная операция
        // (обращение к веб-сервису или базе данных, вычитываение большого объема данных или сложные вычисления)
    }
}

class B
{
    private A _a;
    
    private A A
    {
        get
        {
            if (_a == null) _a = new A();
            return _a;
        }
    }
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Property Accessibility
От: kpumuk Украина http://kpumuk.info/
Дата: 20.05.06 18:31
Оценка:
Здравствуйте, kpumuk, Вы писали:

K>Создавать сразу объект A не имеет смысла, он ведь может и не понадобиться. Вот пример:


Это, кстати, называется отложенной загрузкой, паттерн описан у Фаулера (Lazy Load)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: Property Accessibility
От: Jewgenis Германия  
Дата: 20.05.06 21:26
Оценка:
Здравствуйте, kpumuk, Вы писали:

K>>Создавать сразу объект A не имеет смысла, он ведь может и не понадобиться. Вот пример:


Спасибо большое! Я разобрался... Вот только теперь хотел бы подтвердить свои мысли
Из функции Main() я вызываю несколько раз метод longPathButtonClick(), это как раз приводит к тому, что должен создаться объект класса А. В случае с new будет выделенна память несколько раз, а если использовать свойство, то объект создастся только один раз... Если все так, то использование прайват в определении свойства ясно... Прошу меня извинить, если я что-то недопонял и написал не так...

    class A
    {
        public A()   // Дефолтный конструктор
        {
            Console.WriteLine("Default constructor call for class A");
        }

        // Сложные вычисления

    }

    class B
    {
        public B()   // Дефолтный конструктор
        {
            Console.WriteLine("Default constructor call for class B");
        }

        private A _a;
        
        public A A
        {
            get
            {
                if (_a == null) _a = new A();
                return _a;
            }
        }

        public void longPathButtonClick()
        {
            Console.WriteLine("The Button was clicked!!!");
            //  _a = new A();   // В этом случае создается много копий одного объекта...
            //  _a = A;         // В этом случае объект создается только один раз...
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            B CB = new B();

            CB.longPathButtonClick();
            CB.longPathButtonClick();
            CB.longPathButtonClick();
            CB.longPathButtonClick();
        }
    }
Re[6]: Property Accessibility
От: kpumuk Украина http://kpumuk.info/
Дата: 20.05.06 21:39
Оценка:
Здравствуйте, Jewgenis, Вы писали:

J>Спасибо большое! Я разобрался... Вот только теперь хотел бы подтвердить свои мысли

J>Из функции Main() я вызываю несколько раз метод longPathButtonClick(), это как раз приводит к тому, что должен создаться объект класса А. В случае с new будет выделенна память несколько раз, а если использовать свойство, то объект создастся только один раз... Если все так, то использование прайват в определении свойства ясно... Прошу меня извинить, если я что-то недопонял и написал не так...

Да, в случае использования property объект будет создан только один раз. Но в данном случае главное не это.

В исходном сообщении ты спрашивал, чем отличается private property от private field, я и привел пример. С другой стороны, в случае свойства никакого field может вообще не существовать (как, например, у DateTime.Now).
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[7]: Property Accessibility
От: Jewgenis Германия  
Дата: 21.05.06 10:27
Оценка:
Здравствуйте, kpumuk, Вы писали:

K>Да, в случае использования property объект будет создан только один раз. Но в данном случае главное не это.


K>В исходном сообщении ты спрашивал, чем отличается private property от private field, я и привел пример. С другой стороны, в случае свойства никакого field может вообще не существовать (как, например, у DateTime.Now).


Большое спасибо за помощь!
Я разобрался... Только, все же, мне кажется, что private property используется не слишком часто... (по крайней мере, мне придеться использовать не часто).
RE: Property Accessibility
От: Аноним  
Дата: 20.05.06 17:05
Оценка:
Здравствуйте!
Подскажите пожалуйста новичку в мире .NET и C#: если ли смысл в определении свойства ставить private? По поводу public все понятно... но private в каких случаях использоваться может (если вообще такие есть...)?

Ну, если про публичное свойство все понятно, то и по-поводу приватного вопросов быть не должно — все то же самое с той лишь разницей, что это свойство ты пишешь для себя, любимого


И по поводу отдельного использования прайват перед гет и сет: Я так понял, что свойства используются в основном для доступа к приватным данным класса или структуры, так зачем делать set или get приватом?
Большое спасибо!

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


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.