【问题标题】:Is there a 'generic' way to directly test an object's data?是否有直接测试对象数据的“通用”方法?
【发布时间】:2013-06-18 06:51:37
【问题描述】:

我可以在 C# 中执行以下操作真的很酷

if (Divide(4, 0) != false)
{
    MessageBox.Show("Cool");
}
...
public dynamic Divide(int x, int y)
{
    if (y == 0) return false;
    return x / y;
}

例如,上面的代码允许我轻松测试除零异常,而不是使用 try/catch。但是,如果代码实际上返回了有效结果,则会遇到错误,因为 bool 无法与整数进行比较——也就是说,在比较中,结果被强制变为静态类型?

有什么方法可以检查条件是否满足,并在不导致错误的情况下得到结果?

谢谢。

【问题讨论】:

  • 这很有趣,但动态并不是真的要以这种方式使用。它更像是一种避免投射碰巧共享相似界面的不同事物的方法。这通常称为鸭式打字。
  • 我不明白为什么这是一个好主意或好做法。
  • @nathangonzalez:鸭子打字?我刚刚看到this answer,但我看不懂,我想它可能有我要找的东西对吧?
  • 老实说,我一点也不觉得“酷”;它会导致无类型的混乱..
  • @user2246674:我从 PHP 开始使用 C#,所以它点燃了某种形式的激情 :)

标签: c#-4.0 dynamic


【解决方案1】:

你为什么不使用double?(可空double作为它的返回类型?如果它为空,它是无效的。

我会使用的另一个约定是TryDivide。返回 bool 并使用 out double 参数。

TryDivide 看起来像这样。

public bool TryDivide(int x, int y, out double result)
{
    result = 0;
    if (y == 0) return false;
    result = x / y;
    return true;
}

【讨论】:

  • 希望原因是他的例子真的很简单。
  • TryDivide 将是方法的名称,签名如bool TryDivide(int x, int y, out double result)
  • 好的,刚刚测试过了。那么这是否意味着没有其他方法可以做到这一点?
  • @rtuner 这取决于。有很多方法可以解决一个问题。您没有按照预期使用动态。
  • 我还以为这叫创新还是滥用?你认为是后者吗?
猜你喜欢
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
  • 2014-05-05
  • 2013-03-18
  • 2016-02-11
  • 1970-01-01
  • 2012-01-31
相关资源
最近更新 更多