Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / В чем принципиальная разница между public int Field; и public int Field{get;set;}? / 25 сообщений из 44, страница 1 из 2
16.10.2016, 23:37
    #39327899
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиальная разница между public int Field; и public int Field{get;set;}?
терминологически понятно - первое это поле, второе - свойство, которое при компиляции превращается в две функции.
В чём преимущество пустого свойства перед полем?

Тем более, что я всё равно не смогу ничего ни в get{} ни в set{} вписать, пока опять-таки не объявлю какую-нибудь переменную int _field (пока get/set пустые, то Field "сама" хранит в себе значения), т.к. при "расшифровке" get или set Field сразу теряет способность хранить данные в себе и их нужно куда-то пихать (или я ошибаюсь?)
...
Рейтинг: 0 / 0
17.10.2016, 04:47
    #39327920
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиальная разница между public int Field; и public int Field{get;set;}?
Charles WeylandВ чём преимущество пустого свойства перед полем?
1. Если захочется добавить логику и преобразовать поле в свойство, то придётся перекомпилировать вызывающий код. Если такая возможность есть, то это некритично - например, когда поле или класс описаны как private или internal.

2. Есть разница на уровне рефлекшена. Как следствие, не каждый сериализатор, датабиндинг и т. п. умеет работать с полями из-за лени их создателей.

зы: В древности люди считали, что по ряду причин не должно быть публичных полей классов. Некоторые до сих пор так считают.
...
Рейтинг: 0 / 0
17.10.2016, 06:13
    #39327926
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиальная разница между public int Field; и public int Field{get;set;}?
3. Свойство может быть объявлено в интерфейсе, поле - нет.
4. Свойства могут быть виртуальными, и, как следствие, переопределенными в производном классе. Поля - нет.
5. Датабиндинги (и в WPF, и в винформс) работают именно через свойства, а не через поля.
6. Поле класса может быть передано в метод как ref/out параметр, свойство - нет.
...
Рейтинг: 0 / 0
17.10.2016, 08:12
    #39327945
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиальная разница между public int Field; и public int Field{get;set;}?
Charles Weyland,

Для авто-свойства компилятор сгенерирует приватное поле и назовёт его как ему вздумается. Поэтому есть вероятность, что ты получишь фейл, при десериализации. Крайне редкий и специфичный случай, который может неожиданно огорчить =)

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

Самое главное, о чём уже выше сказали, но я повторю: поле не может быть объявлено в интерфейсе, а свойство может .
...
Рейтинг: 0 / 0
17.10.2016, 08:42
    #39327950
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиальная разница между public int Field; и public int Field{get;set;}?
hVosttДля авто-свойства компилятор сгенерирует приватное поле и назовёт его как ему вздумается. Поэтому есть вероятность, что ты получишь фейл, при десериализации. Крайне редкий и специфичный случай, который может неожиданно огорчить =)Все известные науке сериализаторы игнорируют приватные члены. Ну может если только их явно атрибутом каким пометить. Что же там такое ужасное может случиться? Давай пример.
...
Рейтинг: 0 / 0
17.10.2016, 09:24
    #39327970
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиальная разница между public int Field; и public int Field{get;set;}?
Алексей К,

http://www.infragistics.com/community/blogs/josh_smith/archive/2008/02/05/automatic-properties-and-the-binaryformatter.aspx

автор
I think a good rule of thumb is: do not use automatic properties in serializable types .
...
Рейтинг: 0 / 0
17.10.2016, 09:57
    #39327987
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиальная разница между public int Field; и public int Field{get;set;}?
hVosttАлексей К,

http://www.infragistics.com/community/blogs/josh_smith/archive/2008/02/05/automatic-properties-and-the-binaryformatter.aspx

авторI think a good rule of thumb is: do not use automatic properties in serializable types .

Ну да, древний BinaryFormatter почему-то пишет приватные поля. Нажно всем отказываться от автосвойств... :-)
...
Рейтинг: 0 / 0
17.10.2016, 09:59
    #39327989
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиальная разница между public int Field; и public int Field{get;set;}?
*Нужно
...
Рейтинг: 0 / 0
17.10.2016, 10:11
    #39328002
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиальная разница между public int Field; и public int Field{get;set;}?
Алексей КНу да, древний BinaryFormatter почему-то пишет приватные поля. Нажно всем отказываться от автосвойств... :-)

Ну по сути это как раз и есть честный сериализер. Все другие, о которых ты говоришь, никак не гарантируют, что сериализованные данные будут идентичны десериализованным хоть в какой-то мере. Любое свойство может намерянно или нет искажать данные. О чём собственно и говорил Рихтер. Правда как оказалось не так страшен чёрт, как его малюют, но это делает ситуацию ещё более опасной
...
Рейтинг: 0 / 0
17.10.2016, 10:18
    #39328012
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиальная разница между public int Field; и public int Field{get;set;}?
hVosttАлексей КНу да, древний BinaryFormatter почему-то пишет приватные поля. Нажно всем отказываться от автосвойств... :-)

Ну по сути это как раз и есть честный сериализер. Все другие, о которых ты говоришь, никак не гарантируют, что сериализованные данные будут идентичны десериализованным хоть в какой-то мере. Любое свойство может намерянно или нет искажать данные. О чём собственно и говорил Рихтер. Правда как оказалось не так страшен чёрт, как его малюют, но это делает ситуацию ещё более опасной Никакой опасности для тех, кто не нарушает концепцию свойств и понимает, что в них должно находиться. :-)

С другой стороны, BinaryFormatter пользуется не публичным контрактом класса, как принято в приличном обществе, он лезет в святая святых - в приватные поля, из-за чего и работает неправильно при некоторых, вполне законных , изменениях внутренностей класса. Авторы BinaryFormatter должны признать свои ошибки и сделать что-нибудь хорошее, чтобы загладить вину перед обществом.
...
Рейтинг: 0 / 0
17.10.2016, 10:41
    #39328030
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиальная разница между public int Field; и public int Field{get;set;}?
Сон Веры Павловны,
7. К полю можно применить ThreadStaticAttribute
8. К полю можно применить volatile
...
Рейтинг: 0 / 0
17.10.2016, 11:16
    #39328053
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиальная разница между public int Field; и public int Field{get;set;}?
Алексей КНикакой опасности для тех, кто не нарушает концепцию свойств и понимает, что в них должно находиться. :-)

Согласен, культура использования свойств хорошо сформировалась.

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

В некоторых случаях это идеальный вариант. Например, сериализация исключений.
...
Рейтинг: 0 / 0
17.10.2016, 11:32
    #39328062
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиальная разница между public int Field; и public int Field{get;set;}?
hVosttАлексей КС другой стороны, BinaryFormatter пользуется не публичным контрактом класса, как принято в приличном обществе, он лезет в святая святых - в приватные поля, из-за чего и работает неправильно при некоторых, вполне законных , изменениях внутренностей класса. Авторы BinaryFormatter должны признать свои ошибки и сделать что-нибудь хорошее, чтобы загладить вину перед обществом.

В некоторых случаях это идеальный вариант. Например, сериализация исключений.ОК. Подумаю об этом. Но на первый взгляд похоже на авантюру. :-)
...
Рейтинг: 0 / 0
17.10.2016, 11:36
    #39328065
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиальная разница между public int Field; и public int Field{get;set;}?
Алексей КОК. Подумаю об этом. Но на первый взгляд похоже на авантюру. :-)

Насчёт авантюры согласен, замахнулись не подумав. С бинарной сериализацией связано целое корыто проблем, поэтому и не обрело популярности.
...
Рейтинг: 0 / 0
17.10.2016, 12:40
    #39328122
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиальная разница между public int Field; и public int Field{get;set;}?
hVosttАлексей КОК. Подумаю об этом. Но на первый взгляд похоже на авантюру. :-)

Насчёт авантюры согласен, замахнулись не подумав. С бинарной сериализацией связано целое корыто проблем, поэтому и не обрело популярности.Бинарные сериализаторы разные бывают. В WCF есть бинарный сериализатор, который нормально работает.
...
Рейтинг: 0 / 0
17.10.2016, 13:06
    #39328137
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиальная разница между public int Field; и public int Field{get;set;}?
Алексей КБинарные сериализаторы разные бывают. В WCF есть бинарный сериализатор, который нормально работает.

Медленный он... если если ты конечно имеешь в виду BinaryFormatter. Лучше ProtoBuf =)
...
Рейтинг: 0 / 0
18.10.2016, 04:15
    #39328624
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиальная разница между public int Field; и public int Field{get;set;}?
hVosttАлексей КБинарные сериализаторы разные бывают. В WCF есть бинарный сериализатор, который нормально работает.

Медленный он... если если ты конечно имеешь в виду BinaryFormatter. Лучше ProtoBuf =)Ну я про сериализатор, используемый в привязке WCF NetTCP. С чего он медленный-то? Да и мы разве куда-то не успеваем? :-)
...
Рейтинг: 0 / 0
18.10.2016, 08:01
    #39328654
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиальная разница между public int Field; и public int Field{get;set;}?
Алексей КhVosttпропущено...


Медленный он... если если ты конечно имеешь в виду BinaryFormatter. Лучше ProtoBuf =)Ну я про сериализатор, используемый в привязке WCF NetTCP. С чего он медленный-то?
Не тестировал, но скорее всего из-за рефлексии.
...
Рейтинг: 0 / 0
18.10.2016, 08:12
    #39328656
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиальная разница между public int Field; и public int Field{get;set;}?
skyANAАлексей Кпропущено...
Ну я про сериализатор, используемый в привязке WCF NetTCP. С чего он медленный-то?
Не тестировал, но скорее всего из-за рефлексии.Ну там, если всё по уму написано, должна быть кодогенерация через Emit или Expression. Но я тоже не тестировал. :-)
...
Рейтинг: 0 / 0
18.10.2016, 08:23
    #39328660
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиальная разница между public int Field; и public int Field{get;set;}?
Алексей КskyANAпропущено...

Не тестировал, но скорее всего из-за рефлексии.Ну там, если всё по уму написано, должна быть кодогенерация через Emit или Expression. Но я тоже не тестировал. :-)
Ты хотел сказать, если написать самому генерацию суррогата для каждого класса, что необходимо сериализовать?
...
Рейтинг: 0 / 0
18.10.2016, 08:42
    #39328665
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиальная разница между public int Field; и public int Field{get;set;}?
skyANAАлексей Кпропущено...
Ну там, если всё по уму написано, должна быть кодогенерация через Emit или Expression. Но я тоже не тестировал. :-)
Ты хотел сказать, если написать самому генерацию суррогата для каждого класса, что необходимо сериализовать?Ну нет. Я про кодогенерацию внутри сериализатора, как в XmlSerializer.
...
Рейтинг: 0 / 0
18.10.2016, 09:15
    #39328684
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиальная разница между public int Field; и public int Field{get;set;}?
Алексей КskyANAпропущено...

Ты хотел сказать, если написать самому генерацию суррогата для каждого класса, что необходимо сериализовать?Ну нет. Я про кодогенерацию внутри сериализатора, как в XmlSerializer.
А она появилась для Binary? Раньше помнится самому надо было писать.
...
Рейтинг: 0 / 0
18.10.2016, 09:19
    #39328688
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиальная разница между public int Field; и public int Field{get;set;}?
Алексей КЯ про кодогенерацию внутри сериализатора, как в XmlSerializer.
Кхм... может, лучше не надо?
...
Рейтинг: 0 / 0
18.10.2016, 09:31
    #39328697
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиальная разница между public int Field; и public int Field{get;set;}?
skyANAАлексей Кпропущено...
Ну нет. Я про кодогенерацию внутри сериализатора, как в XmlSerializer.
А она появилась для Binary? Раньше помнится самому надо было писать.Ну в WCF в сериализаторе для NetTCP может и есть, надо уточнять. Могу ошибаться конечно же.
...
Рейтинг: 0 / 0
18.10.2016, 09:39
    #39328704
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиальная разница между public int Field; и public int Field{get;set;}?
Сон Веры ПавловныАлексей КЯ про кодогенерацию внутри сериализатора, как в XmlSerializer.
Кхм... может, лучше не надо?Возможные утечки памяти описаны в документации . Просто не все её читают.
авторTo increase performance, the XML serialization infrastructure dynamically generates assemblies to serialize and deserialize specified types. The infrastructure finds and reuses those assemblies. This behavior occurs only when using the following constructors:

XmlSerializer.XmlSerializer(Type)

XmlSerializer.XmlSerializer(Type, String)

If you use any of the other constructors, multiple versions of the same assembly are generated and never unloaded, which results in a memory leak and poor performance. The easiest solution is to use one of the previously mentioned two constructors. Otherwise, you must cache the assemblies in a Hashtable, as shown in the following example.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / В чем принципиальная разница между public int Field; и public int Field{get;set;}? / 25 сообщений из 44, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]