Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
-13 / 3 / 0
Регистрация: 09.11.2019
Сообщений: 102
1

Задание с собеса. Может кому интересно

17.11.2019, 19:06. Просмотров 670. Ответов 14

Определите ошибку в приведенном коде.
1
Миниатюры
Задание с собеса. Может кому интересно  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.11.2019, 19:06
Ответы с готовыми решениями:

Кому интересно. Покер
Вообщем, давно ничего не кодил и на днях накатал немного говно кода на тему Покера. Кому будет...

Кому интересно поломать голову
Привет! Сейчас на работе думал с ума схожу - есть код, который (с виду) работать не должен, но...

Открыта вакансия Программиста 1С - кому интересно?
Добрый день! Меня зовут Анна и я являюсь представителем кадровой компании, работаю как официальный...

Бинарные деревья ! кому интересно , сюда!;)
задание : Описать процедуру или функцию которая : а) печатает запись, встречающуюся в дереве один...

14
2046 / 1602 / 478
Регистрация: 02.08.2011
Сообщений: 4,621
17.11.2019, 19:15 2
Некорректно реализован IDisposable (не совсем по фэн-шую) + ошибка в логике - зачем обнулять Id?

Добавлено через 52 секунды
IsDisposed должен иметь приватный setter. И Id тоже.

Добавлено через 1 минуту
Цитата Сообщение от IamRain Посмотреть сообщение
Некорректно реализован
Многократный вызов метода должен быть эквивалентен однократному вызову метода Dispose. (см. Идемпотентность).
0
1099 / 772 / 217
Регистрация: 15.08.2010
Сообщений: 2,145
17.11.2019, 19:51 3
Цитата Сообщение от IamRain Посмотреть сообщение
ошибка в логике - зачем обнулять Id?
так захотелось
Цитата Сообщение от IamRain Посмотреть сообщение
И Id тоже.
почему?
Цитата Сообщение от IamRain Посмотреть сообщение
Многократный вызов метода должен быть эквивалентен однократному вызову метода Dispose.
разве тут не так? id всегда 0, диспозд флаг выставлен
Цитата Сообщение от IamRain Посмотреть сообщение
не совсем по фэн-шую
так можно и до отсутствия xml доков докопаться
Цитата Сообщение от Ilya_Pilya Посмотреть сообщение
Определите ошибку в приведенном коде.
конкретно этот код у меня работает корректно, лень тестить на других версиях фреймворка/компилятора

Кликните здесь для просмотра всего текста
авторы тестового задания наверняка хотят услышать, что диспоз вызовется на копии структуры.
в любом случае структуру заменить на класс надо
2
2046 / 1602 / 478
Регистрация: 02.08.2011
Сообщений: 4,621
17.11.2019, 20:17 4
КОП, ну да, а про главное забыл. Слив засчитан )

Добавлено через 18 минут
Цитата Сообщение от КОП Посмотреть сообщение
разве тут не так? id всегда 0, диспозд флаг выставлен
В общем случае может быть какая-то другая логика, которая может ломать состояние объекта при повторном вызове.
И раз уж есть флаг, то почему бы его не использовать? + Так проще ревью делать.

C#
1
2
if (IsDisposed)
     return;
0
1099 / 772 / 217
Регистрация: 15.08.2010
Сообщений: 2,145
17.11.2019, 20:26 5
Цитата Сообщение от IamRain Посмотреть сообщение
В общем случае может быть какая-то другая логика,
в общем случае согласен.
Я руководствовался такой логикой. Если тут структура, то нужна производительность (с диспозом на структуре, ага, уже самому смешно), следовательно обвес на диспоз добавляем только по мере необходимости. Разумеется все это было бы мимо вопроса интервьювера
0
1234 / 709 / 269
Регистрация: 17.05.2015
Сообщений: 2,685
18.11.2019, 09:01 6
Можно еще добавить, что IDisposable подразумевает освобождение неуправляемых ресурсов, коих тут нет.
Человек, который видит все методы этого класса может подумать, что он (класс) их использует.
С тем же успехом, можно было реализовать интерфейс IEquatable и в методе Equals обнулять ID
0
Эксперт .NET
8083 / 5512 / 933
Регистрация: 21.01.2016
Сообщений: 21,092
18.11.2019, 09:14 7
Цитата Сообщение от Рядовой Посмотреть сообщение
Можно еще добавить, что IDisposable подразумевает освобождение неуправляемых ресурсов, коих тут нет.
Этот метод не только про неуправляемые ресурсы) Он про переход в логически "высвобожденное" состояние, чтобы это ни значило. Как пример: в одном нашем десктопном проекте используется маленький хелпер для смены курсора или блокировки контролов на форме. Ни о каких неуправляемых ресурсах речи не идёт.
0
797 / 474 / 247
Регистрация: 26.11.2015
Сообщений: 1,516
Записей в блоге: 2
18.11.2019, 09:37 8
Цитата Сообщение от КОП Посмотреть сообщение
диспоз вызовется на копии структуры.
Не могли бы пояснить этот момент? Что-то не улавливаю. Сейчас протестил - поля изменяются именно в той структре, на которой я вызвал Dispose
0
Эксперт .NET
8083 / 5512 / 933
Регистрация: 21.01.2016
Сообщений: 21,092
18.11.2019, 09:41 9
Toros1992, речь о том, что вызов Dispose у структуры приводит к боксингу. А боксинг - копирование структуры в кучу. Но с какой-то версии языка это изменили вроде бы.
1
797 / 474 / 247
Регистрация: 26.11.2015
Сообщений: 1,516
Записей в блоге: 2
18.11.2019, 09:46 10
Цитата Сообщение от Usaga Посмотреть сообщение
речь о том, что вызов Dispose у структуры приводит к боксингу
У меня был немного некорректный тест. Я Dispose явно вызывал.Если использовать блок using, то действительно на копии. Видимо упаковка происходит только в этом случае.

Спасибо этой теме за небольшую прокачку))
0
1099 / 772 / 217
Регистрация: 15.08.2010
Сообщений: 2,145
18.11.2019, 13:05 11
Цитата Сообщение от Toros1992 Посмотреть сообщение
Сейчас протестил - поля изменяются именно в той структре, на которой я вызвал Dispose
ну я так и сказал
Цитата Сообщение от КОП Посмотреть сообщение
конкретно этот код у меня работает корректно
измените на
C#
1
2
var user = new User();
using(user) ...
и сравните результат
Цитата Сообщение от Usaga Посмотреть сообщение
что вызов Dispose у структуры приводит к боксингу
но это не точно (с)
Цитата Сообщение от Toros1992 Посмотреть сообщение
.Если использовать блок using, то действительно на копии
какой компилятор?

Добавлено через 8 минут
там идет вызов через constrained, вскользь пока прочитал, не до конца понял все варианты событий. Если кто (kolorotur) переведет на человеческий - будет здорово
0
797 / 474 / 247
Регистрация: 26.11.2015
Сообщений: 1,516
Записей в блоге: 2
18.11.2019, 13:15 12
Цитата Сообщение от КОП Посмотреть сообщение
сравните результат
Результат один и тот же, независимо от того, создаем ли мы внутри блока или вне его. Отличие есть только когда явно вызываем метод Dispose
0
1099 / 772 / 217
Регистрация: 15.08.2010
Сообщений: 2,145
18.11.2019, 15:45 13
Цитата Сообщение от Toros1992 Посмотреть сообщение
Результат один и тот же
мы может о разном говорим?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        struct User : IDisposable
        {
            public int val;
 
            public void Dispose()
            {
                Console.WriteLine("value: " + val);
            }
 
            public void Foo()
            {
                val = 2;
            }
        }
внутри:
C#
1
2
3
4
            using (var u = new User())
            {
                u.Foo();
            } // value: 2
снаружи:
C#
1
2
3
4
5
            var u = new User();
            using (u)
            {
                u.Foo();
            } // value: 0
0
797 / 474 / 247
Регистрация: 26.11.2015
Сообщений: 1,516
Записей в блоге: 2
18.11.2019, 16:05 14
КОП, Да, немного о разном:
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
30
31
32
33
34
35
36
    struct User : IDisposable
    {
        public int ID { get; set; }
        public bool isDisp { get; set; }
 
        public void Dispose()
        {
            ID = 0;
            isDisp = true;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            User u = new User { ID = 1, isDisp = false };
            using (u)
            {
                Console.WriteLine(u.isDisp); //False
            }
            Console.WriteLine(u.isDisp);//False
 
            User u2;
            using (u2 = new User { ID = 1, isDisp = false })
            {
                Console.WriteLine(u2.isDisp);//False
            }
            Console.WriteLine(u2.isDisp);//False
 
 
            User u3 = new User { ID = 1, isDisp = false };
            Console.WriteLine(u3.isDisp);//False
            u3.Dispose();
            Console.WriteLine(u3.isDisp);//True
        }
    }
0
1099 / 772 / 217
Регистрация: 15.08.2010
Сообщений: 2,145
18.11.2019, 16:31 15
Toros1992, вы оба первых раза объявляете структуру снаружи. В моем же примере объявление внутри using. Поэтому диспоз в этом случае вызовется без боксинга, то есть на оригинальной структуре (так я понял работу constrained тут)
В ваших примерах с using всегда создаётся копия причем уже на входе в блок using
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.11.2019, 16:31

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Сделал COM компонент для 1С на C#, кому интересно смотрите
Сдесь все написано. Отпишите потом если понравится и если не понравится. мне это необходимо.!!!...

прога странно работает=) кому интересно покопать?
написал прогу по подсчету crc-16 (сама функция с википедии).. так вот... когда скармливаю файл...

База данных в дельфи кому просто интересно сделать
По автотрансопртному предприятию на примере маршруток города (хватит и одного маршрута и около...

Все кому интересно, что такое CompModel, сюда.
Может кто помнит, на днях у одного из обратившихся за помощью людей, была тема ...

Picture Zoom для Zoog (...ну и вообще кому интересно...)
Сразу извенюсь... в прошлый раз забыл про SetStretchBltMode. Кидаю API объявления...вроде ниче не...

Ищу консультанта/учителя С под Linux, Для тех,кому интересно делиться знаниями
Здравствуйте! Начал изучать Си под Linux при решении реальных задач. Ищу человека, для изучения...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.