C#中是否有类似于PHP的list()语言结构?

3

PHP有一种语言结构list(),可以在一条语句中提供多个变量赋值。

$a = 0;
$b = 0;
list($a, $b) = array(2, 3);
// Now $a is equal to 2 and $b is equal to 3.

在C#中有类似的东西吗?

如果没有,是否有任何解决方法可以避免像下面这样的代码,而不必处理反射

public class Vehicle
{
    private string modelName;
    private int maximumSpeed;
    private int weight;
    private bool isDiesel;
    // ... Dozens of other fields.

    public Vehicle()
    {
    }

    public Vehicle(
        string modelName,
        int maximumSpeed,
        int weight,
        bool isDiesel
        // ... Dozens of other arguments, one argument per field.
        )
    {
        // Follows the part of the code I want to make shorter.
        this.modelName = modelName;
        this.maximumSpeed = maximumSpeed;
        this.weight= weight;
        this.isDiesel= isDiesel;
        /// etc.
    }
}
4个回答

5
抱歉,没有什么好的方法可以做到这一点,像你的示例代码一样的代码经常被编写。 这很糟糕。 我深表同情。
如果您愿意为简洁而牺牲封装性,您可以在此情况下使用对象初始化程序语法,而不是构造函数:
public class Vehicle
{
    public string modelName;
    public int maximumSpeed;
    public int weight;
    public bool isDiesel;
    // ... Dozens of other fields.
}

var v = new Vehicle {
    modelName = "foo",
    maximumSpeed = 5,
    // ...
};

如果您使用自动属性(C#3.0及更高版本,以及对象初始化程序),则无需牺牲封装性:http://msdn.microsoft.com/en-us/library/bb384054.aspx - Trevor Robinson
2
仍然需要做出一些牺牲;属性的set访问器需要是公共的(或者在你初始化它的地方可访问),才能使用对象初始化语法。如果你希望该属性在构造后只读,那么就没有办法了。 - mqp
1
@Trevor 公共(愚蠢的)设置器会破坏封装性。在公共字符串Foo {get;set;}中,没有比公共字符串Foo;更多的封装性(包括框架中的一堆属性只会让违反Demeter法则变得太容易)。 - Rune FS
@Rune:这取决于你对封装的理解。如果你的意思是一开始就不想要一个公开可设置的属性,那么是的。具有大量可设置属性的高级对象是面向对象设计不良的症状。(低级数据对象,例如用于序列化的对象,可能另当别论。)然而,我所指的是自动属性并不像公共变量那样糟糕,因为 setter 是微不足道的事情被隐藏在客户端之外,并且它的实现可以在以后任意更改。 - Trevor Robinson
@trevor http://en.m.wikipedia.org/wiki/Law_of_Demeter?wasRedirected=true。任何返回字段的属性(包括自动属性)都违反了德米特法则。因为使用返回值就是信任朋友的朋友,而不仅仅是信任你最近的朋友。 - Rune FS

2
我认为你正在寻找对象和集合初始化程序。
var person = new Person()
{
    Firstname = "Kris",
    Lastname = "van der Mast"
}

例如,当Firstname和Lastname都是Person类的属性时。
public class Person
{
    public string Firstname {get;set;}
    public string Lastname {get;set;}
}

这是C#编程指南链接:http://msdn.microsoft.com/zh-cn/library/bb384062.aspx - Trevor Robinson
不行,我不能在我的情况下使用这个,因为已经有一些包含设置器的属性执行一些有效性检查和操作。但是这可以用在“车辆”代码示例中。 - Arseni Mourzenko

1
"多变量初始化"还是"多变量赋值"?
对于初始化:
$a = 0; 
$b = 0; 
list($a, $b) = array(2, 3); 

将会是:

 int a=2, b=3;

对于赋值操作,没有捷径。必须是两个语句,但如果你愿意,可以将这两个语句放在同一行上:

 a=2; b=3;

我的问题有误。我说的是多个变量赋值。请注意。 - Arseni Mourzenko

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接