[英]C# string.Format with a '+' before object args
我正在查看一些舊的代碼,我發現在許多地方返回輸出中的錯誤消息,開發人員編碼如下:
objResp.ErrMessage = string.Format(INCORRECT_METHOD_EXEC, +apiChannel.ChannelID);
INCORRECT_METHOD_EXEC
是一個常量字符串
“通道ID的方法執行不正確:{0}”
我想知道在string.Format
中對象參數之前是否需要'+'
。 若有,有人可以解釋原因嗎? 如果不需要,為什么Visual Studio允許這個"+"
而沒有任何投訴?
因為它是一個數值,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
將輸出:
blabla -7
但是,如果它是一個string
,那么它將被視為一個錯誤
string i = "foo";
string str= String.Format("blabla {0}", +i); // operator '+' cannot be applied to operand of type 'string'
這里+
正在表演
這是完全有效的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的場景中沒有其他特殊含義。
另請注意, +
是一個可重載的運算符,包括一元和二元運算符。 所以你可以舉例說:
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
當然,它也可以用作遺留代碼過渡的一部分。 將+
應用於任何變量等MySillyId
容易,並且可以獨立地重寫部分代碼 - 對於int
,它什么也不做,而對於MySillyId
它會給你int
。 最后,刪除所有普通的int
,你也可以刪除操作員重載 - 完成工作。
但是,不建議。 這有點傻:D
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.