2011-02-15 73 views
1

我有一个方法接受两个参数,现在我需要传递一个额外的参数,但所有其他调用此代码的代码可能不会传递第三个参数。下面是一个丑陋的黑客,但我只是不熟悉重载的过程,我们被困在.NET 2.0,所以虽然这工作,我不禁感到它的错误。有没有办法在2.0中做C#4.0可选参数?

public static void AddPlanFunds(ParticipantResultsPlan planNode, Plan plan) 
    { 
     AddPlanFunds(planNode, plan, -1); 
    } 
    public static void AddPlanFunds(ParticipantResultsPlan planNode, Plan plan, int participantId) 
    { 
     planNode.PlanFunds = new CommonPlanFunds(); 

     // Add single class funds 
     AddSingleClassFunds(planNode.PlanFunds, plan); 

     // Add portfolios 
     AddPortfolios(planNode.PlanFunds, plan,participantId); 
    } 

我应该怎么做超负荷?

谢谢!

+1

请注意,C#可选参数几乎没有用处/严重受限......它们必须是常量。 String.Empty不起作用。 DateTime.MinValue/DateTime.MaxValue/Int32.MinValue/...不起作用。我爱他们正好5分钟:-) – xanatos 2011-02-15 19:28:44

回答

6

您的代码是执行此操作的标准方法;这不是一个丑陋的黑客。

但是,您应该考虑采取int?并通过null而不是-1

You can create optional parameters in C# 2 to be called from C# 4, using attributes

+0

事实上,使用可空的int而不是使用魔法值。 – 2011-02-15 19:25:21

+0

+1,建议不要空谈。 – Sapph 2011-02-15 19:26:37

+1

独立于实际的编码是什么,它应该是一个定义的常量。通过这种方式,即使表示在未来发生变化,所有代码都将同意非值表示。 – unholysampler 2011-02-15 19:27:40

3

方法重载是而不是错误。这正是在不支持可选参数的早期版本框架中执行此操作的方式。

0

这就是超载的工作原理。

有更好的方法来做到这一点......但对于你的简单情况,它看起来不错。

0

老实说,我发现这种方法没有错。我知道在没有可选参数的环境中,它的使用相当普遍。

0

这正是我在4.0之前的任何C#中处理它的原因。你可以尝试params int[] participantIds路由,但是如果有人提供了多个int,你必须能够接受多个路由。

0

这是4.0,您可以添加可选的参数,如(2.0,你所提到的方法是正确的做法)

public static void AddPlanFunds(ParticipantResultsPlan planNode, Plan plan, [Optional] int participantId) 
{ 
.. 
} 

或可以指定默认值

public static void AddPlanFunds(ParticipantResultsPlan planNode, Plan plan, int participantId = -1) 
{ 
.. 
} 

你可以调用具有2个参数或3个参数的方法

2

尽量远离可选参数,它们是不是自动过载s,而编译会发生什么是指定的默认值被自动插入到调用中。

为什么这样不好?想象一下,如果您更改默认值并编译您的解决方案,但依赖解决方案不会得到重新编译,并因此将具有旧的默认值。 可选参数有其用途,但在COM编程领域更多。

相关问题