Я наткнулся на этот код и хотел, чтобы другие высказали свою точку зрения ... хорошо это или плохо? ;)
Class ReportClass
{
public string ReportName {get; set;}
}
Затем он использовался в коде следующим образом:
displayReport(ReportClass.ReportName = cmbReportName.SelectedValue.ToString())
Это самый простой пример формы, который я могу вам дать. Вопрос ... почему я не могу найти примеры? Как бы это назвать? Это просто напрашивается на неприятности?
Обновлено: Я имею в виду назначение на месте. О чем я не знал до сегодняшнего дня
Как бы это назвать? Назначение на месте или составные операторы?





Мне кажется, это нормально. Вероятно, он скомпилирован с C# 3.0 и позволяет использовать Автоматические свойства C#.
Автоматические свойства являются частью C# 3.0, а не .NET 3.0 - они отлично работают при ориентации на .NET 2.0.
Вы имели в виду автоматические свойства или назначение на месте?
Зависит от вашей команды ИМО. Если бы ваша команда состояла из разработчиков в стиле 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 разработчик. :П
Я тоже не фанат, читабельность тоже нравится ... но иногда мне просто лень :-)
Это совершенно нормально. Они оба.
Автоматические свойства (вещь {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 - на самом деле, это особый случай.
Лично я считаю, что назначение параметра не очень удобочитаемо. Общий поток выполнения просто искажается из-за того, что операция действительно происходит внутри списка параметров.
Мне нравится думать, что мой код должен выражать намерение, а не сохранять пробелы. И мое намерение в этом примере было бы именно тем, что предлагает EvilSyn: сначала присвоить значение, а затем передать его методу.
Чрезмерно простой код, растянутый пробелами, усыпляет. Краткость - это достоинство ВСЕХ форм выражения. Настоящие бухгалтеры могут писать COBOL на любом языке.
Что касается наименования свойства, у вас есть ReportClass, я бы изменил его на Report, а свойство на нем изменилось с ReportName на просто Name. Спасает вас от набора текста (хотя да, intellisense доступен). Лучше выглядит при кодировании как Report.Name.
Я знаю, что это немного не по теме, но эй-хо
Я имею в виду назначение на месте. О чем я не знал до сегодняшнего дня.