Я хотел предоставить некоторую информацию, которая не была упомянута до сих пор. Если вы используете вызов this(...)
в конструкторе, то вы не можете вызвать super(...);
. Это также включает автоматическую вставку Java вызова без параметров в super();
. Следующий пример иллюстрирует это пункт, включая пояснительные комментарии:
public class B extends A {
private int x;
public B() {
// Java doesn't call super(); here, because
// of the call to this(...); below.
// You can't call super(...) here either,
// for the same reason.
this(42); // Calls public B(int x) below.
}
public B(int x) {
// Java does call super(); here.
// You can call super(...) here, if you want/need to.
// The net result of calling new B() above is that
// super(...) for class A only gets called once.
this.x = x;
}
}
На уровне CLR поля делегатов и поля событий являются обычными полями.
Так же, как строка MyField
по умолчанию имеет значение null
, а не ] ""
, также Action MyField
по умолчанию имеет значение null
, а не пустой экземпляр Action
.
Я согласен, что это может быть обременительно, и лично я считаю, что это было ошибкой. Я не могу придумать ни одной причины, почему так должно быть.
См. Ответ Джона Скита здесь для хорошего обсуждения этого. Можно даже обойтись без проверки на null в C # 2.0.