簡體   English   中英

此C#代碼有什么作用?

[英]What does this C# code do?

    public class AccountMembershipService : IMembershipService
    {
        private readonly MembershipProvider _provider;

        public AccountMembershipService()
            : this(null)
        {
        }

我從MVC3項目自動創建的AccountModels.cs類中獲取了這段代碼。

您能解釋一下“ this(null)”位在做什么嗎?

在處理您列出的構造函數的主體之前,它將調用AccountMembershipService的單參數構造函數,並傳遞一個null作為參數。

MSDN

一個構造函數可以使用this關鍵字在同一對象中調用另一個構造函數。 像base一樣,可以在有或沒有參數的情況下使用它,並且構造函數中的任何參數都可以用作此參數或作為表達式的一部分。

有關詳細信息,請參見C#規范的 17.10.1節(構造函數初始化器)。

您的類中最有可能是另一個構造函數,如下所示:

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

您的代碼首先調用此構造函數,並將null作為provider的參數傳遞,然后執行原始的構造函數。

它使用null參數調用其他構造函數。

上面的答案正在回答所問的問題,但要進一步說明:

這是我們用於控制反轉和使單元測試成為可能的一種技術。

這都是構造函數

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。 不幸的是,很難進行單元測試,因為現在我們依賴於成員資格提供者,數據庫,具有有效數據等。

相反,通過創建第二個構造函數,我們現在可以傳遞一個模擬MembershipProvider。 但是,這是一個完全不同的主題,因此,如果您對它的工作方式感興趣,請隨時問另一個問題。

它在您的類中調用另一個構造函數,並傳遞null作為參數。

您還可以編寫: base(...)在基類中顯式調用構造函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM