如何将DateTime.Now.Year作为可选参数的默认值

时间:2018-12-01 18:26:25

标签: c# class 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;
    }
}

4 个答案:

答案 0 :(得分:5)

与其让它成为可选参数,不如让其他构造函数重载怎么办?在第二个构造函数中,不要将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。

答案 1 :(得分:3)

鉴于不可能将非恒定值作为默认参数,则必须使用重载:

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();
}

答案 2 :(得分:1)

您可以使用第二个构造函数。

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;
                }
            }

答案 3 :(得分:0)

一年是不明智的。 int.MinValue。因此,从理论上讲,您可以将默认参数设置为int.MinValue,并将其解释为DateTime.Now.Year。

但是,应该始终对代码进行优化以使其易于阅读,但这绝对不能使正在发生的事情变得显而易见。因此,我绝对不建议在公共API中执行此操作。尽管可以用私有方法,但是请确保记录下正在发生的事情。

如果在测试中使用int.MinValue这样的边缘情况,这也可能导致测试问题。

这样,我肯定会改为使用可为null的int,并使用默认参数null表示DateTime.Now.Year。

即使那样,我仍然会在公共API中建议不要这样做,而改为进行方法重载。但是,对于非公开代码,最好通过减少方法数量和使用默认参数来减少混乱。