我正在查看一些旧的代码,我发现在许多地方用于在输出中返回错误消息,开发人员编码如下:
objResp.ErrMessage = string.Format(INCORRECT_METHOD_EXEC, +apiChannel.ChannelID);
INCORRECT_METHOD_EXEC
是一个常量字符串
“渠道ID的方法执行不正确:{0}”
我想知道'+'
中的对象参数之前的string.Format
是否是必需的。若有,有人可以解释原因吗?如果不需要,为什么Visual Studio允许这个"+"
没有任何投诉?
答案 0 :(得分:2)
因为它是一个数值,视觉工作室不会标记它,它只是一个允许的移动。
int i=7;
string str= String.Format("blabla {0}", +i);
将输出:
blabla 7
和
string str= String.Format("blabla {0}", -i); //note that this will output the negative value of i, which may be useful in some cases as well
将输出:
blabla -7
但是如果它是string
,那么它将被视为错误
string i = "foo";
string str= String.Format("blabla {0}", +i); // operator '+' cannot be applied to operand of type 'string'
答案 1 :(得分:1)
此处+
正在执行
这是完全有效的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);
对于这些运算符中的每一个,结果只是该值的值 操作数。
由于apiChannel.ChannelID
是int
,因此问题中的代码在功能上等同于更简单,
objResp.ErrMessage = string.Format(INCORRECT_METHOD_EXEC, apiChannel.ChannelID);
表达式中的+
在OP的场景中没有其他特殊含义。
答案 2 :(得分:-1)
另请注意,+
是一个可重载的运算符,包括一元运算符和二元运算符。所以你可以举例:
class MySillyType
{
int _value;
public MySillyType(int value)
{
_value = value;
}
public static int operator +(MySillyType t)
{
return t._value;
}
}
然后string.Format("{0}", new MySillyType(42))
将为您MySillyType
,而string.Format("{0}", +new MySillyType(42))
会给42
。这可能会被滥用,例如在使用强类型ID时(例如,使用OrderId
类型而不是int
) - 您不希望拥有隐式强制转换运算符(这种类型的无视目的的一半),但是(int)orderId
过于具体而且orderId.Value
过于明显和明确,可能:D由于一元+
在大多数用途中不会改变值,因此它不是#39; t
在C#中看起来很傻,但是"操作员滥用"在许多函数式编程语言中,它甚至都不是一个概念 - 运算符只是更短的函数名称:D
当然,它也可以用作遗留代码转换的一部分。将+
应用于任何变量等都很容易,并且可以单独重写部分代码 - 对于int
,它将不执行任何操作,对于MySillyId
,它会为您提供int
回来了。最后,删除所有普通int
,你也可以删除操作员重载 - 完成工作。
但是,不建议。这有点傻:D