Большинство этих концепций очень хорошо объяснены в официальной документации .
. После этого я попытаюсь объяснить каждую строку ниже:
public class NotificationBase<T> : NotificationBase where T : class, new()
Объявляет новый класс с именем NotificationBase<T>
, который имеет один параметр универсального типа (T
). Он происходит от класса NotificationBase
(неуниверсальная версия). У него есть два ограничения на параметр типа;это должен быть class
(т. е. ссылочный тип, а не перечисление или другой целочисленный тип), и он должен иметь видимый пустой конструктор (в соответствии с ограничением new()
).
protected T This;
Объявляет защищенное поле с именем This
. Вы можете использовать это поле в экземплярах этого класса и в производных объектах.
public static implicit operator T(NotificationBase<T> thing) { return thing.This; }
Добавляет неявное преобразование из NotificationBase<T>
в T
, так что вы можете сделать следующее(пример):
NotificationBase<string> myWrappedString = new NotificationBase<string>("Heya");
string myString = myWrappedString;
// implicit conversion is supported due to the implicit operator declared above.
public NotificationBase(T thing = null)
{
This = (thing == null) ? new T() : thing;
}
Объявляет открытый конструктор, так что вы можете создавать экземпляры NotificationBase<T>
. Если ввод null
, конструктор будет просто new
до типа T
(каким бы он ни был, до тех пор, пока он имеет пустой конструктор). Тернарный оператор (predicate ? then : else
) используется для того, чтобы сделать код компактным и читаемым при присвоении поля This
.