Вы не можете использовать ключевое слово this
при инициализации встроенных полей. Причиной этого является порядок, в котором выполняется код: для всех намерений и целей код для инициализации встроенного поля выполняется перед конструктором для класса (т. Е. Компилятор C # запретит доступ к ключевому слову this
) , В основном это означает, что это не скомпилируется:
public class Class1
{
private SomeClass someclass = new SomeClass(this);
public Class1()
{
}
}
но это будет:
public class Class1
{
private SomeClass someclass;
public Class1()
{
someclass = new SomeClass(this);
}
}
Это небольшая разница, но стоит отметить.
Другие различия между двумя версиями заметны только при использовании наследования. Если у вас есть два класса, которые наследуются друг от друга, сначала будут инициализированы поля в производном классе, затем будут инициализированы поля в базовом классе, затем будет вызван конструктор для базового класса и, наконец, конструктор для производный класс будет вызван. В некоторых случаях вы должны быть очень осторожны с этим, так как это может вызвать фруктовый салат осложнений, если вы не понимаете, что происходит (один из которых включает вызов виртуального метода внутри конструктора базового класса, но это почти никогда не мудрый ход). Вот пример:
class BaseClass
{
private readonly object objectA = new object(); // Second
private readonly object objectB;
public BaseClass()
{
this.objectB = new object(); // Third
}
}
class DerivedClass : BaseClass
{
private object objectC = new object(); // First
private object objectD;
public DerivedClass()
{
this.objectD = new object(); // Forth
}
}
Вам нужно будет установить точки останова на всех строках, которые инициализируют поля, чтобы можно было видеть правильную последовательность.