Как я могу объявить и заполнить класс одновременно - PullRequest
4 голосов
/ 21 ноября 2011

У меня есть такой код:

public class test {
    public string aa { get; set; }
    public string bb { get; set; }
    public string cc { get; set; }
}

var a = new test {
    aa = "a",
    bb = "b"
}

var d = a;
d.cc = "c";

Можно ли мне создать класс d и одновременно заполнить его.Так, например, последние две строки могут быть объединены в одну?Обратите внимание, что я хочу избежать этого с конструктором, так как когда-нибудь это будут другие поля, отличные от cc, которые я буду заполнять.

обратите внимание, мое редактирование

var d = a;

Ответы [ 4 ]

3 голосов
/ 21 ноября 2011

Эта строка не компилируется:

var d = test;

Инициализаторы работают только при создании объекта, так что в вашем случае, только на данный момент:

var d = new test {
    cc = "c"
}

Msdn Doc об инициализаторах: http://msdn.microsoft.com/en-us/library/bb384062.aspx

3 голосов
/ 21 ноября 2011

Вы можете сделать это так же, как для a:

var d = new test {
    cc = "c"
}

Этот синтаксис не с использованием конструктора для передачи параметров, но известен как инициализатор объекта .

Каждый раз, когда вы создаете новый объект из класса, вызывается конструктор.Этого избежать невозможно.


Обновление:

Теперь, когда вам понятнее, что вы хотите сделать, одним из способов продвижения вперед является использование конструктора копирования и использовать это как основу для новых объектов:

public class test {

    public test(test o)
    {
      aa = o.aa;
      bb = o.bb;
    }

    public string aa { get; set; }
    public string bb { get; set; }
    public string cc { get; set; }
}

var a = new test {
    aa = "a",
    bb = "b"
}

var d = new test(a) {cc = "c"};
0 голосов
/ 21 ноября 2011

Учитывая ваше новое описание проблемы, как об этом:

Обратите внимание, что он также меняет a (как и ваш код), * ​​1004 * не создает копию . Если вам нужна копия, используйте решение Одеда.

public class test
{
    public string aa { get; set; }
    public string bb { get; set; }
    public string cc { get; set; }

    public test AlterTest(Action<test> alteration)
    {
        alteration(this);
        return this;
    }
}

static void Main(string[] args)
{
    var a = new test
    {
        aa = "a",
        bb = "b"
    };

    var d = a.AlterTest((t) => t.cc = "c");
}

Я бы сказал, что он не так удобен для чтения, как ваш исходный код (поскольку вам нужно знать, что делает AlterTest, что немного).

0 голосов
/ 21 ноября 2011

Вы можете создать конструктор для класса и передать нужные значения

//Class constructor
public Test(string aa, string bb, string cc) 
{
    this.aa = aa;
    ...
}




var test = new Test("a","b","c")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...