我遇到了这段代码并希望其他人提供他们的观点......是好还是坏? ;)
Class ReportClass
{
public string ReportName {get; set;}
}
然后在代码中使用如下:
displayReport(ReportClass.ReportName = cmbReportName.SelectedValue.ToString())
这是关于我能给你的最简单的形式例子。 排队是......为什么我找不到例子?这叫什么?这只是在惹麻烦吗?
编辑:我指的是就地分配。我直到今天才知道
答案 0 :(得分:5)
我倾向于避免就地分配 - 或者确实是这样的任何副作用 - 除了一个常见的习语:
string line;
while ((line = reader.ReadLine()) != null)
{
// Do something with line
}
(以及阅读流等的变体)
我也可以在参数调用中使用对象初始化器,例如
Foo(new Bar { X=1, Y=2 });
但是分配给现有对象中的属性......好吧,这都是主观的,但这不是我的一杯茶。
答案 1 :(得分:4)
我认为维护/更难以调试/更难理解代码更难。在调用该方法之前,我会在一行上进行赋值。
ReportClass.ReportName = cmbReportName.SelectedValue.ToString();
displayReport(ReportClass.ReportName);
我从未真正成为复合词的粉丝。
答案 2 :(得分:4)
完全没问题。他们两个。
{get; set;}
):在C#中引入。非常有用的功能。参数分配:很少用于C#但完全合法。基本上,它将赋值运算符(=)右侧的表达式赋值给左侧属性的属性,然后将该值传递给方法。
这在C中更常见,但我认为没有理由不应该在C#中允许它。有时它可能有助于提高可读性,有时它会使情况变得更糟。使用常识来确定何时适用。
答案 3 :(得分:2)
您的意思是自动属性还是就地分配?
取决于您的团队IMO。如果您的团队由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);
我一直都在使用它,而且我还没有看到有人在阅读它时感到困惑。
答案 4 :(得分:2)
Microsoft框架设计指南不鼓励在一行中放置多个语句,除非有直接语言支持,例如在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);
}
答案 5 :(得分:2)
我个人认为赋值作为参数不是很易读。通过在参数列表中实际执行操作,整个执行流程就会出现偏差。
我喜欢认为我的代码应该表达意图,而不是保存空白。我在这个例子中的意图正是EvilSyn建议的,首先赋值,然后将其传递给方法。
答案 6 :(得分:0)
对我来说似乎很好。它可能是用C#3.0编译的,允许C# automatic properties。
答案 7 :(得分:-1)
这真的是有效的代码吗?对我来说似乎是一个静态类。
我猜你曾经这样用过:
displayReport(new ReportClass { ReportName = cmbReportName.SelectedValue.ToString() } )
答案 8 :(得分:-1)
就命名属性而言,你有一个ReportClass,我会将其更改为Report,其中的属性从ReportName更改为Name。为您节省打字(尽管可以使用intellisense)。当编码为Report.Name时看起来更好。
我知道它有点偏离主题但是嘿嘿