В вашем конкретном примере инициализаторы полей (Class1
) являются точными. Можно утверждать, что то, что не прекрасно это открытое поле, р я бы посоветовал либо:
// manually implemented property with field-initializer
private int a = 1;
public int A { get { return a;} set { a = value;} }
или:
// automatically implemented property with constructor-based initialization
public int A {get;set;}
public Class1() {
A = 1;
}
@hvd's answer правильно заявляет разницу. Чтобы проиллюстрировать конкретный пример того, где это может дать разные результаты, см. Следующее. В этом примере основное сообщение об удалении действительно «очень важно при использовании методов« virtual
»от конструкторов».
Выход первый:
Class1: 1
Class2: 0
Код:
using System;
abstract class SomeBaseClass {
protected abstract void Write();
protected SomeBaseClass() {
Console.Write(GetType().Name + ": ");
Write();
}
}
class Class1 : SomeBaseClass {
protected override void Write() {
Console.WriteLine(a);
}
public int a = 1;
}
class Class2 : SomeBaseClass {
protected override void Write() {
Console.WriteLine(a);
}
public int a;
public Class2() {
a = 1;
}
}
static class Program {
static void Main() {
new Class1();
new Class2();
}
}
Это сделает разницу в _order_, что вещи случаются. –
Мне нравится помещать инициализацию в конструктор, потому что, если вы делаете что-то более сложное и не получается, вы получите более конкретную ошибку, чем «не удалось инициализировать». – zimdanen
В чем разница в заказе? – Robbert