Есть ли языковая конструкция, похожая на PHPs list () в C #? - PullRequest
3 голосов
/ 30 августа 2010

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 голосов
/ 30 августа 2010

Нет, я боюсь, что нет хорошего способа сделать это, и код, подобный вашему примеру, часто пишется.Это отстой.Мои соболезнования.

Если вы готовы пожертвовать инкапсуляцией для краткости, вы можете использовать синтаксис инициализатора объекта вместо конструктора:

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,
    // ...
};
2 голосов
/ 30 августа 2010

Я думаю, вы ищете инициализаторы объектов и коллекций .

var person = new Person()
{
    Firstname = "Kris",
    Lastname = "van der Mast"
}

например, где Имя и Фамилия оба являются свойствами класса Person.

public class Person
{
    public string Firstname {get;set;}
    public string Lastname {get;set;}
}
1 голос
/ 30 августа 2010

"Несколько переменных инициализация " или "Несколько переменных присваивание "?

Для инициализации

$a = 0; 
$b = 0; 
list($a, $b) = array(2, 3); 

будет:

 int a=2, b=3;

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

 a=2; b=3;
0 голосов
/ 30 августа 2010

Да - вы можете удалить весь код в конструкторе с помощью инициализаторов объектов (новое для C # 3.0) Вот довольно хорошее объяснение:

http://weblogs.asp.net/dwahlin/archive/2007/09/09/c-3-0-features-object-initializers.aspx

...