Здравствуйте!
Подскажите пожалуйста новичку в мире .NET и C#: если ли смысл в определении свойства ставить private? По поводу public все понятно... но private в каких случаях использоваться может (если вообще такие есть...)? И по поводу отдельного использования прайват перед гет и сет: Я так понял, что свойства используются в основном для доступа к приватным данным класса или структуры, так зачем делать set или get приватом?
Большое спасибо!
Здравствуйте, Jewgenis, Вы писали:
J>Здравствуйте! J>Подскажите пожалуйста новичку в мире .NET и C#: если ли смысл в определении свойства ставить private? По поводу public все понятно... но private в каких случаях использоваться может (если вообще такие есть...)? И по поводу отдельного использования прайват перед гет и сет: Я так понял, что свойства используются в основном для доступа к приватным данным класса или структуры, так зачем делать set или get приватом? J>Большое спасибо!
Конечно есть, например, для отложенной инициализации приватных полей.
Здравствуйте, kpumuk, Вы писали:
K>Конечно есть, например, для отложенной инициализации приватных полей.
Спасибо за ответ! Но я не очень понял, если честно... Отложенная инициализация это как? Разве поля не инициализируются при их создании? Я так понял, что свойство внутри класса смысла не имеет, потому что ко всем полям внутри класса я и без свойств обратиться могу... Разъясните, плиз, чайнику...
Здравствуйте, 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;
}
}
}
Здравствуйте, 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();
}
}
Здравствуйте, Jewgenis, Вы писали:
J>Спасибо большое! Я разобрался... Вот только теперь хотел бы подтвердить свои мысли J>Из функции Main() я вызываю несколько раз метод longPathButtonClick(), это как раз приводит к тому, что должен создаться объект класса А. В случае с new будет выделенна память несколько раз, а если использовать свойство, то объект создастся только один раз... Если все так, то использование прайват в определении свойства ясно... Прошу меня извинить, если я что-то недопонял и написал не так...
Да, в случае использования property объект будет создан только один раз. Но в данном случае главное не это.
В исходном сообщении ты спрашивал, чем отличается private property от private field, я и привел пример. С другой стороны, в случае свойства никакого field может вообще не существовать (как, например, у DateTime.Now).
Здравствуйте, 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 приватом?
Большое спасибо!
См. выше. Вообще переменные-члены класса создают для того, чтобы немедленно обернуть их в свойства