Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
2 / 2 / 0
Регистрация: 31.10.2016
Сообщений: 4

Где посмотреть, как в C# реализуется унарный оператор инкремент и декремент?

18.01.2018, 09:05. Показов 1753. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Где посмотреть, как в C# реализуется унарный оператор инкремент и декремент.

Есть желание реализовать унарный оператор инкремент и декремент не только для чисел, но и для классов.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.01.2018, 09:05
Ответы с готовыми решениями:

Как выбрать тернарным оператором операцию инкремент/декремент?
for (int x = x1; deltaX > 0 ? x <= x1 : x >= x1;//Вот тут deltaX>0 ?x++:x-- ) { ...

Инкремент/декремент
var a = 1, b = 1, c, d; c = ++a; alert(c); // 2 d = b++; alert(d); // 1 c = (2+ ++a); alert(c); // 5 d = (2+ b++); alert(d);...

инкремент (декремент)
здаров всем! объясните на пальцах пожалста разницу между: $a++; и ++$a; ну минусы аналогично. вот разъяснение в...

6
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
18.01.2018, 09:14
Лучший ответ Сообщение было отмечено OwenGlendower как решение

Решение

Цитата Сообщение от Ребиск Посмотреть сообщение
Где посмотреть, как в C# реализуется унарный оператор инкремент и декремент.
Операторы реализуются отдельно для каждого типа.

Цитата Сообщение от Ребиск Посмотреть сообщение
Есть желание реализовать унарный оператор инкремент и декремент не только для чисел, но и для классов.
C#
1
2
3
4
5
6
7
class Foo()
{
   public static Foo operator ++(Foo f)
   {
      return new Foo();
   }
}
Главное, чтобы этот оператор возвращал новый экземпляр, а не изменял текущий.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
18.01.2018, 13:43
Цитата Сообщение от kolorotur Посмотреть сообщение
Главное, чтобы этот оператор возвращал новый экземпляр, а не изменял текущий.
в разрезе класса это точно имеет смысл?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
18.01.2018, 14:37
Цитата Сообщение от Wolfdp Посмотреть сообщение
в разрезе класса это точно имеет смысл?
Конечно!
Струтура и так в оператор копией передалась, потому там хочешь не хочешь новый экземпляр вернется, а изменение текущего экземпляра у ссылочного типа пускает под откос всю семантику пре/пост-инкремента.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
18.01.2018, 15:37
Цитата Сообщение от kolorotur Посмотреть сообщение
изменение текущего экземпляра у ссылочного типа пускает под откос всю семантику пре/пост-инкремента.
пытаюсь понять, что же нарушится... Ну, кроме неочевидности использования.

Просто класическое new MyClass() может пресоздавать 100500 полей, с инжектами и прочей ерундой. А если конструктор по умолчанию в принципе не существует, то вообще весело. Да и сам class подразумевает, что у нас есть адресс, и мы всегда меняем одно и тоже.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
18.01.2018, 16:29
Цитата Сообщение от Wolfdp Посмотреть сообщение
пытаюсь понять, что же нарушится... Ну, кроме неочевидности использования.
Дык эчевидность и нарушится — именно об этом говорилось во фразе
Цитата Сообщение от kolorotur Посмотреть сообщение
пускает под откос всю семантику пре/пост-инкремента.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Foo
{
    public int X { get; private set; }
    public override string ToString()
    {
        return X.ToString();
    }
 
    public static Foo operator ++(Foo foo)
    {
        foo.X++;
        return foo;
    }
}
C#
1
2
3
var foo = new Foo();
Console.WriteLine(++foo);
Console.WriteLine(foo++);
Любой вменяемый пользователь будет ожидать вывод 1/1, потому что так описана семантика оператора инкремента в спеках языка.
Изменение текущего экземпляра нарушает эту семантику — вывод будет 1/2.

А теперь представьте, что класс писал кто-то другой и исходники вам не видны.
Удачи в отладке!

Добавлено через 4 минуты
Цитата Сообщение от Wolfdp Посмотреть сообщение
Просто класическое new MyClass() может пресоздавать 100500 полей, с инжектами и прочей ерундой. А если конструктор по умолчанию в принципе не существует, то вообще весело. Да и сам class подразумевает, что у нас есть адресс, и мы всегда меняем одно и тоже.
Тут ведь вопрос именно в том, какое поведение ожидается при использовании определенной операции.
Если у класса MyClass есть какой-то метод DoStuff(), то черт его знает что он там в кишках делает и как меняет состояние объекта — мне исходники не видны, я этого не знаю и следовательно у меня нет каких-то определенных ожиданий от эффектов, которые этот метод создает.
А вот операция пост- и пре-инкремента определена в спеках и при виде ее в коде сразу имеются определенные ожидания от ее поведения.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
18.01.2018, 16:46
kolorotur, ужс. Короче, лучше его вообще не юзать в class. Просто можно поймать вот такое
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    internal class Program
    {
        static void Main(string[] args)
        {
            var foo = new Foo();
            OperationOne(foo);
            OperationTwo(foo);
            OperationThree(foo);
            Console.WriteLine(foo);
        }
 
        static void OperationOne(Foo foo) => foo.X = 0;
 
        static void OperationTwo(Foo foo) => foo++;
 
        static void OperationThree(Foo foo) => foo.X += 10;
 
    }
 
    class Foo
    {
        public int X { get; set; }
 
        public override string ToString() => X.ToString();
 
        public static Foo operator ++(Foo foo) => new Foo { X = foo.X + 1 };
 
        //public static Foo operator ++(Foo foo) { foo.X++; return foo; } 
    }
как по мне, єто более возможньій вариант собьітий.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.01.2018, 16:46
Помогаю со студенческими работами здесь

Инкремент/декремент
День добрый , подскажите пожалуйста как в VB делать инкремент или декримент, при помощи кнопки в программе изменять значение числа , от 0...

Инкремент(Декремент)
Есть ли разница,какую употреблять форму:префиксную или постфиксную? Если на экран выводится одно и то же число в префиксной и постфиксной...

Инкремент и декремент
Друзья, подскажите пожалуйста, как результатом работы примера получаем число 45? Вот пример: $i = 10; $i += ++$i + $i + $i++; ...

Инкремент и декремент
int x = 100,a; a = x++/x--; System.out.println("от результ:" + a); Результат получается 0 Знатоки, пожалуйста...

Инкремент и Декремент поясните
Всем добрый вечер. Прохожу JS по этому "учебнику" https://learn.javascript.ru/operators#inkrement-dekrement, дошёл до главы Инкремент и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
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. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru