2015-02-24 65 views
3

我一直在寻找通过一些旧代码,我发现,在很多地方输出返回的错误信息,开发人员必须编码,像这样前:用“+” C#的String.format对象ARGS

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

而且INCORRECT_METHOD_EXEC是一个常量字符串

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

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

+0

可以肯定地说'apiChannel.ChannelID'是一个数值类型吗? – 2015-02-24 08:48:26

+0

“apiChannel.ChannelID”的任何示例? – chouaib 2015-02-24 08:48:34

+0

'ChannelID'是一个数字吗?然后'+'本质上是一个不适用 – 2015-02-24 08:48:35

回答

3

因为它是一个数值,所以Visual Studio不会标记它,它只是一个允许的移动。

int i=7; 

string str= String.Format("blabla {0}", +i); 

将输出:

布拉布拉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 

将输出:

布拉布拉-7

但是如果它是例如string,它会被认为是一个错误

string i = "foo"; 
string str= String.Format("blabla {0}", +i); // operator '+' cannot be applied to operand of type 'string' 
+1

'+ i'与'0 + i'不一样。一个涉及一个一元运算符,另一个涉及二元运算符。当然这些表达式在这种情况下有相同的结果,但更准确地说,一元'+'只是返回其操作数的值。这不仅仅是一个挑剔的问题:'0 + s'的结果's'是一个字符串,在该字符串前加“0”。 – 2015-02-24 09:01:18

+0

Jeroen,很快就会更新 – chouaib 2015-02-24 09:21:41

-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而且由于一元+不会在大多数用途中更改该值,所以不是大部分的滥用,可以说。

它看起来在C#傻,而是“经营者滥用”是不是即使在许多函数式编程语言的一个概念 - 运营商都只是较短的函数名:d

它可以作为从传统的代码转换的一部分当然,也是如此。很容易将+应用于任何变量等,并独立重写部分代码 - 对于int,它将什么都不做,对于MySillyId它会给你int回来。最终,您将删除所有普通的int,您也可以删除操作员超载 - 完成任务。

但是,不建议。这是一个有点傻:d

2

这里+是作用在该

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的情况下无其他特殊意义。

+0

我知道这些,我只是想知道我提到的场景。不过谢谢你! – Arunster 2015-02-24 11:22:08

+0

@Arunster这就是你的场景中'+'的含义。表达式“+ apiChannel.ChannelID”的结果正在以正常方式格式化为字符串。 '+'不以任何方式直接影响字符串格式。 – Jodrell 2015-02-24 13:59:20