#c# #.net #oop #parameters
#c# #.net #ооп #параметры
Вопрос:
Я хочу передать объект методу, однако во время этого я хочу изменить свойство указанного объекта. Сейчас я делаю это так:
MyClass someClass= someClasses.FirstOrDefault(s => s.Propert1. == "1");
someClass.Property1 = 2;
MyMethod(someClass);
Однако я не хочу делать дополнительный шаг по созданию переменной и последующей настройке свойства.
MyMethod(someClasses.FirstOrDefault(s => s.Propert1. == "1")/*.ChangeProperty()?*/); //This is where I would like to change Property1's value.
Является ли это хорошей практикой, если это вообще возможно?
Комментарии:
1. Действительно ли выполнение дополнительного шага вызывает у вас проблему ..?
2. Я бы сказал, что вам действительно нужны 3 строки, поскольку сжатие их до 1 строки затрудняет чтение и понимание.
3. Я думаю, что в этом случае будет легче понять 3 строки кода, а не одну строку. Почему вам нужна только одна строка кода?
4. Первый пример выглядит гораздо более понятным и понятным, чем второй. Я бы остался с первым.
5. если вы проверите какую-либо практику стандартов кодирования, вам будет предложено написать код, который прост в обслуживании и понятен вам и другим
Ответ №1:
Я не вижу никаких причин делать это в одной строке. Этот код выглядит абсолютно нормально:
MyClass someClass= someClasses.FirstOrDefault(s => s.Propert1. == "1");
someClass.Property1 = 2;
MyMethod(someClass);
Если вы хотите, вы можете добавить метод расширения, который делает это:
// put this in a static class
static T WithNewPropertyValue<T>(this T t, Action<T> action) where T : class
{
action(t);
return t;
}
И назовите это так
MyMethod(someClasses.FirstOrDefault(s => s.Propert1 == "1").WithNewPropertyValue(x => x.Propert1 = "2"));
Но я чувствую, что это снижает читаемость кода.
Ответ №2:
Вы можете сделать это с помощью метода расширения, который изменяет свойство и возвращает измененный объект:
public static MyClass WithProperty2(this MyClass source, int value)
{
if (source != null) // make sure you handle null
source.Property2 = value;
return source;
}
Теперь у вас есть свободный API для создания однострочников (что не делает ваш код намного более удобным в обслуживании):
MyMethod(someClasses.FirstOrDefault(s => s.Propert1. == "1").WithProperty2(42))