簡體   English   中英

如何將DateTime.Now.Year作為可選參數的默認值

[英]How can I use DateTime.Now.Year as default for optional parameters

您能告訴我如何解決該錯誤嗎?

默認參數值必須為編譯時常量”

我知道這個問題,並且已經在Stack Overflow上看到了方法的解決方案,但是我不知道如何為類解決此問題。

public class member
{
    public string name { get; }
    public string email { get; set; }
    public int entryYear;
    static int memberNbr;

    public member (string _name, int _entryyear = DateTime.Now.Year, string _email = "")
    {
        name = _name;
        entryyear = _entryyear;
        email = _email;
    }
}

與其讓它成為可選參數,不如讓其他構造函數重載呢? 在第二個構造函數中,不要將entryYear作為參數,而是在構造函數主體中對其進行初始化?

同時,讓我們使用適當的C#約定,例如屬性名稱為PascalCase,構造函數參數為camelCased。 並且不要對屬性名稱使用縮寫,並且當MemberNumber明顯屬於單個實例時,請不要使其成為靜態。

public class Member
{
    public string Name { get; }

    public string Email { get; }

    public int EntryYear { get; }

    public int MemberNumber {get; }

    public Member(string name, int entryYear, string email = "")
    {
        Mame = Name;
        EntryYear = entryYear;
        Email = email;
    }

    public Member(string name, string email = "")
    {
        Mame = Name;
        EntryYear = DateTime.Now.Year;
        Email = email;
    }
}

您沒有要求它,但是用空字符串初始化電子郵件實際上沒有任何意義。 最好將其默認為null。

鑒於不可能將非恆定值作為默認參數,因此必須使用重載:

public class Member
{
    public string Name { get; }
    public string Email { get; set; }
    public int EntryYear { get; set; }

    private int _memberNumber;

    public Member(string name) : this(name, DateTime.Now.Year, "")
    { }

    public Member(string name, int year) : this(name, year, "")
    { }

    public Member(string name, string email) : this(name, DateTime.Now.Year, email)
    { }

    public Member(string name, int entryYear, string email)
    {
        Name = name;
        EntryYear = entryYear;
        Email = email;
    }
}

注意,我已經為您修復了大小寫,您應該盡早學習c#約定。 另外, _memberNumber不應是靜態的,除非所有成員具有相同的數字,這有點奇怪。

關於MemberNumber,您可能需要類似以下的基本信息:

public static class MemberHelpers
{
    // you would have to load this if the data is persisted in some way
    private static int _lastMemberNumber;

    public static int GetNewMemberNumber()
    {
        return _lastMemberNumber++;
    }
}

public Member(string name, int entryYear, string email)
{
    Name = name;
    EntryYear = entryYear;
    Email = email;

    _memberNumber = MemberHelpers.GetNewMemberNumber();
}

您可以使用第二個構造函數。

public class member
            {
                public string name { get; }
                public string email { get; set; }
                public int entryYear = DateTime.Now.Year;
                static int memberNbr;

                public member(string _name, string _email = "")
                {
                    name = _name;
                    email = _email;
                }                
                public member(string _name, int _entryyear , string _email = "")
                {
                    name = _name;
                    entryYear = _entryyear;
                    email = _email;
                }
            }

一年不明智。 int.MinValue。 因此,您可以在理論上將默認參數設置為int.MinValue,並將其解釋為DateTime.Now.Year。

但是,應該始終對代碼進行優化以進行閱讀,並且絕對不能使正在發生的事情變得顯而易見。 因此,我絕對不建議在公共API中執行此操作。 盡管可以使用私有方法,但是請確保記錄下正在發生的事情。

如果您在測試中使用int.MinValue之類的邊緣情況,這也可能導致測試問題。

這樣,我肯定會改為使用可為null的int,並使用默認參數null表示DateTime.Now.Year。

即使那樣,我仍然會在公共API中建議不要這樣做,而應該進行方法重載。 但是,對於非公共代碼,最好通過減少方法數量和使用默認參數來減少混亂。

暫無
暫無

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

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