2015-02-24 61 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