在表达式中使用赋值是否可以?

时间:2008-11-06 20:20:47

标签: c# expression variable-assignment

我遇到了这段代码并希望其他人提供他们的观点......是好还是坏? ;)

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

然后在代码中使用如下:

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

这是关于我能给你的最简单的形式例子。 排队是......为什么我找不到例子?这叫什么?这只是在惹麻烦吗?

编辑:我指的是就地分配。我直到今天才知道

9 个答案:

答案 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时看起来更好。

我知道它有点偏离主题但是嘿嘿