2013-07-10 1 views
1

что-то вроде предпоследней линии здесь возможно? И.Е. ссылаясь на другие свойства внутри самой декларации?Построение класса в C# и ссылка на self

В моем фактическом коде, A и B устанавливаются в комплексе LINQ перечислимых (что нормально) и C может быть что-то вроде A.Count():

class Thing { 
    public int A; 
    public int B; 
    public int C; 
} 

Thing myThing = new Thing() { 
    A = 1, 
    B = 2, 
    C = A+B 
} 

Просто пытаются найти наиболее эффективный способ конструкции myThing.

+0

@Alex внимательно прочитайте сообщение в его действительном коде A и B - перечисление –

+0

Чтобы быть более ясным - на вопрос, на который я хочу ответить, возможно ли что-то подобное. Или у меня нет выбора, кроме как определить свойство C _after_, инициализирующее объект? – rwalter

+0

Возможный дубликат [Доступ к свойствам из инициализатора объекта] (http://stackoverflow.com/questions/11859553/accessing-properties-from-object-initializer) – sloth

ответ

0

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

Thing myThing = new Thing() { 
    A = 1, 
    B = 2}; 
myThing.C =myThing.A + myThing.B; 
+0

Вы также можете так же легко «new Thing() {A = 1, B = 2, C = 1 + 2};'. – James

+0

Я принял этот ответ, потому что C не всегда A + B, но может быть A.Count() или что-то еще.Кредит @James тоже, потому что он ответил на вопрос - ответы, кажется, нет, то, что я пытался, невозможно! – rwalter

+0

@rwalter не уверен, что это может быть 'A.Count()', потому что в вашем примере 'A' является' int', а не коллекцией. Независимо от того, я думаю, вы понимаете, что это не может быть сделано как часть инициализатора, и существуют различные способы настройки свойства (это одно). – James

0

Свойства на помощь (на основе вашего примера)

class Thing { 
    public IEnumerable<someType> A { get; set; } 
    public IEnumerable<someType> B { get; set; } 
    public int C { get { return A.Count(); } } 
} 

Вам просто нужно установить A и B, C выйдет «само по себе» на основе двух других. Добавьте нулевые проверки и обработку ошибок по мере необходимости. Фактически, C не может быть установлен вообще в этом примере, и это правильно, потому что его значение зависит от другого свойства (здесь это A).

+0

'Enumerable' - статический класс. – Romoku

+0

Я пропустил «я» в типах, исправленный – Alex

+0

'C' был бы очень дорогим, так как он будет повторяться при каждом вызове. – Romoku

1

Рассмотрим следующий пример:

int A = 0; 
int B = 0; 
int C = 0; 
MyThing myThing = new MyThing() { 
    A = 1, 
    B = 2, 
    C = A + B 
} 

// myThing.A == 1 
// myThing.B == 2 
// myThing.C == 0 

Таким образом, нет; это невозможно. Вместо этого используйте любые другие ответы.

1

К сожалению, невозможно получить значение свойства в инициализаторе объекта.

1

Я не думаю, что A и B будут обновлены, прежде чем ссылаться на них для использования в С. Раствор в моих глазах простым ASSIGN А и В к переменным перед созданием объекта:

var variable1 = 1 
var variable2 = 2 

Thing myThing = new Thing() { 
    A = variable1, 
    B = variable2, 
    C = variable1+variable2 
} 

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

Редактировать: «У меня нет выбора, кроме как определить свойство C после инициализации объекта?» Проблема в том, что A и B еще не инициализированы, поэтому вы не можете использовать их для создания C. Но если вы инициализируете их под другим именем (переменная 1 и переменная 2 в приведенном выше примере), вы можете перейти к используйте эти значения, чтобы получить C

Смежные вопросы