C# - 将范围限制为三元语句

时间:2017-02-14 16:48:43

标签: c# ternary-operator

编辑:最初,这个帖子的例子处理了哈希码,所以你会看到一些使用param.GetHashCode()的注释,而不是(1 + param)。为了获得更多要点,我已将函数更改为计算一个加上某个数字的绝对值。

让我们说我想创建一个计算某个整数绝对值的函数(不使用Math.Abs​​)。我可以写类似的东西:

int absoluteValueOfOnePlus(int param)
{
    int onePlusParam= 1 + param;
    return ((onePlusParam> 0) ? (onePlusParam) : (-onePlusParam) );
}

我希望将onePlusParm的范围限制在三元语句中 - 类似于:

int absoluteValueOfOnePlus(intparam)
{
    return (((int onePlusParam = 1 + param) > 0) ? (onePlusParam) : (-onePlusParam) );
}

我知道这不是有效的C#,但它证明了我尝试执行的一个很好的例子 - 创建一个仅存在于三元运算符范围内的变量。

5 个答案:

答案 0 :(得分:3)

三元表达式的部分是表达式。如果语言设计者允许你要求的东西,他们可能会为所有表达式而不仅仅是为了三元表达式。然后,您也可以if ((int n = foo()) != 0) bar(n);

在C#中,声明是语句,而不是表达式。所以答案是否定的,你不能这样做。但是,for语句可以声明,因此最接近单个语句的是:

for (int i = param.GetHashCode();;)
    return (i > 0) ? i : -i;

这在技术上是单一陈述,虽然是复合陈述,但在两行上。但这看起来很糟糕,我不会那样写。

如果您主要关心的是i的范围最小化,那么请使用小范围:

int positiveHash(string param)
{
    // Some statements here...
    // ...

    // Start a small scope
    {
        int i = param.GetHashCode();
        if (...)
            return ((i > 0) ? (i) : (-i) );
    }

    // Some more C# statements here.
    // i is out of scope here.
}

答案 1 :(得分:1)

我只想写:

$global:result

$global:responsebody

帮助可读性,可维护性,更重要的是在这种情况下避免使用premature optimization which is the root of all evil

如果您真的担心性能,那么请为您编写代码并查看最大的瓶颈所在。如果System.Drawing.Image img = System.Drawing.Image.FromFile(Server.MapPath("~") + spe_Fil.ImagePath); 造成最大的瓶颈,我会感到惊讶。

您可能希望查看int GetPositiveHash(string param) { return Math.Abs(param.GetHashCode()); } 的{​​{3}}。你会发现,与int GetPositiveHash(string param) { int hashCode = param.GetHashCode(); return Math.Abs(hashCode); } 方法中的内容相比,三元运算符的节省量非常小。

值得记住:

  

报价的完整版本是“我们应该忘记小   效率,大约97%的时间说:过早优化是   万恶之源。“我同意这一点。它通常不值得   花费大量时间微优化代码才明显在哪里   性能瓶颈是。

来自.Net Framework source code

答案 2 :(得分:1)

您可以将范围内的数据变量(i)替换为在范围内具有函数变量。优点是函数更有可能只写一次而且不可能被误用。

int positiveHash(string param)
{
    Func<int, int> absoluteValue = i => (i > 0) ? i : -1;

    return absoluteValue(param.GetHashCode());
}

答案 3 :(得分:0)

除了创建一个新块之外,您还可以使用内置的绝对值函数Math.Abs(...)或定义自己的lambda /函数;

......内置...

public static int hash(string param)
{
    return Math.Abs(param.GetHashCode());
}

...... lambda ......

static Func<int, int> abs = i => i > 0 ? i : -i;
public static int hash(string param)
{
    return abs(param.GetHashCode());
}

......静态功能......

static int Abs(int i)
{
    return i > 0 ? i : -i;
}
public static int hash(string param)
{
    return Abs(param.GetHashCode());
}

答案 4 :(得分:0)

我的尝试

static int absoluteValueOfOnePlus(int intparam)
{
        return new List<int> { intparam }.Select(n => n + 1).Select(i => (i > 0) ? (i) : (-i)).Single();
}

(当然你的代码(和我的代码)很糟糕,你需要将你的方法分成2个较小的代码)

和更新的问题

distinct