|
1848 / 1190 / 501
Регистрация: 14.10.2018
Сообщений: 3,211
|
|||||||||||||||||||||
Перегрузка оператора без создания нового объекта27.02.2020, 21:59. Показов 2857. Ответов 9
Метки перегрузка операторов (Все метки)
Если вкратце то вопросы звучат так: Можно ли на практике делать перегрузку оператора без создания нового объекта и какие баги (или нечто подобное) мы можем словить?
Создавать или не создавать объект? Рассмотрим на простом примере (пока что без перегрузок)
1 + 2, потом это значение записываем в переменнуюЕсли мы мы не создаем новый объект, то изменяем одно из значений (пусть это будет 1), оно становится равно 3 (не к добру это) и после этого записываем в переменную.Теперь рассмотрим на более реальном примере. Создание нового объекта
MyClass m2 = my + 1; то первый объект не изменитсяМинусы: приходится создавать новый объект, а так же копировать/создавать новые данные. При большом кол-ве данных это может быть затратно. Конструктор копирования поможет упростить код, но не время работы. Та же версия, только Без создания нового объекта
my += 1;, а можно просто my + 1;. Сокращенная запись (хотя не совсем логичная с точки зрения обычного синтаксиса C#), не надо присваивать ссылку на себя. Никаких копирований данных всего объекта. Изменили одно значение и точка.Минусы: даже если мы не хотим менять 1-ый объект, он все равно изменится (что есть очень плохо). А если работать с Синглтоном? Новый объект создать не сможем, как следствие перегрузка с создание нового объекта невозможна. Вывод: при работе с одним объектом (например в Main()) эффективнее работать без создания нового объекта. В остальных случаях - создаем новый. Какие советы можете дать по этому поводу и почему? Баги и прочее без создания нового объекта При инкременте ++ и декременте -- без создания нового объекта у нас всегда срабатывает только префиксная форма, постфиксная просто невозможна.
0
|
|||||||||||||||||||||
| 27.02.2020, 21:59 | |
|
Ответы с готовыми решениями:
9
Перегрузка оператора + и создание нового объекта на этой основе
Восстановление профиля без создания нового |
|
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
|
||||
| 27.02.2020, 22:44 | ||||
+=, который автоматически перегружается при определении оператора +.Добавлено через 3 минуты Добавлено через 2 минуты Итого вариант с созданием нового объекта мне кажется наиболее логичным и охватывает максимум стандартных возможностей. Но думаю надо отталкиваться от конкретной задачи и выбирать более подходящий вариант в каждом конкретном случае.
1
|
||||
|
Модератор
|
||
| 28.02.2020, 00:24 | ||
Сообщение было отмечено Enifan как решение
РешениеВ настоящее время прозрачность, читаемость кода считаются основными его характеристиками. В C# принято, что операторы создают новый объект. Если поведение будет другое, то затруднит понимание кода и увеличит вероятность ошибок. Операторы по сути это обычные статические методы. Нужен вам метод не создающий новый объект, так и сделайте такой метод. Ни какой необходимости возлагать это не оператор нет. В типовой реализации это (метод не создающий новый экземпляр, а изменяющий нужный) должен быть не член типа, а член экземпляра. Это облегчит понимание вашего кода.
1
|
||
|
1848 / 1190 / 501
Регистрация: 14.10.2018
Сообщений: 3,211
|
|||
| 28.02.2020, 17:24 [ТС] | |||
|
QuakerRUS, Элд Хасп, Если брать в целом, то я согласен что перегрузка через создание нового объекта будет правильней, и этим способом я обычно и пользуюсь. Просто было любопытно - есть ли моменты, где альтернативный способ может быть лучше (не в теории, а на практике).
0
|
|||
|
Модератор
|
||||||||
| 28.02.2020, 17:59 | ||||||||
|
Весь смысл его создания - это использование единственного экземпляра. И все методы работаю с этим экземпляром. Статические же методы (в том числе операторы) нужны когда возникает необходимость в обработке РАЗНЫХ экземпляров типа. То есть сделать-то можно, но тогда это будет уже не Singleton. Добавлено через 5 минут
1
|
||||||||
|
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
|
|||||||
| 28.02.2020, 18:05 | |||||||
Сообщение было отмечено Enifan как решение
Решениеhttps://metanit.com/sharp/patterns/2.3.php Дорисовал обертку в виде OSWrapper, в котором перегрузил операцию ++. Можно спокойно создавать новый объект OSWrapper, это будет ненакладно. В нем хранится ссылка на текущий синглтон. Может где то неправильно или неоптимально сделал, от паттернов проектирования я пока далек. Новый строки 15-18, 49, 52-68 (если ничего не забыл).
1
|
|||||||
|
1848 / 1190 / 501
Регистрация: 14.10.2018
Сообщений: 3,211
|
||
| 28.02.2020, 18:17 [ТС] | ||
new ?
0
|
||
|
Модератор
|
||
| 28.02.2020, 18:28 | ||
|
Да и в целом, для ссылочных типов применение операторов та ещё идея... Возможно, но зачем? Какой-то смысл имеет переопределение == и != для неизменяемых DTO типов.Ещё гораздо реже встречается переопределение операторов сравнения. А вот арифметические операторы.... На то они и арифметические, чтобы работать с числами. А числа это ValueType. И по самой сути числа должны быть неизменяемыми. То есть опять возвращаемся к тому же: новое значение - новый тип. То есть C# позволяет натворить очень много разного кода, но для того чтобы этот код считался хорошим надо соблюдать принятые приёмы, соглашения, рекомендации. В том числе оставить Арифметические операторы для Арифметики.
1
|
||
|
1848 / 1190 / 501
Регистрация: 14.10.2018
Сообщений: 3,211
|
||
| 29.02.2020, 18:11 [ТС] | ||
|
QuakerRUS, основную идею понял, спасибо.
string видимо исключение.В итоге усвоил тот факт, что проще создать объект, и знать что никаких ошибок потом ожидать не надо. В крайней случаи проще создать метод. Возможно найдется тот пример где можно будет обойтись без создания нового объекта, но это сомнительно.
0
|
||
|
Модератор
|
||||||||||||
| 29.02.2020, 18:54 | ||||||||||||
|
"string" неизменяемый тип. И любой метод для него это обёртка над статическим методом который возвращает новый экземпляр "string". И, в какой-то , мере это действительно исключение возникшее на базе ранних ЯП где было "суммирование" строк. Создавайся C# на пустом месте, с чистого листа, очень сомневаюсь чтобы у "string" был бы оператор "+". Если мылить абстрактно, когда есть "+", то должен быть и "-". И не зная как определить "-" - не надо определять и "+". Например, для событий есть и "+=" и "-=". Они определены оба и дополняют друг друга. Поэтому для событий это смотрится логично, хоть это и ссылочный тип. Добавлено через 8 минут Допустим, если бы можно было перегружать "+=" без перегрузки "+", то можно было дополнить List соответствующими операторами.
А конструкция с отдельными операторами "+" и "-" смотрится очень ущербно и непонятно.
1
|
||||||||||||
| 29.02.2020, 18:54 | |
|
Помогаю со студенческими работами здесь
10
Перевернуть массив без создания нового.
Использование WinApi в C#. Как изменить шрифт без создания нового? Можно ли создать форму в модуле без создания нового модуля для неё
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|