如何在C#中将参数默认为DateTime.MaxValue?

时间:2011-04-04 13:01:57

标签: c# c#-4.0 optional-parameters

我想说:

public void Problem(DateTime optional = DateTime.MaxValue)
{
}

但编译器抱怨DateTime.MaxValue不是编译时常量。

DateTime.MinValue很简单,只需使用默认(DateTime)

另见“How do I default a parameter to Guid.Empty in C#?

我不想使用方法重载,因为我试图驯服的方法有101个参数!

8 个答案:

答案 0 :(得分:9)

我会用这个代替:

public void Problem(DateTime? optional = null)
{
   DateTime dateTime = optional != null ? optional.Value : DateTime.MaxValue;
   // Now use dateTime
}

答案 1 :(得分:5)

根据您的一条评论,您尝试使用 101 参数的方法更适用于来电者。
我强烈建议您创建一个参数类并使用默认值初始化该类的属性。为只接受一个参数的方法提供重载:参数类 这将真正改善方法的使用,因为如果用户只需要更改一个参数,用户甚至可以重用其参数类实例。

答案 2 :(得分:3)

您可以定义多个功能:

public void Problem()
{
     Problem(DateTime.MaxValue);
}
public void Problem(DateTime optional)
{
     // do your stuff here.
}

如果调用Problem()(不带参数),该函数会使用参数调用另一个函数。

答案 3 :(得分:3)

我不熟悉C#4.0,但在c#3.5中我会使用重载;

public void Problem()
{
    Problem(DateTime.MaxValue);
}
public void Problem(DateTime dt)
{
}

并用以下任何一种方式调用:

Problem(); //defaults to maxvalue
Problem(myDateTime); //uses input value

编辑: 只是回答一些评论;

public class FooBar
{
    public bool Problem()
    {
        //creates a default person object
        return Problem(new Person());
    }

    public void Problem(Person person)
    {
        //Some logic here
        return true;
    }
}

public class Person
{
    public string Name { get; private set; }
    public DateTime DOB { get; private set; }
    public Person(string name, DateTime dob)
    {
        this.Name = name;
        this.DOB = dob;
    }

    /// <summary>
    /// Default constructor
    /// </summary>
    public Person()
    {
        Name = "Michael";
        DOB = DateTime.Parse("1980-07-21");
    }
}

答案 4 :(得分:3)

你要求做的事情根本不可能。 DateTime.MaxValue不是编译时常量;它实际上是一个只读字段,由运行时由静态构造函数初始化。 difference在这里变得非常关键。可选参数需要编译时常量,因为它们将值直接烘焙到代码中。

然而,真正的问题是你的方法需要101个参数。我从未见过任何因为重构而大声哭泣的事情。我的建议是改变你的方法来接受一个类的实例。这也可以让您更灵活地为类的各个属性指定默认值。特别是,您将能够指定编译时常量的值。

答案 5 :(得分:2)

简单的答案是你不能用可选参数我不认为。

如果这是唯一的参数,你可以使用重载。如果这是具有许多可选参数的方法的示例,那么这可能是不可行的。

您可以做的是将其设为DateTime?并传递null,然后在您的方法中将null解释为DateTime.MaxValue

有一个很好的可选参数的写法,我会为你挖掘。

编辑

article here

答案 6 :(得分:2)

如果您在其中一条评论中说过,您的方法有很多参数,您可以将它们全部转换为参数类并使用其属性初始值设定项。然后,您不必初始化所有属性,并且可以在该类的构造函数中将日期设置为DateTime.MaxValue

答案 7 :(得分:1)

loadDefault参数值是常量,也就是说,它不能是string.Empty / Guid.Empty等等。您可以使用方法重载:

void M(int intValue)
{
   M(intValue, Guid.Empty);
}
void M(int intValue, Guid guid)
{
   //do something
}