C#string.Format with' +'在对象args之前

时间:2015-02-24 08:46:55

标签: c#

我正在查看一些旧的代码,我发现在许多地方用于在输出中返回错误消息,开发人员编码如下:

objResp.ErrMessage = string.Format(INCORRECT_METHOD_EXEC, +apiChannel.ChannelID);

INCORRECT_METHOD_EXEC是一个常量字符串

  

“渠道ID的方法执行不正确:{0}”

我想知道'+'中的对象参数之前的string.Format是否是必需的。若有,有人可以解释原因吗?如果不需要,为什么Visual Studio允许这个"+"没有任何投诉?

3 个答案:

答案 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)

此处+正在执行

  

Unary Plus Operator

这是完全有效的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.ChannelIDint,因此问题中的代码在功能上等同于更简单,

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