Int cast как объект в свойствах равен 0, когда ноль

Извините, я не смог придумать лучшего названия для описания проблемы.

Я использую следующий код, чтобы упростить обновление определенных значений свойств конфигурации. Обратите внимание, что свойства конфигурации — это не просто целые числа, и их не просто 2, они просто упрощены для этого примера.

public class Config {
    public int VarA { get; set; }
    public int VarB { get; set; }
}
private Config config;
private void Update(Config newValues) {
    PropertyInfo[] properties = typeof(Config).GetProperties();
    foreach (PropertyInfo property in properties) {
        object n = property.GetValue(newValues);
        property.SetValue(config, n ?? property.GetValue(config));
    }
}

Метод Update проверяет свойства newValues ​​и обновляет свойства конфигурации, если значение определено.

Я инициализирую конфигурацию такими значениями (просто пример):

config = new Config() { VarA = 1, VarB = 2 };
Debug.WriteLine(config.VarA + " : " + config.VarB); // 1 : 2

Затем, если я хочу только обновить VarA до значения 0 и не трогать VarB, я делаю это:

Update(new Config() { VarA = 0 });
Debug.WriteLine(config.VarA + " : " + config.VarB); // 0 : 0

Но это приводит к тому, что VarB также устанавливается в 0, потому что для newValues ​​не было назначено значение, и нулевое значение, поскольку int равно 0, потому что int не может быть нулевым. Как мне сделать так, чтобы VarB оставался равным 2, если он не определен в newValues?

Почему вы Создайте новый Config и все, что вы хотите сделать, это изменить его? Почему бы просто не использовать Update("VarA", 1) на существующийConfig?

HimBromBeere 28.02.2019 10:49

«Но это приводит к тому, что VarB также устанавливается в 0, потому что для newValues ​​не было назначено значение, а нулевое значение, поскольку int равно 0, потому что int не может быть нулевым». Ну вроде. Дело не в том, что «нулевое значение, поскольку int равно 0», а в том, что «значение по умолчанию для int равно 0».

Jon Skeet 28.02.2019 10:50

Но в принципе, если вы хотите использовать «null» для «не было установлено», тогда все ваши свойства должны быть ссылочными типами или типами значений, допускающими значение NULL.

Jon Skeet 28.02.2019 10:51

@HimBromBeere Это просто упрощенный пример. Эти свойства сначала заполняются из разных файлов json, затем я сравниваю одно с другим, чтобы проверить измененные значения и обновить их, но переменная зависит от того, определено/изменено ли конкретное свойство.

Sakuya 28.02.2019 11:02
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
106
2

Ответы 2

В процедуре обновления для вашего параметра (Конфигурация новых значений) укажите существующий измененный параметр конфигурации вместо создания нового объекта конфигурации.

Создание нового объекта конфигурации сбрасывает все существующие значения.

config = new Config() { VarA = 1, VarB = 2 }; 
Debug.WriteLine(config.VarA + " : " + config.VarB);

config.VarA = 0;
Update(config);
Debug.WriteLine(config.VarA + " : " + config.VarB);

Спасибо, Джон Скит, я не знал, что вы можете сделать тип значения обнуляемым, поэтому работает следующее:

public class Config {
    public int? VarA { get; set; }
    public int? VarB { get; set; }
}

Я знаю, что в некоторых случаях может работать другой ответ, но я заполняю эти свойства конфигурации из разных файлов json, и есть много свойств, поэтому я бы не хотел вводить их все вручную.

Другие вопросы по теме