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>>
Property Accessibility
От: Jewgenis Германия  
Дата: 20.05.06 16:10
Оценка:
Здравствуйте!
Подскажите пожалуйста новичку в мире .NET и C#: если ли смысл в определении свойства ставить private? По поводу public все понятно... но private в каких случаях использоваться может (если вообще такие есть...)? И по поводу отдельного использования прайват перед гет и сет: Я так понял, что свойства используются в основном для доступа к приватным данным класса или структуры, так зачем делать set или get приватом?
Большое спасибо!
RE: Property Accessibility
От: Аноним  
Дата: 20.05.06 17:05
Оценка:
Здравствуйте!
Подскажите пожалуйста новичку в мире .NET и C#: если ли смысл в определении свойства ставить private? По поводу public все понятно... но private в каких случаях использоваться может (если вообще такие есть...)?

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


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

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


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
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 используется не слишком часто... (по крайней мере, мне придеться использовать не часто).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.