簡體   English   中英

對象args之前帶有'+'的C#string.Format

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM