【问题标题】:C# 4.0 Optional Parameters - How to Specify Optional Parameter of Type "Guid"?C# 4.0 可选参数 - 如何指定“Guid”类型的可选参数?
【发布时间】:2011-03-25 00:38:26
【问题描述】:

这是我的方法:

public void SomeQuery(string email = "", Guid userId = Guid.Empty)
{
   // do some query
}

userId 给我一个错误,因为它必须是编译时常量,我理解。但即使我声明了一个常量:

private const emptyGuid = Guid.Empty;

然后将方法签名更改为:

public void SomeQuery(string email = "", Guid userId = emptyGuid)
{
   // do some query
}

还是没有爱。

我错过了什么?

【问题讨论】:

标签: c# .net c#-4.0 guid optional-parameters


【解决方案1】:

用不需要 Guid 的版本重载方法不是更好的解决方案吗?这将解决问题,并且在我看来将是一个更好的设计。当然,可能还有其他我不知道需要这种设计的限制。

【讨论】:

  • C# 4 可选参数的重点是避免不必要的重载。我有大约 7 个要过滤的参数(在 LINQ 查询中),为什么用相同的代码重载一个方法 7 次?我想这就是您所指的“其他约束”。 =)
  • 对于 2 个参数来说,拥有 2 个重载方法比 IMO 可选参数更好。主要是针对 mySuperObject.Add( ref 1, ref 2, ref 3, ref 4, ref 5) 与 mySuperObject.Add(); 之类的设计;
【解决方案2】:

您是否尝试将其设置为Guid ala 的新实例:

public void SomeQuery(string email = "", Guid userId = new Guid())
{
   // do some query
}

应该做的伎俩。

【讨论】:

  • 这种方法的好处是您仍然可以在代码中使用 Guid.Empty 对其进行测试。例如if(userId == Guid.Empty) { ... }
  • @Bennor - 我正准备为那个确切的场景编写一些单元测试。感谢您为我节省了一些时间! =)
  • 您应该尽可能避免使用可选参数。它们是一种代码气味。此外,它们通过使封装更加困难并鼓励使用相同的方法实现不同的行为来鼓励不良的 API。
【解决方案3】:

也许会有所帮助(使用运算符 ?? 和 Guid 可为空的类型)

public void some_method(string name, Guid? guid = null)
{
        _name = name;
        _guid = guid ?? Guid.NewGuid();
}

【讨论】:

  • 嗨,如果我尝试这个,我会收到一条消息(粗略翻译):类型 '' kann 的值不能用作标准参数,因为没有标准转换为“System.Guid '
猜你喜欢
  • 2012-10-08
  • 1970-01-01
  • 2012-04-04
  • 2011-04-06
  • 2020-07-24
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多