Можно ли использовать присваивания в выражениях?

Я наткнулся на этот код и хотел, чтобы другие высказали свою точку зрения ... хорошо это или плохо? ;)

Class ReportClass
{
 public string ReportName {get; set;}
}

Затем он использовался в коде следующим образом:

displayReport(ReportClass.ReportName = cmbReportName.SelectedValue.ToString())

Это самый простой пример формы, который я могу вам дать. Вопрос ... почему я не могу найти примеры? Как бы это назвать? Это просто напрашивается на неприятности?

Обновлено: Я имею в виду назначение на месте. О чем я не знал до сегодняшнего дня

Я имею в виду назначение на месте. О чем я не знал до сегодняшнего дня.

Brian Leahy 06.11.2008 23:35

Как бы это назвать? Назначение на месте или составные операторы?

Brian Leahy 06.11.2008 23:37
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
752
9

Ответы 9

Мне кажется, это нормально. Вероятно, он скомпилирован с C# 3.0 и позволяет использовать Автоматические свойства C#.

Автоматические свойства являются частью C# 3.0, а не .NET 3.0 - они отлично работают при ориентации на .NET 2.0.

Jon Skeet 06.11.2008 23:45

Вы имели в виду автоматические свойства или назначение на месте?

Зависит от вашей команды ИМО. Если бы ваша команда состояла из разработчиков в стиле C. Тогда я думаю, что это нормально.

Но если этот код будет поддерживаться, скажем, разработчиками VB, вам понадобится чтобы сделать это более читаемым.

Примеры? Оператор присваивания (=) в языках C также возвращает присвоенные ему значения.

var a = 0;
var b = 0;

// This makes a *and* b equals to 1
a = b = 1; 

// This line prints 3 and a is now equals to 3
Console.WriteLine(a = 3);

// This line prints 7 and a and b is now equals to 7
Console.WriteLine(a = b = 7);

Я считаю, что такое задание вполне естественно. Потому что C-языки, кажется, поощряют сокращенные обозначения IMO.

Если вам нужно больше читабельности и меньше проблем, я бы сказал, что новая строка - хорошее дополнение.

displayReport(
    ReportClass.ReportName = cmbReportName.SelectedValue.ToString());

Сделайте свои намерения более ясными, когда каждый оператор смешанный находится на разных строках. (но все же составное заявление)

Или сначала извлеките правую часть в ее собственную переменную, например

var reportName = cmbReportName.SelectedValue.ToString();

displayReport(ReportClass.ReportName = reportName);

Я использую его все время, и я еще не видел, чтобы кто-нибудь растерялся, прочитав его.

Я думаю, что это сложнее поддерживать / сложнее отлаживать / сложнее понимать код. Я бы выполнил задание в строке до вызова этого метода.

ReportClass.ReportName = cmbReportName.SelectedValue.ToString();
displayReport(ReportClass.ReportName);

Я никогда не был поклонником составных утверждений.

И ... Я тоже не VB разработчик. :П

EvilSyn 06.11.2008 23:36

Я тоже не фанат, читабельность тоже нравится ... но иногда мне просто лень :-)

chakrit 06.11.2008 23:45

Это совершенно нормально. Они оба.

  • Автоматические свойства (вещь {get; set;}): введены в C#. Очень полезная функция.

  • Назначение параметров: редко используется в C#, но полностью законно. Обычно он присваивает значение выражения справа от оператора присваивания (=) свойству для свойства слева, а затем передает это значение в метод.

    Это чаще встречается в C, но я не вижу причин, почему бы это не было разрешено и в C#. Иногда это может улучшить читаемость, а иногда и ухудшить. Используйте здравый смысл, чтобы решить, что применимо и когда.

Это действительно правильный код? Мне кажется, что это статический класс.

Я бы предположил, что вы использовали это так:

displayReport(new ReportClass { ReportName = cmbReportName.SelectedValue.ToString() } )

Я стараюсь избегать назначения на месте - или вообще любых подобных побочных эффектов - за исключением одной распространенной идиомы:

string line;
while ((line = reader.ReadLine()) != null)
{
    // Do something with line    
}

(И варианты для чтения потоков и т. д.)

Я также могу использовать инициализаторы объектов в вызовах параметров, например.

Foo(new Bar { X=1, Y=2 });

но присвоение свойству в существующем объекте ... ну, это все субъективно, но это не моя чашка чая.

Рекомендации по разработке Microsoft Framework не рекомендуют размещать несколько операторов в одной строке, за исключением случаев, когда имеется прямая языковая поддержка, например, в операторе for. Поскольку существует явная языковая поддержка для множественного назначения,

int a, b, c;
a = b = c = 0;

разрешено. С другой стороны, использование кода формы, используемого в вашем примере, не рекомендуется.

Как насчет этого, люди?

while ((packetPos = Packet.FindStart(buffer, nextUnconsideredPos)) > -1)

Чтобы избежать встроенного присваивания, вам придется повторно использовать множители, например:

packetPosition = Packet.FindStart(buffer, nextUnconsideredPosition);
while (packetPosition > -1)
{
  ...
  packetPosition = Packet.FindStart(buffer, nextUnconsideredPosition);
}

Такого рода цикл while довольно идиоматичен, IMO - на самом деле, это особый случай.

Jon Skeet 07.11.2008 00:03

Лично я считаю, что назначение параметра не очень удобочитаемо. Общий поток выполнения просто искажается из-за того, что операция действительно происходит внутри списка параметров.

Мне нравится думать, что мой код должен выражать намерение, а не сохранять пробелы. И мое намерение в этом примере было бы именно тем, что предлагает EvilSyn: сначала присвоить значение, а затем передать его методу.

Чрезмерно простой код, растянутый пробелами, усыпляет. Краткость - это достоинство ВСЕХ форм выражения. Настоящие бухгалтеры могут писать COBOL на любом языке.

Peter Wone 13.03.2010 15:03

Что касается наименования свойства, у вас есть ReportClass, я бы изменил его на Report, а свойство на нем изменилось с ReportName на просто Name. Спасает вас от набора текста (хотя да, intellisense доступен). Лучше выглядит при кодировании как Report.Name.

Я знаю, что это немного не по теме, но эй-хо

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