c#, если еще сокращенно
-
21-12-2019 - |
Вопрос
В c# могу ли я сделать что-то подобное в сокращенном виде?
bool validName = true;
if (validName)
{
name = "Daniel";
surname = "Smith";
}
else
{
MessageBox.Show("Invalid name");
}
Мне просто было интересно, сработает ли что-то подобное этому, но именно в этом сценарии, я знаю, вы можете присваивать значения, если я сделал name = validName ?"Дэниел" :"Недействительно", но мне просто было интересно, могу ли я сделать нижеприведенное?
validName ?
{
name = "Daniel";
surname = "Smith";
}
:
{
MessageBox.Show("Invalid name");
}
Решение
Злоупотребление лямбда-синтаксисом и выводом типов:
(validName
? (Action)
(() =>
{
name = "Daniel";
surname = "Smith";
})
: () =>
{
MessageBox.Show("Invalid name");
})();
Я знаю, на самом деле это не ответ.Утверждение If намного лучше:очевидно, что этот синтаксис менее удобочитаем и, что более важно, он имеет другое поведение во время выполнения и может привести к непреднамеренным побочным эффектам из-за потенциальных замыканий, создаваемых лямбда-выражениями.
Синтаксис тоже немного загадочен.Сначала он создает два Action
объекты, тогда ?:
оператор выбирает между ними, и, наконец, выполняется выбранный результат:
var a1 = new Action(() => { /* if code block */ });
var a2 = new Action(() => { /* else code block */ });
Action resultingAction = test_variable ? a1 : a2;
resultingAction();
Я объединил это в одном заявлении, выполнив результирующее действие на месте.Чтобы сделать его еще более кратким, я преобразовал первое лямбда-выражение в Action
(вместо того, чтобы создавать new Action()
явно) и, воспользовавшись преимуществом вывода типа, я опустил второе приведение.
Другие советы
Допустим, вы могли бы сделать это.Почему?
Что такое мотивация?
Меньше строк?недостаточно, чтобы иметь значение. Представление?Нет, компилятор будет справиться с тобой для вас. Ясность?Если / иначе понятнее и легче понимать большинство разработчиков.
Я уверен, что если вы достаточно усердно работали, вы можете найти способ обрабатывать это (скорее всего, клюди), но я до сих пор не могу определить почему.
нет.
Темнарный оператор (? :) Должно быть, в целом выражение - то есть то, что можно назначить на что-то.
Условный оператор требует, чтобы его второе и третий операнды должны быть выражениями, которые возвращают значение (в дополнение к удовлетворению некоторых типовых ограничений), а не операторы, которые не решают значение.Вы не имеете значения, которые вы хотите вернуться с любой операции, вы в настоящее время выполняете.
Вы могли бы вернуть некоторое бессмысленное значение только для того, чтобы сделать компиляцию кода, но в этот момент вы добавляете более тонкую работу, чем просто используя if
, который является правильным семантическим оператором для ваших требований, поэтому пока оноТехнически возможно, это не хорошая идея.
fullName = validName == true ? returnName(firstName)+" "+returnName(lastName) : validName == false ? invalidName("Invalid Name") : null
public string returnName(string name)
{
return name;
}
public string invalidName(string invalid)
{
MessageBox.Show(invalid);
return null;
}
.
Как все остальные, вероятно, сказали, что это то, что вы, вероятно, не захотите делать, но можно: P