Что делает этот код C #? - PullRequest
1 голос
/ 14 марта 2011
    public class AccountMembershipService : IMembershipService
    {
        private readonly MembershipProvider _provider;

        public AccountMembershipService()
            : this(null)
        {
        }

Я взял этот бит кода из класса AccountModels.cs, автоматически созданного в проекте MVC3.

Можете ли вы объяснить, что делает бит this (null)?

Ответы [ 5 ]

8 голосов
/ 14 марта 2011

Он будет вызывать конструктор с одним аргументом для AccountMembershipService, передавая null в качестве аргумента перед обработкой тела перечисленного вами конструктора.

From MSDN :

Конструктор может вызывать другой конструктор в том же объекте с помощью ключевого слова this.Как и base, это может использоваться с параметрами или без параметров, и любые параметры в конструкторе доступны как параметры для этого или как часть выражения.

Более подробно в разделе 17.10.1 (Конструкторинициализаторы) C # spec .

2 голосов
/ 14 марта 2011

Скорее всего, в вашем классе есть другой конструктор, который выглядит так:

public AccountMembershipService(MembershipProvider provider)
{
    _provider = provider;
}

Ваш код сначала вызывает этот конструктор и передает null в качестве аргумента для provider, затем выполняет оригинальный конструктор.

1 голос
/ 14 марта 2011

Приведенные выше ответы отвечают на заданный вопрос, но, чтобы пойти немного дальше:

Это одна из техник, которую мы используем для инверсии управления и обеспечения возможности модульного тестирования.

Вот оба конструктора

public AccountMembershipService()
    : this(null)
{
}

public AccountMembershipService(MembershipProvider provider)
{
    _provider = provider ?? Membership.Provider;
}

Первый конструктор с: this (null) вызывает ваш второй конструктор, передавая null провайдеру параметров.

Одна из причин сделать это состоит в том, чтобы избежать дублирования логики. Предположим, вы сделали:

public AccountMembershipService()
{
    _provider = Membership.Provider;
}

public AccountMembershipService(MembershipProvider provider)
{
    _provider = provider;
}

Совершенно разумно, если вы измените имя _provider или, возможно, добавите какой-либо другой код инициализации, вам придется изменить его в 2 местах. Позвонив по телефону: this (null), теперь вся ваша работа просто происходит в одном месте.

Причина, по которой у нас есть 2 конструктора, заключается в том, что при вызове конструктора по умолчанию используется статический экземпляр Membership.Provider. К сожалению, было бы очень сложно провести модульное тестирование, потому что теперь у нас есть зависимости от поставщиков членства, от базы данных, наличия действительных данных и т. Д.

Вместо этого, создав 2-й конструктор, мы теперь можем передать фиктивный MembershipProvider. Это совершенно другая тема, поэтому, если вам интересно, как это работает, не стесняйтесь задавать другой вопрос.

1 голос
/ 14 марта 2011

Вызывает другой конструктор с аргументом null.

0 голосов
/ 14 марта 2011

Вызывает другой конструктор в вашем классе и передает null в качестве параметра.

Вы также можете написать : base(...) для явного вызова конструктора в базовом классе.

...