|
213 / 139 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
|
|||||||||||
Что лучше, свойства с приватной переменной или автоматические свойства?23.07.2012, 11:21. Показов 14534. Ответов 21
Метки нет (Все метки)
Известно, что в классах свойства можно определить так:
А вот с недавнего времени хожу на одни курсы по C#, и у меня с тренером возникли немного споры по этому поводу... Многие меня упрекают, что я в классах понасоздавал лишние переменные вместо того, чтобы просто использовать автоматические свойства. Пожалуйста, помогите мне разобраться в чем я не прав...
0
|
|||||||||||
| 23.07.2012, 11:21 | |
|
Ответы с готовыми решениями:
21
Инкапсуляция, а именно автоматические свойства
|
|
9 / 9 / 9
Регистрация: 19.09.2011
Сообщений: 272
|
||||||
| 23.07.2012, 11:41 | ||||||
|
Я раньше c++ изучал и тоже, как и ты сейчас, не могу никак смириться с принципом "зачем писать удобнее, если можно писать, чтобы работало быстрее". Но меня убеждают в обратном
![]() и, наверное, правильно делают. С# -это не язык для очень производительных приложений, хотя, некоторые инструменты для этого есть. я пошёл немного дальше вас. И решил сравнить не только свойства и паблик переменные (у вас прайвет, но я из кода доступ произвожу, а вы хотите из класса), но и сами структуры и классы вот вам программка, которая делает аналогичные опперации над классами и структурами с полями и свойствами. У меня структуры работают примерно в 20 раз быстрее. Причём, различия между структурами-свойствами и структурами-полями нет. А по классам - классы с полями работают на совсем чуть-чуть быстрее...около 2-3 процентов. Сейчас сижу на старом компе intel 4400 P.S. не забудьте, компилировать в режиме "Release", а не "Debug" жду ваших результатов
1
|
||||||
|
|
||
| 23.07.2012, 11:46 | ||
|
Автоматические свойства неявно создают поля. Умный JIT умеент инлайнить свойства, убирая лишний call.
Поэтому использовать ли свойство с backend полем или autopropery - вопрос coding style, и на него не может быть дан однозначный ответ. Добавлено через 4 минуты
1
|
||
|
9 / 9 / 9
Регистрация: 19.09.2011
Сообщений: 272
|
|||||||
| 23.07.2012, 12:01 | |||||||
0
|
|||||||
|
|
||
| 23.07.2012, 12:09 | ||
|
когда вы new вызываете - тогда точно выделяется память под новую переменную.
0
|
||
|
9 / 9 / 9
Регистрация: 19.09.2011
Сообщений: 272
|
||
| 23.07.2012, 12:18 | ||
|
0
|
||
|
213 / 139 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
|
||||||||||
| 23.07.2012, 13:29 [ТС] | ||||||||||
|
1. Скорость работы с автоматическими свойствами в структур даже немного выше, чем доступ к полям(!!!). Я запускал программу несколько раз и скорость свойств всегда была выше, чем полей. То есть, если смотреть даже только на одно быстродействие, то их уже предпочтительнее использовать в структурах. 2. Быстродействие программы зависит от версии фреймворка, при том на очень внушительную цифру. Я пробовал компилить exeшник в разных версиях. На версиях 2.0, 3.0, 3.5 скорость практически одинакова(разница лишь ±1 секунда). А вот на четвертом фреймворке... короче цифры сами все говорят: (время наведено в секундах)
Что касается свойств в классах, то таки да, скорость практически такая же как и у полей(она лишь на несколько процентов ниже за доступ к полям). Выводы, которые можно из этих экспериментов сделать: 1. Если хотите, чтобы ваша программа быстрее работала, не понижайте версию FW из-за юзеров, которые ленятся его себе устанавливать, а используйте намного производительный FW4. 2. В структурах оптимальнее использовать свойства, чем поля (хоть это и противоречит сложившемуся использованию структур - поля в структурах и так публичные, там незачем свойства писать) 3. Можно использовать свойства в классах вместо полей. Падение скорости практически незаметное.
1
|
||||||||||
|
213 / 139 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
|
|
| 23.07.2012, 13:39 [ТС] | |
|
Очень хочется, чтобы кто-то еще протестровал разницу в скорости в 4-ой и 3-ей версии фреймворка и поделился своими результатами. Интересно, у всех ли такая большая разница в скорости.
0
|
|
|
|
||
| 23.07.2012, 13:46 | ||
|
Структуры не быстрее классов. Структуры всегда копируются полностью: при вызове метода, при возврате их из метода, что при больших размерах структуры - существенно. Стек-память имеет не более высокую скорость, чем куча, откуда вы такое взяли?
0
|
||
|
213 / 139 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
|
|||
| 23.07.2012, 14:00 [ТС] | |||
![]() Ну сами смотрите: чтобы узнать значение структуры, нужно обратиться к определенному адресу в пространстве стека. Все, значение мы имеем. Но чтобы достучаться к значению класса, нужно опять же сперва обратиться к определенному адресу в пространстве стека. Прочитать с этого места адрес, по которому хранится значение в куче. Найти этот адрес в куче, и только после этого мы получим значение. Может я в чем-то мелком допустился ошибки, но в общем так ведь все и происходит. Не так ли?
0
|
|||
|
123 / 121 / 6
Регистрация: 21.12.2011
Сообщений: 348
|
||||||
| 23.07.2012, 14:34 | ||||||
Машина: Intel I3 540, 4Gb RAM, Win7 x64 7601
2
|
||||||
|
213 / 139 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
|
|
| 23.07.2012, 14:40 [ТС] | |
|
Savvy, спасибо! У вас почти нет разницы в скорости от версии... только свойства структуры быстрее пашут на четвертой версии, это хорошо видно.
Интересно, почему у меня такая большая разница в скорости четвертой версии от других. Мне аж прям очень стало интересно, и объяснения этому что-то не нахожу)) А у вас какая ОСь и сколько бит?
0
|
|
|
123 / 121 / 6
Регистрация: 21.12.2011
Сообщений: 348
|
|
| 23.07.2012, 14:55 | |
|
1
|
|
|
9 / 9 / 9
Регистрация: 19.09.2011
Сообщений: 272
|
||
| 23.07.2012, 15:41 | ||
|
0
|
||
|
|
||
| 23.07.2012, 17:13 | ||
|
Добавлено через 4 минуты IcyWind, Переделайте тогда уж тест, засекая время с помощью StopWatch, будут более объективные результаты.
0
|
||
|
Master of Orion
|
||||||
| 23.07.2012, 20:03 | ||||||
|
Я немного изменил методику тестирования, результаты ниже:
Первый скриншот - просто сделал (причем запускал из студии), второй - после перезагрузки, запускал экзешник
1
|
||||||
|
Темная сторона .Net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
|
||
| 23.07.2012, 21:46 | ||
|
1
|
||
|
1 / 1 / 0
Регистрация: 07.05.2012
Сообщений: 16
|
|
| 07.10.2013, 21:24 | |
|
я чего то не пойму, зачем создавать наследуемый конструктор?
public MyPropStruct(int i, string s) : this()
0
|
|
|
9 / 9 / 9
Регистрация: 19.09.2011
Сообщений: 272
|
||
| 07.10.2013, 21:34 | ||
|
Если ты копируешь код в студию (удалив его вызов) и попробуешь запустить, то получишь очень содержательное сообщение об ошибке) копирую сюда: Ошибка Резервное поле для автоматически реализованного свойства"MyPropStruct.Val" должно быть полностью определено до возврата управления в вызывающий метод. Попробуйте использовать вызов конструктора по умолчанию из инициализатора конструктора. и туда же Ошибка Невозможно использовать объект this, пока не будут назначены все его поля
0
|
||
|
Заблокирован
|
||
| 07.10.2013, 23:20 | ||
|
Со временем производительность перестала быть узким местом в программировании, а на первый план вышли концептуальные понятия, удобство, и главное скорость написания большого объема кода. Но некоторые так и остались в тех же временах, изобретают велосипеды, тешатся мнимой производительностью, пишут на языках 80х-90х годов (привет с,с++) и т.д. Для тебя реализация- черный ящик, стало быть и вопросы эти не должны заботить.
1
|
||
| 07.10.2013, 23:20 | |
|
Помогаю со студенческими работами здесь
20
Создать Generic Mapper, который будет мапить схожие свойства одного объекта в свойства другого
Как лучше организовать присвоение свойства какого-либо класса Получить значение свойства объекта по значению в переменной string Будет ли корректным вызывать внутри методов get или set другие функции или менять свойства контролов? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|