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

Необязательные параметры без значения

10.10.2017, 16:24. Показов 7008. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Хочу написать метод сохранения блока настроек программы в Properties.Settings.Default.
Писать метод сохранения каждой отдельной переменной в блоке не хочется:

C#
1
2
3
4
5
6
7
8
9
10
        public static void SaveMaxDateParam(DateTime date)
        {
            Properties.Settings.Default.MaxDate = date;
      }
 
        public static void SaveMinDateParam(DateTime date)
        {
            Properties.Settings.Default.MinDate = date;
      }
     ....
Общий метод будет выглядеть так:
C#
1
2
3
4
5
6
        public static void SaveParams(DateTime maxdate, DateTime mindate, ...)
        {
            Properties.Settings.Default.MaxDate = maxdate;
            Properties.Settings.Default.MinDate = mindate;
              ...
      }
Но в этом случае я должен буду явно указать значения всех параметров. А я хочу сделать их необязательными.
Что-то типа:
C#
1
2
3
4
5
6
        public static void SaveParams(DateTime maxdate = new DateTime(DateTime.Today.Year, 12,31), DateTime mindate = new DateTime(DateTime.Today.Year, 1,1), ...)
        {
            Properties.Settings.Default.MaxDate = maxdate;
            Properties.Settings.Default.MinDate = mindate;
              ...
      }
Но тогда параметрам, которые не определены явно, будет передаваться значение по умолчанию, а мне необходимо оставить их значения "как есть".
Есть ли какой-то способ обойти все эти "но"? Т.е. в результате мне нужен метод с необязательными параметрами, которые НЕ имеют значения по умолчанию. Возможно ли такое?
Вызов метод будет осуществляться через именованные параметры :

C#
1
2
SaveParams(maxdate: date1);
SaveParams(mindate: date2);
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.10.2017, 16:24
Ответы с готовыми решениями:

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

Необязательные параметры и params - как в params ввести несколько аргументов
Интересует такой вопрос, если у меня есть набор необязательных параметров в методе, для примера: static void...

Необязательные параметры (значения по умолчанию) методов класса
Коллеги, добрый день. Учусь, потому прошу не судить строго. Сразу отмечу, что подобный вопрос задал, продолжая диалог в ветке, но...

17
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
10.10.2017, 16:43
Лучший ответ Сообщение было отмечено wrq2017 как решение

Решение

wrq2017, создай класс настроек, где каждой настройке будет соответствовать свойство и сохраняй экземпляр этого класса.
2
964 / 485 / 241
Регистрация: 02.06.2016
Сообщений: 760
10.10.2017, 18:00
wrq2017, можно завернуть все в Nullable, или как в EF поступили - передавать анонимный объект и рефлексией выдергивать свойства
Кликните здесь для просмотра всего текста
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
37
38
static void SaveParams(DateTime? a = null, int? b = null)
{
    Console.WriteLine("=== SaveParams");
 
    // подставить значение по умолчанию
    Console.WriteLine(a ?? DateTime.Now);
 
    // сохранить b если он задан
    if (b.HasValue) Console.WriteLine(b);
}
 
static void SaveParams2<T>(T Params)
{
    Console.WriteLine("=== SaveParams2");
 
    // подставить значение по умолчанию
    var a_prop = typeof(T).GetProperty("a");
    var a = a_prop?.GetValue(Params) as DateTime? ?? DateTime.Now;
    Console.WriteLine(a);
 
    // сохранить b если он задан
    var b_prop = typeof(T).GetProperty("b");
    if (b_prop != null)
        Console.WriteLine((int)(b_prop?.GetValue(Params) ?? 123));
}
 
static void Main()
{
    var dt = DateTime.Parse("01.12.1999");
 
    SaveParams(a: dt, b: 241);
    SaveParams(a: dt);
    SaveParams(b: 241);
 
    SaveParams2(new { a = dt, b = 241 });
    SaveParams2(new { a = dt });
    SaveParams2(new { b = 241 });
}
1
Эксперт .NET
 Аватар для Rius
13104 / 7662 / 1673
Регистрация: 25.05.2015
Сообщений: 23,367
Записей в блоге: 14
10.10.2017, 18:02
Цитата Сообщение от Aael Посмотреть сообщение
можно завернуть все в Nullable, или как в EF поступили - передавать анонимный объект и рефлексией выдергивать свойства
Плохой способ.
В настройках есть тенденция к увеличению параметров. А когда оно заранее неизвестно, да и вообще более разумного числа, следует упаковать в один объект. Как во 2 ответе.
3
964 / 485 / 241
Регистрация: 02.06.2016
Сообщений: 760
10.10.2017, 18:49
Цитата Сообщение от Rius Посмотреть сообщение
Плохой способ.
Я отталкивался от вопроса про функцию с кучей аргументов. Но если глубже копать, то просто "модель" не решает задачи поставленной ТС (про определение незатронутых полей). Тут, видимо, нужна концепция чего-то типа "Dirty" флагов, и как по мне, самый короткий способ реализации такой модели - это завернуть все свойства в Nullable.. *рассуждения о сферическом вакууме
0
Эксперт .NET
 Аватар для Rius
13104 / 7662 / 1673
Регистрация: 25.05.2015
Сообщений: 23,367
Записей в блоге: 14
10.10.2017, 18:53
Ну, исходный вопрос был о том, как не писать множество одинаковых методов.
А проблема откуда взять параметры по умолчанию может быть решена чтением их из тех же настроек перед первым обращением к настройкам. Если они были сохранены, то просто берутся предыдущие, если нет - по умолчанию. В случае единого объекта настроек это всё можно сконцентрировать в одном месте.
0
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
11.10.2017, 10:16  [ТС]
Цитата Сообщение от diadiavova Посмотреть сообщение
wrq2017, создай класс настроек, где каждой настройке будет соответствовать свойство и сохраняй экземпляр этого класса.
Добрый день!
Я примерно так и планировал сделать. Т.е. создал класс настроек, одно свойство - одна настройка. А можно пример метода сохранения экземпляра класса? Именно этот метод в классе я и пытаюсь сделать.

Добавлено через 10 минут
Т.е. я предполагаю следующую логику работы с настройками: в случае если файл с настройками уже создан на компе (не первый запуск программы), то настройки читаются из файла, в процессе работы пользователь их меняет, при закрытии соответствующего окна программы настройки сохраняются.
Если запуск программы первый (файл настроек еще не создан), то настройкам задаются начальные значения, пользователь меняет их в процесса работы, по окончанию работы они сохраняются в файл.
Всё логично ?

Добавлено через 14 минут
В общем-то, основная идея понятна - перед сохранением настроек (передачей параметров методу) все они должны иметь какие-либо значения - либо из файла настроек, либо значения по умолчания.
Однако дьявол, как всегда, кроется в мелочах.
Я понимаю как написать метод со значением по умолчанию:

C#
1
2
3
4
5
6
 public static void SaveParams(DateTime maxdate = new DateTime(DateTime.Today.Year, 12,31), DateTime mindate = new DateTime(DateTime.Today.Year, 1,1), ...)
        {
            Properties.Settings.Default.MaxDate = maxdate;
            Properties.Settings.Default.MinDate = mindate;
              ...
      }
А как теперь заменить это значение по умолчанию на значение, прочитанное из файла?
0
Эксперт .NET
 Аватар для Rius
13104 / 7662 / 1673
Регистрация: 25.05.2015
Сообщений: 23,367
Записей в блоге: 14
11.10.2017, 10:30
wrq2017, например Полный класс для работы с INI-файлами (поддерживает Юникод) , без Properties.Settings.
0
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
11.10.2017, 10:35  [ТС]
А зачем, кстати, нужен экземпляр класса? Разве не логичнее сделать эти поля static?
0
Эксперт .NET
 Аватар для Rius
13104 / 7662 / 1673
Регистрация: 25.05.2015
Сообщений: 23,367
Записей в блоге: 14
11.10.2017, 10:49
wrq2017, не логичнее, есть некоторые нюансы, делающие static неудобным.
Ваши поля вроде Properties.Settings.Default.MaxDate тоже не являются статическими.
Статическим является Properties.Settings.Default, возвращающий экземпляр класса настроек:
C#
1
2
3
4
5
        public static Settings Default {
            get {
                return defaultInstance;
            }
        }
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
11.10.2017, 11:05
Тоже интересует вопрос, где хранить настройки программы. Раньше думал что можно только через INI файлы, оказывается есть еще Properties.Settings. Где можно читануть про это ?
0
Эксперт .NET
 Аватар для Rius
13104 / 7662 / 1673
Регистрация: 25.05.2015
Сообщений: 23,367
Записей в блоге: 14
11.10.2017, 11:18
Почтальон,
https://msdn.microsoft.com/en-... s.80).aspx
https://msdn.microsoft.com/ru-... txexh.aspx
https://msdn.microsoft.com/ru-... .110).aspx
https://habrahabr.ru/post/271483/
В книгах ещё много места уделяется файлам конфигурации (app config).
1
.NET C#,ASP.NET MVC
Эксперт .NET
 Аватар для lvlkoo
594 / 507 / 224
Регистрация: 16.10.2010
Сообщений: 1,902
11.10.2017, 11:19
Цитата Сообщение от Почтальон Посмотреть сообщение
Тоже интересует вопрос, где хранить настройки программы. Раньше думал что можно только через INI файлы, оказывается есть еще Properties.Settings. Где можно читануть про это ?
Это же MS, они бы все в xml запихнули.

Можно еще сохранять в app.config

Типо
C#
1
ConfigurationManager.AppSettings["MyKey"]
А так вы можете сохранять где вам захочется

И еще я бы добавил что можно написать свой врапер ApplicationSettingsBase с которым достаточно (как по мне) удобное работать)
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
11.10.2017, 11:21
Rius, премного благодарен
0
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
11.10.2017, 11:26  [ТС]
По основной теме. Сейчас пока сделал так:
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
    class Filters
    {
        public static DateTime minDate { get; set; } 
        public static DateTime maxDate { get; set; } 
        public static int typeOfPlan { get; set; } 
        public static int typeOfValue { get; set; } 
        public static int contract { get; set; } 
        public static int lact { get; set; } 
        
        public Filters()
        {
            minDate = ReadParams(new DateTime(1900, 1, 1), Properties.Settings.Default.датаМин);
            maxDate = ReadParams(new DateTime(DateTime.Today.Year, 12,31), Properties.Settings.Default.датаМакс);
            typeOfPlan = ReadParams(0, Properties.Settings.Default.typeOfPlan);
            typeOfValue = ReadParams(0, Properties.Settings.Default.typeOfValue);
            contract = ReadParams(0, Properties.Settings.Default.contract);
            lact = ReadParams(0, Properties.Settings.Default.lact); 
        }
 
        
        public static DateTime ReadParams(DateTime date, DateTime property)
        {
            DateTime result;            
            try {
                if (property > date)
                    result = property;
                else result = date;
 
            }
            catch {result = date; }
            return result;
        }
 
        public static int ReadParams(int value, int property)
        {
            int result;
            try { result = property; }
            catch { result = value; }
            return result;
        }
        public static void SaveParams()
        {
            Properties.Settings.Default.датаМин = minDate;
            Properties.Settings.Default.датаМакс = maxDate;
            Properties.Settings.Default.typeOfValue = typeOfValue;
            Properties.Settings.Default.typeOfPlan = typeOfPlan;
            Properties.Settings.Default.contract = contract;
            Properties.Settings.Default.lact = lact;
            Properties.Settings.Default.Save();
        }
    }
Сохранение, соответственно, не требует вообще никаких параметров:
C#
1
Filters.SaveParams()
0
Эксперт .NET
 Аватар для Rius
13104 / 7662 / 1673
Регистрация: 25.05.2015
Сообщений: 23,367
Записей в блоге: 14
11.10.2017, 11:32
Для сравнения
C#
1
2
3
this.textBox1.Text = Saved<Options>.Instance.FileName;
this.textBox2.Text = Saved<Options>.Instance.Filter;
this.textBox3.Text = Saved<Options>.Instance.Meas.Index;
C#
1
2
3
4
Saved<Options>.Instance.FileName = this.textBox1.Text;
Saved<Options>.Instance.Filter = this.textBox2.Text;
Saved<Options>.Instance.Meas.Index = this.textBox3.Text;
Saved<Options>.Save();
0
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
11.10.2017, 12:33
Цитата Сообщение от wrq2017 Посмотреть сообщение
А можно пример метода сохранения экземпляра класса? Именно этот метод в классе я и пытаюсь сделать.
Сериализация в XML. XmlSerializer | C#
Хотя, надо сказать, что тут уже упомянутый выше механизм Settings, мало того, что как раз для этой цели и предназначен, так он еще имеет очень серьезную поддержку со стороны IDE и работать с ним легко и приятно. Создание собственных классов настроек целесообразно в тех случаях, если по каким-то причинам вышеупомянутый механизм не подходит. Просто вопрос был о параметрах, поэтому я и написал, что вместо параметров метода лучше использовать свойства объекта, который и будет единственным параметром.

И кстати, XML - не единственный формат сериализации, просто теперь, когда ты знаешь, что сохранение объекта называется сериализацией, ты вполне сможешь нагуглить остальное, если этого тебе будет мало. ))
0
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
11.10.2017, 14:31  [ТС]
Я догадываюсь, что запутал вас своими, быть может, не совсем точными формулировками. Для хранения настроек программы предполагаю использовать только механизм Settings. Во всяком случае, для блока фильтров таблиц. Для упрощения работы с этим блоком был создан отдельный класс. Собственно, вопрос, наверно, возник из-за недостаточного понимания особенностей работы классов. Т.е. текущий набор полей (экземпляр класса) можно сохранять в Settings без передачи каждого значения как параметра метода, а, значит, и не надо думать над тем как их передавать.

А вот если, к примеру, я хочу создать класс некоторых свойств таблицы (видимость колонок, свойство ReadOnly, ширина, порядок), которые пользователь захочет изменять и сохранять, то, как я понимаю, Settings уже не обойтись.
Мне будет необходимо сохранять массив экземпляров данного класса. И вот тут помогут ссылки по сериализации.

В любом случае, всем спасибо за дискуссию и материалы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.10.2017, 14:31
Помогаю со студенческими работами здесь

Необязательные параметры
Народ, подскажите, пожалуйста, как в отчёт добавить необязательный параметр? Есть регистр сведений, данные из которого я хочу вывести так...

Необязательные параметры в URL
Есть функция: public static function convert_url($pattern){ $m = '#^'; $m = preg_replace_callback('#\{+\}#',...

Есть ли в Java необязательные аргументы/параметры по умолчанию
Всем привет! Java тока учу, подскажите, пожалуйста, есть ли в Java необязательные аргументы, ну т.е. те, которые можно как-то обозначить в...

Алгоритм проверки для функции, имеющей необязательные параметры
Добрый день! В случае отсутствия или передачи из 3-х необязательных аргументов 2-х, 3-х или 1 по выбору пользователя, являющимся...

Параметры-значения и параметры-переменные в функции и процедуре
Плиз помогите в этом коде поставить параметры или атрибуты, не уверен в правильном названии, для функции и процедуры, я по примерам...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
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 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru