[c#] String和C#中的字符串有什麼區別?



Answers

為了完整起見,這裡是相關信息的大腦轉儲...

正如其他人所指出的, stringSystem.String的別名。 它們編譯成相同的代碼,所以在執行時沒有任何區別。 這只是C#中的別名之一。 完整的列表是:

object:  System.Object
string:  System.String
bool:    System.Boolean
byte:    System.Byte
sbyte:   System.SByte
short:   System.Int16
ushort:  System.UInt16
int:     System.Int32
uint:    System.UInt32
long:    System.Int64
ulong:   System.UInt64
float:   System.Single
double:  System.Double
decimal: System.Decimal
char:    System.Char

除了stringobject ,別名都是值類型。 decimal是一個值類型,但不是CLR中的基本類型。 唯一沒有別名的基本類型是System.IntPtr

在規範中,值類型別名被稱為“簡單類型”。 文字可以用於每個簡單類型的常量值; 沒有其他值類型可用文字形式。 (將它與VB相比較,VB允許使用DateTime文字,並且也有它的別名。)

有一種情況需要使用別名:明確指定枚舉的基礎類型時。 例如:

public enum Foo : UInt32 {} // Invalid
public enum Bar : uint   {} // Valid

這只是規範定義枚舉聲明的方式問題 - 冒號後的部分必須是整型生產,它是sbytebyteshortushortintuintlongulongchar一個標記。 ..而不是像變量聲明所使用的類型生產。 它沒有表明任何其他差異。

最後,當涉及到使用哪個API時:我個人使用別名來實現實現,但CLR類型適用於任何API。 在實現方面你使用的確不重要 - 團隊之間的一致性很好,但沒有其他人會關心。 另一方面,如果你在一個API中引用一個類型,這是非常重要的,你以一種語言中立的方式來實現。 稱為ReadInt32的方法是明確的,而稱為ReadInt的方法需要解釋。 例如,調用者可以使用為Int16定義int別名的語言。 .NET框架設計師遵循這種模式,在BitConverterBinaryReaderConvert類中有很好的例子。

Question

示例( 注意案例 ):

string s = "Hello world!";
String s = "Hello world!";

什麼是使用每個指導原則 ? 有什麼區別




New answer after 6 years and 5 months (procrastination).

While string is a reserved C# keyword that always has a fixed meaning, String is just an ordinary identifier which could refer to anything. Depending on members of the current type, the current namespace and the applied using directives and their placement, String could be a value or a type distinct from global::System.String .

I shall provide two examples where using directives will not help .

First, when String is a value of the current type (or a local variable):

class MySequence<TElement>
{
  public IEnumerable<TElement> String { get; set; }

  void Example()
  {
    var test = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
  }
}

The above will not compile because IEnumerable<> does not have a non-static member called Format , and no extension methods apply. In the above case, it may still be possible to use String in other contexts where a type is the only possibility syntactically. For example String local = "Hi mum!"; could be OK (depending on namespace and using directives).

Worse: Saying String.Concat(someSequence) will likely (depending on using s) go to the Linq extension method Enumerable.Concat . It will not go to the static method string.Concat .

Secondly, when String is another type , nested inside the current type:

class MyPiano
{
  protected class String
  {
  }

  void Example()
  {
    var test1 = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
    String test2 = "Goodbye";
  }
}

Neither statement in the Example method compiles. Here String is always a piano string , MyPiano.String . No member ( static or not) Format exists on it (or is inherited from its base class). And the value "Goodbye" cannot be converted into it.




小寫stringSystem.String的別名。 它們在C#中是一樣的。

關於是否應該使用System類型( System.Int32System.String等)類型或C# aliasesintstring等)存在爭議。 我個人認為你應該使用C# aliases ,但這只是我個人的偏好。




There is no difference between the two - string , however, appears to be the preferred option when considering other developers' source code.




我聽說過有關在C#中使用提供的類型別名的最佳答案來自Jeffrey Richter在他的書CLR Via C#中 。 這是他的三個原因:

  • 我看到許多開發人員感到困惑,不知道是否要在他們的代碼中使用字符串字符串 。 因為在C#中,字符串(一個關鍵字)完全映射到System.String(一個FCL類型),所以沒有區別,可以使用。
  • 在C#中, long映射到System.Int64 ,但使用不同的編程語言, long可映射到Int16Int32 。 實際上,C ++ / CLI實際上將長時間視為Int32 。 有人用一種語言閱讀源代碼,如果他或她習慣用不同的編程語言編程,就很容易誤解代碼的意圖。 事實上,大多數語言甚至不會將長時間視為關鍵字,也不會編譯使用它的代碼。
  • FCL有很多方法名稱都是類型名稱的一部分。 例如, BinaryReader類型提供諸如ReadBooleanReadInt32ReadSingle等等的方法,並且System.Convert類型提供諸如ToBooleanToInt32ToSingle等的方法。 儘管編寫下面的代碼是合法的,但帶有float的行對我來說感覺非常不自然,而且行不正確:
BinaryReader br = new BinaryReader(...);
float val  = br.ReadSingle(); // Ok, but feels unnatural
Single val = br.ReadSingle(); // OK and feels good

所以你有它。 我認為這些都是非常好的一點。 然而,我並沒有發現自己在自己的代碼中使用杰弗裡的建議。 也許我太困在我的C#世界,但我最終試圖讓我的代碼看起來像框架代碼。




System.String是.NET字符串類 - 在C#中, stringSystem.String的別名 - 因此在使用時它們是相同的。

至於指導方針,我不會陷入困境,只是用你自己喜歡的方式 - 生活中有更重要的事情,代碼也會一樣。

如果你發現自己構建的系統需要指定你正在使用的整數的大小,並且傾向於使用Int16Int32UInt16UInt32等,那麼使用String可能更自然 - 並且當在不同的.net語言可能會讓事情變得更容易理解 - 否則我會使用string和int。




與其他程序員看似普遍的做法相反,我更喜歡String over string ,只是為了突出顯示String是參考類型的事實,正如Jon Skeet所述。




正如其他人所說的,他們是一樣的。 StyleCop規則默認情況下會強制您使用string作為C#代碼樣式的最佳實踐,除非引用System.String靜態函數(例如String.FormatString.JoinString.Concat等)。




有一個區別 - 你不能使用String而不using System; 預先。




此YouTube視頻實際上展示了它們的不同之處。

但是現在需要長時間的文字回答。

當我們談論.NET ,有兩種不同的東西,一種是.NET框架,另一種是使用該框架的語言( C#VB.NET等)。

System.String ”aka“String”(大寫“S”)是一個.NET框架數據類型,而“string”是一個C#數據類型。

簡而言之,“字符串”是“字符串”的別名(稱為不同名稱的同一事物)。 所以在技術上,下面的代碼語句會給出相同的輸出。

String s = "I am String";

要么

string s = "I am String";

以同樣的方式,有其他c#數據類型的別名,如下所示: -

object: System.Object ,string: System.String ,bool: System.Boolean ,byte: System.Byte ,sbyte: System.SByte ,short: System.Int16等等

現在從程序員的角度來看百萬美元的問題那麼何時使用“字符串”和“字符串”呢?

為避免混淆,首先要始終使用其中之一。 但是從最佳實踐的角度來看,當你做變量聲明時,最好使用“string”(小的“s”),當你將它用作類名時,首選“String”(大寫“S”)。

在下面的代碼中,左邊是一個變量聲明,並用“string”聲明。 在右側,我們正在調用一個方法,所以“字符串”更明智。

string s = String.ToUpper() ;



晚會遲到:我在100%的時間裡使用CLR類型(當然,除非被迫使用C#類型,但我不記得最後一次是什麼時候)。

根據里奇的CLR書籍,我最初是在幾年前開始做的。 對我而言,所有CLR語言最終都必須能夠支持CLR類型集合,因此使用CLR類型可以提供更清晰,更可重用的代碼。

現在我已經做了好幾年了,這是一種習慣,我喜歡VS為CLR類型顯示的著色。

唯一真正的地方是自動完成使用C#類型,所以我最終重新輸入自動生成的類型來指定CLR類型。

此外,現在,當我看到“int”或“string”時,它看起來真的錯了,就像我正在查看1970年代的C代碼一樣。




String( System.String )是基類庫中的一個類。 字符串(小寫)是C#中保留的工作,它是System.String的別名。 Int32與int類似, Boolean vs. bool 。 這些C#語言特定的關鍵字使您能夠以類似於C的風格聲明原語。




stringString在所有方面都是相同的(大寫字母“S”除外)。 這兩種方式都沒有任何性能影響。

由於語法突出顯示,小寫string在大多數項目中都是首選




這是一個慣例,真的。 “string”看起來更像C / C ++風格。 一般慣例是使用你選擇的語言提供的任何快捷鍵(int / Int for Int32)。 這也適用於“對象”和“小數”。

從理論上講,這可能有助於將代碼移植到未來的64位標準中,其中“int”可能意味著Int64,但這不是重點,我希望任何升級嚮導都可以將任何“int”引用更改為“Int32”注意安全。




Yes, that's no difference between them, just like the bool and Boolean .




Related