[英]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.