让我们说我想创建一个计算某个整数绝对值的函数(不使用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#,但它证明了我尝试执行的一个很好的例子 - 创建一个仅存在于三元运算符范围内的变量。
答案 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%的时间说:过早优化是 万恶之源。“我同意这一点。它通常不值得 花费大量时间微优化代码才明显在哪里 性能瓶颈是。
答案 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