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

Конструктор экземпляра класса с параметрами ссылочного типа, проверка на null

12.10.2020, 22:30. Показов 1745. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Если конструктор экземпляра класса содержит параметры ссылочного типа, то как лучше в общем случае поступать:
1. Организовать проверку аргументов на null прямо в конструкторе (например, если речь о массиве, то можно провести проверку на null и если null, то создать массив-заглушку нулевой длины и т.п., либо как-то по другому обработать эту ситуацию)
2. Организовывать проверка на null перед вызовом конструктора
3. Не проверять на null вообще - если выдаст исключение, то это будет говорить о неверной логике программы
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.10.2020, 22:30
Ответы с готовыми решениями:

Пример класса с конструктором и деструктором, создание экземпляра класса через конструктор с параметрами
Привести пример класса с конструктором и деструктором, созданием экземпляра класса с помощью конструктора с параметрами.

Правильно обработать переменную ссылочного типа на null внутри метода
Добрый день! вопрос вроде простой, но никак не пойму, как правильнее сделать. Простая ситуация: public void DoSomething(object...

Конструктор класса или специальный метод созодания экземпляра класса?
Можно ли сформулировать критерии, по которым имеет смысл делать выбор способа создания экземпляра класса - конструктор класса или...

9
99 / 81 / 93
Регистрация: 03.12.2013
Сообщений: 217
12.10.2020, 23:28
titan4ik, Как по мне, то многое зависит от конкретной реализации. Но если постараться как-то "обобщить", то я думаю так:
Цитата Сообщение от titan4ik Посмотреть сообщение
1. Организовать проверку аргументов на null прямо в конструкторе (например, если речь о массиве, то можно провести проверку на null и если null, то создать массив-заглушку нулевой длины и т.п., либо как-то по другому обработать эту ситуацию)
В принципе, если говорить о List например, то лучше просто добавить в него дефолтное значение, которое будет создавать пустой List (то есть List без инициализации в консрукторе всеравно не будет null). Также в конструкторе можно проверять и давать переменным дефолтные значения, если значение null.

Но здесь главное с умом. Потому что если в List мы знаем, что там будет именно такой List, а вопрос только - пустой или уже чем-то заполнен сразу, то с классами, которые вы создаете, все не так однозначно и часто для переменных удобно использовать null, чтобы потом просто проверять: если не null - значение переданы, если null - то по тем или иным причинам значения нет.
Цитата Сообщение от titan4ik Посмотреть сообщение
2. Организовывать проверка на null перед вызовом конструктора
Например я всегда прикидываю может ли переменная быть null и стараюсь проработать различные ситуации перед вызовом конструктора. Но это совершенно не значит, что я всегда должен проверять переменные только перед вызовом конструктора. Это скорее действие "на всякий случай".
Цитата Сообщение от titan4ik Посмотреть сообщение
3. Не проверять на null вообще - если выдаст исключение, то это будет говорить о неверной логике программы
Это тоже возможно, но зависит, опять же, от ситуации. Например, если вы принимаете в юзера аргументом List, но ваш код может работать и с пустым List-ом, то будет не слишком правильным просто оставлять все так и выдавать ошибку, ведь мы это могли очень легко учесть и избежать. Но если пользователь должен передать класс Students (в котором должны быть разные ученики, их количество и т.д.) то будет вполне целесообразно выдать сразу ошибку о null, причем, в идеальном варианте, через try / catch с понятным текстом.
1
Заблокирован
12.10.2020, 23:40  [ТС]
Sacred6661,
иными словами - нужно в каждом конкретном случае руководствоваться здравым смыслом. Никаких общих требований и/или рекомендаций нет.
1
99 / 81 / 93
Регистрация: 03.12.2013
Сообщений: 217
12.10.2020, 23:47
titan4ik, Именно так. Я вот как раз еще дописывал здесь некоторые мысли, чтобы больше прояснить что я имею в виду, но вижу вы и так все прекрасно поняли)
0
 Аватар для aenye
304 / 186 / 45
Регистрация: 05.07.2018
Сообщений: 580
12.10.2020, 23:54
titan4ik, Если null - допустимое значение (лучше так не делать) - обрабатывать в зависимости заложенной логики, иначе - бросать эксепшн.
Всяческие заглушки, null-object паттерн, например - это проблемы вызывающей стороны. Сам класс не может, и не обязан знать, передали ли ему null по ошибке, или это так и задумывалось.
В, целом, жадничать на ArgumentNullException не нужно. Жмотство в отношении этой штуки приводит к веселым танцам с бубном отладчиком и анализу нескольких килограммов логов в 3 часа ночи в попытках найти корень всех зол.
1
Заблокирован
13.10.2020, 00:14  [ТС]
Цитата Сообщение от aenye Посмотреть сообщение
В, целом, жадничать на ArgumentNullException не нужно.
Вы имеете ввиду использовать в конструкторе try/catch ?
0
 Аватар для aenye
304 / 186 / 45
Регистрация: 05.07.2018
Сообщений: 580
13.10.2020, 00:43
Лучший ответ Сообщение было отмечено titan4ik как решение

Решение

titan4ik, неа.
Вот самый банальный пример:
C#
1
2
3
4
5
6
7
8
9
10
11
public class Foo
{
    private readonly SomeFirstType _somethingFirst;
    private readonly SomeSecondType _somethingSecond;
 
    public Foo(SomeFirstType somethingFirst, SomeSecondType somethingSecond)
    {
        _somethingFirst = somethingFirst ?? throw new ArgumentNullException(nameof(somethingFirst));
        _somethingSecond = somethingSecond ??  throw new ArgumentNullException(nameof(somethingSecond));
    }
}
1
Заблокирован
13.10.2020, 00:50  [ТС]
aenye, спасибо, понятно.
А если дело касается не полей, а свойств, то это лучше делать в сеттере свойства, а не в конструкторе?
У меня интуитивное представление, что конструктор нужно поменьше загружать разными функциями.
0
 Аватар для aenye
304 / 186 / 45
Регистрация: 05.07.2018
Сообщений: 580
13.10.2020, 01:25
Цитата Сообщение от titan4ik Посмотреть сообщение
А если дело касается не полей, а свойств, то это лучше делать в сеттере свойства
В целом да. Частенько инициализация пропертей через конструктор происходит, а значение через метод меняется. Если при этом сделать валидацию не в сеттере - то в конструкторе условие поменяете, а в методе - забудете. И будут ошибки из-за неоднозначности.
Но бывают ситуации, когда такую реализацию не получается использовать.

Добавлено через 15 минут
Цитата Сообщение от titan4ik Посмотреть сообщение
У меня интуитивное представление, что конструктор нужно поменьше загружать разными функциями.
Что касается проверок - их там должно быть ровно столько, сколько нужно для создания валидного объекта.
2
Заблокирован
13.10.2020, 11:35  [ТС]
aenye, спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.10.2020, 11:35
Помогаю со студенческими работами здесь

Чем отличается конструктор класса от экземпляра класса?
Чем отличается конструктор класса от экземпляра класса?

Для чего null при создании экземпляра класса?
Добрый вечер! Вопрос следующий, во второй строке кода, а именно City biggestcity = null, зачем делать именно так и почему нельзя создать...

Не могу передать параметр в родительский конструктор при создании экземпляра класса
Хочу создать экземпляр класса Human, и передать в конструктор его родительского класса параметр size . Для этого вызываю в классе Human...

Конструктор класса и byte[] null
Всем привет! Есть класс organization,обычный класс, телефоны ,адреса и т.д. При объявлении нового экземпляра класса, я добавляю логотип к...

Создать конструктор класса TimeLine с параметрами
Как создать конструктор класса TimeLine с параметрами, т.е. конструктор не по-умолчанию. То есть такой вариант конструктора меня не...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru