Может кто-нибудь объяснить этот бит кода MVVM - PullRequest
1 голос
/ 07 октября 2019

Я пробую эту вещь MVVM и собираюсь написать в блоге сообщение Джона Шьюса ( Минимальное приложение MVWM UWP ). Я думаю, что понимаю большую часть происходящего, за исключением небольшого фрагмента в файле NotificationBase.

Вот часть, которую мне трудно понять.

public class NotificationBase<T> : NotificationBase where T : class, new()
{
    protected T This;

    public static implicit operator T(NotificationBase<T> thing) { return thing.This; }

    public NotificationBase(T thing = null)
    {
        This = (thing == null) ? new T() : thing;
    }
}

Может кто-нибудь дать мне построчное описание этого кода? Происходит куча вещей, с которыми я не могу справиться.

1 Ответ

3 голосов
/ 07 октября 2019

Большинство этих концепций очень хорошо объяснены в официальной документации .

. После этого я попытаюсь объяснить каждую строку ниже:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...