使用一元加号操作符安全吗?



我看到这样的代码:

double d = GetDouble();
DoSomething(+d);
DoSomething(-d);

我知道它有潜在的危险,不建议在c++中使用一元+只是为了强调值是正的。<EDIT>"只是为了强调值是正的"是一条心理捷径。我知道它不会让负值变成正的。</EDIT>

c#语言参考没有说太多:

一元+操作符返回其操作数的值。

有一个关于SO的问题,但它被标记为C, c++和c#,并且没有一个答案明确提到c#。

正如您所链接的问题的答案所说,C(++)中的一元+确实做一些的事情,并且不一定是no-op。在c#中也是如此。

c#只有这些一元+操作符(参见规范):

int operator +(int x);
uint operator +(uint x);
long operator +(long x);
ulong operator +(ulong x);
float operator +(float x);
double operator +(double x);
decimal operator +(decimal x);

因此,如果xshort类型,则+x应该是int类型,因为第一个操作符是由重载解析选择的。因此,这样的代码无法编译:

short x = 1;
short y = +x;

这也会影响重载解析。就像这个答案中给出的代码一样,如果您这样做:

public class C {
public static void Foo(int x) {
Console.WriteLine("int");
}

public static void Foo(short x) {
Console.WriteLine("short");
}
}

C.Foo(x),其中xshort,将打印short,但C.Foo(+x)将打印int

上述情况是否经常发生,使+x成为"bad"或";unsafe"实践?那由你来决定。

当然,如果x是自定义结构/类类型,那么+x基本上可以做任何事情。Unary+是可重载的

+-不会改变原来的双精度值,如果这就是你所说的安全的话。

double d = 7d;
Console.WriteLine(d);  //7
Console.WriteLine(+d); //7
Console.WriteLine(-d); //-7
Console.WriteLine(d);  //7
//OR
d = -7d;
Console.WriteLine(d);  //-7
Console.WriteLine(+d); //-7
Console.WriteLine(-d); //7
Console.WriteLine(d);  //-7

其他的答案已经很好地解释了使用+会发生什么。

只是想标记一下,就像在C/c++中一样,也有整型数值类型都有无符号版本。当然,当对它们进行错误的操作时,它们都有相同的问题

下面的代码片段只是一个笑话,不要杀了我,但是这里有一个扩展方法来检查数字类型是否为正,而不会改变原始值或键入 的风险。
public static class NumericExtensions<T> where T : struct
{
public static bool IsPositive(this T num) =>
num switch  
{  
num is uint _ => true,
num is int i => i > 0,
num is ulong _ => true,
num is long l => l > 0,
num is double d => d > 0,
num is float f => f > 0,
num is decimal m => m > 0m
//... add remaining numeric types
_ => false //or throw exception
};
}

相关内容

  • 没有找到相关文章

最新更新