7151

例(ケースに注意してください):

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

それぞれの使用に関するガイドラインは何ですか?そして、違いは何ですか?

4

63 に答える 63

6728

stringのC#のエイリアスですSystem.String
したがって、技術的には違いはありません。それはint System.Int32のようなものです。

stringガイドラインに関しては、オブジェクトを参照するときはいつでも使用することをお勧めします。

例えば

string place = "world";

同様にString、クラスを具体的に参照する必要がある場合は、一般的に使用することをお勧めします。

例えば

string greet = String.Format("Hello {0}!", place);

これは、Microsoftが例で使用する傾向があるスタイルです。

StyleCopがC#固有のエイリアスの使用を強制するようになったため、この領域のガイダンスが変更された可能性があります。

于 2008-08-10T07:22:02.030 に答える
3689

完全を期すために、関連情報のブレインダンプを以下に示します...

他の人が指摘したように、stringは のエイリアスですSystem.StringStringコードを使用してコンパイルすると仮定するとSystem.String(つまり、異なる型の他の名前空間の using ディレクティブがない場合String)、それらは同じコードにコンパイルされるため、実行時に違いはまったくありません。これは、C# のエイリアスの 1 つにすぎません。完全なリストは次のとおりです。

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リテラルを許可し、エイリアスも持っています。)

エイリアスを使用しなければならない状況が 1 つあります。列挙型の基になる型を明示的に指定する場合です。例えば:

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

これは、仕様が列挙型宣言を定義する方法の問題です。コロンの後の部分は、生成とは対照的に、 、 、 、 、、、...の1つのトークンである整数型生成でなければなりません。たとえば、変数宣言で使用されます。他の違いを示すものではありません。sbytebyteshortushortintuintlongulongchar

最後に、どちらを使用するかについて: 個人的には、実装にはどこでもエイリアスを使用しますが、API には CLR 型を使用します。実装に関しては、どちらを使用するかはそれほど重要ではありません。チーム内で一貫性があることは良いことですが、他の誰も気にすることはありません。一方、API で型を参照する場合は、言語に依存しない方法で行うことが非常に重要です。呼び出されたメソッドReadInt32は明確ですが、呼び出されたメソッドにReadIntは解釈が必要です。呼び出し元は、たとえば、のintエイリアスを定義する言語を使用している可能性があります。Int16.NET フレームワークの設計者は、このパターンに従っています。良い例はBitConverterBinaryReaderおよびConvertクラスにあります。

于 2008-10-18T18:52:13.807 に答える
791

Stringの略でSystem.String、.NET Framework 型です。の C# 言語で stringのエイリアスSystem.Stringです。どちらもSystem.StringIL (Intermediate Language) でコンパイルされているため、違いはありません。好きなものを選んで使ってください。stringC# でコーディングする場合は、C# 型のエイリアスであり、C# プログラマーによく知られているため、私はそれを好みます。

( intSystem.Int32)などについても同じことが言えます。

于 2008-10-18T17:25:45.573 に答える
557

提供された型エイリアスを C# で使用することについて私が聞いた中で最も良い答えは、Jeffrey Richter の著書CLR Via C#にあります。彼の3つの理由は次のとおりです。

  • コードで文字を使用するか文字列を使用するかを知らずに、多くの開発者が混乱しているのを見てきました。C# では文字列 (キーワード) が System.String (FCL 型) に正確にマップされるため、違いはなく、どちらも使用できます。
  • C# ではlongはSystem.Int64にマップされますが、別のプログラミング言語ではlongはInt16またはInt32にマップされる可能性があります。実際、C++/CLI は long をInt32として扱います。ある言語でソース コードを読んでいる人は、別のプログラミング言語でのプログラミングに慣れていると、コードの意図を簡単に誤解する可能性があります。実際、ほとんどの言語はlongをキーワードとして扱うことさえせず、それを使用するコードをコンパイルしません。
  • FCL には、メソッド名の一部として型名を持つ多くのメソッドがあります。たとえば、BinaryReader型はReadBooleanReadInt32ReadSingleなどのメソッドを提供し、System.Convert型はToBooleanToInt32ToSingleなどのメソッドを提供します。次のコードを書くことは合法ですが、フロートのある行は私には非常に不自然に感じられ、その行が正しいかどうかは明らかではありません:
BinaryReader br = new BinaryReader(...);
float val  = br.ReadSingle(); // OK, but feels unnatural
Single val = br.ReadSingle(); // OK and feels good

それで、あなたはそれを持っています。これらはすべて本当に良い点だと思います。ただし、自分のコードでジェフリーのアドバイスを使用しているとは思いません。C# の世界に行き詰まりすぎているのかもしれませんが、自分のコードをフレームワーク コードのように見せようとしてしまいます。

于 2008-08-15T23:00:44.410 に答える
495

stringは予約語ですが、String単なるクラス名です。つまり、stringそれ自体を変数名として使用することはできません。

何らかの理由でstringという変数が必要な場合は、これらのコンパイルの最初のものだけが表示されます。

StringBuilder String = new StringBuilder();  // compiles
StringBuilder string = new StringBuilder();  // doesn't compile 

本当にstringという変数名が必要な場合@は、プレフィックスとして使用できます。

StringBuilder @string = new StringBuilder();

もう 1 つの重要な違い: スタック オーバーフローでは、それらが異なる方法で強調表示されます。

于 2009-02-24T05:14:10.860 に答える
434

違いが1つあります。事前に使用しStringないと使用できません。using System;

于 2008-08-27T18:21:37.670 に答える
337

上記で説明しました。stringただし、リフレクションでは使用できません。を使用する必要がありますString

于 2008-10-19T01:04:57.860 に答える
293

System.Stringは.NET文字列クラスです-C#stringではのエイリアスですSystem.String-したがって、使用中は同じです。

ガイドラインに関しては、私は行き詰まることはなく、あなたが好きなものを使用するだけです-人生にはもっと重要なことがあり、コードはとにかく同じになるでしょう。

使用している整数のサイズを指定する必要があり、、、などを使用する傾向があるシステムを構築している場合は、使用するInt16のがInt32より自然に見えるかもしれません-異なる.net言語間を移動するときは物事をより理解しやすくします-そうでなければ、stringとintを使用します。UInt16UInt32String

于 2008-08-10T07:26:14.783 に答える
233

.NETフォーマット上の理由から、(エイリアスではなく) 大文字の型を好みます。型は他の.NETオブジェクト型と同じように色付けされています (結局のところ、値型は適切なオブジェクトです)。

条件付きおよび制御キーワード ( ifswitch、および などreturn) は小文字で、紺色 (デフォルト) で表示されます。そして、私はむしろ使用とフォーマットの不一致を望んでいません.

検討:

String someString; 
string anotherString; 
于 2008-09-03T18:58:07.977 に答える
210

stringおよびStringはすべての点で同一です(大文字の「S」を除く)。どちらの方法でも、パフォーマンスへの影響はありません。

構文が強調表示されるため、ほとんどのプロジェクトでは小文字stringが推奨されます

于 2008-10-18T16:50:05.007 に答える
205

C# は、CLR と共に使用される言語です。

stringC# の型です。

System.StringCLR の型です。

C# を CLR と一緒に使用すると、stringにマップされSystem.Stringます。

理論的には、Java バイトコードを生成する C# コンパイラを実装できます。このコンパイラの賢明な実装は、Java ランタイム ライブラリと相互運用するために、おそらく にマップstringされます。java.lang.String

于 2009-03-17T20:29:13.253 に答える
203

この YouTubeビデオは、それらの違いを実際に示しています。

しかし、今は長いテキストの答えです。

私たちが話すとき、.NET1つは.NETフレームワークであり、もう1つはそのフレームワークを使用する言語(C#などVB.NET)です。

ここに画像の説明を入力

" System.String" 別名 "String" (大文字の "S") は.NETフレームワーク データ型ですが、"string" はC#データ型です。

ここに画像の説明を入力

つまり、「String」は「string」のエイリアス (同じものを別の名前で呼ぶ) です。したがって、技術的には、以下の両方のコード ステートメントで同じ出力が得られます。

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" と "string" を使用するのでしょうか?

混乱を避けるための最初のことは、それらのいずれかを一貫して使用することです。ただし、変数宣言を行うときのベスト プラクティスの観点からは、"string" (小文字の "s") を使用することをお勧めします。クラス名として使用する場合は、"String" (大文字の "S") を使用することをお勧めします。

以下のコードでは、左側が変数宣言であり、「string」を使用して宣言されています。右側では、メソッドを呼び出しているため、"String" の方が適切です。

string s = String.ToUpper() ;
于 2014-01-15T18:03:23.657 に答える
183

小文字stringはのエイリアスですSystem.String。それらはで同じですC#

System.Int32システムタイプ( 、、System.Stringなど)タイプを使用するか、C# aliasesint、、など)を使用するかについては議論がありますstring。私はあなたがを使うべきだと個人的に信じていますがC# aliases、それは私の個人的な好みです。

于 2008-08-10T07:27:55.060 に答える
166

stringの単なるエイリアスですSystem.String。コンパイラはそれらを同じように扱います。

唯一の実際的な違いは、あなたが言及したように構文が強調表示されていることと、を使用する場合は記述しusing SystemなければならないことStringです。

于 2008-10-18T16:50:48.110 に答える
153

どちらも同じです。ただし、コーディング ガイドラインの観点からは、 のstring代わりに使用することをお勧めしますString。これは、一般的に開発者が使用するものです。たとえば、使用する代わりにas is エイリアスInt32を使用しますintintInt32

参考までに「キーワード文字列は、事前定義されたクラスの単なるエイリアスですSystem.String。」- C# 言語仕様 4.2.3 http://msdn2.microsoft.com/En-US/library/aa691153.aspx

于 2008-10-18T18:26:20.520 に答える
128

他の方がおっしゃる通り、同じです。StyleCop ルールは、デフォルトで、 、 、 などの静的関数を参照する場合を除いて、C# コード スタイルのベスト プラクティスとして使用することを強制しstringます。System.StringString.FormatString.JoinString.Concat

于 2008-10-19T01:15:31.570 に答える
105

システムタイプを使用すると、C#とVB.Netの間での移植が容易になります(そのようなことに興味がある場合)。

于 2008-09-22T19:40:08.533 に答える
94

Jon Skeet が述べたように、参照型であるという事実を強調するためだけに、他のプログラマーの間で一般的な慣行と思われるものに対して、私は よりも好みStringます。stringString

于 2011-05-31T11:20:21.507 に答える
87

stringのエイリアス(または省略形)ですSystem.String。つまり、入力するということは、stringを意味しSystem.Stringます。詳細については、thinklinkを参照してください。「string」はSystem.Stringのエイリアス/省略形です。

于 2011-10-21T01:10:10.410 に答える
85

Ritchersの本から、これをlfoustsの回答に追加したいと思います:

C# 言語の仕様には、「スタイルの問題として、完全なシステム型名の使用よりもキーワードの使用が優先されます」と記載されています。私は言語仕様に同意しません。私は FCL 型名を使用することを好み、プリミティブ型名は完全に避けます。実際、コンパイラがプリミティブ型名を提供することさえせず、開発者が代わりに FCL 型名を使用することを強制することを望みます。ここに私の理由があります:

  • コードで文字を使用する か文字列を使用するかを知らずに、多くの開発者が混乱しているのを見てきました。C# ではstring (キーワード) が System.String (FCL 型) に正確にマップされるため、違いはなく、どちらも使用できます。同様に、一部の開発者は、アプリケーションが 32 ビット OS で実行されている場合はintが 32 ビット整数を表し、アプリケーションが 64 ビット OS で実行されている場合は 64 ビット整数を表すと言っているのを聞いたことがあります。このステートメントは絶対に誤りです。C# では、intは常にSystem.Int32にマップされるため、コードが実行されている OS に関係なく、32 ビット整数を表します。プログラマーが使用する場合コードにInt32を使用すると、この潜在的な混乱も解消されます。

  • C# ではlongはSystem.Int64にマップされますが、別のプログラミング言語ではlongはInt16またはInt32 にマップされる可能性があります。実際、C++/CLI はlongInt32として扱います。ある言語でソース コードを読んでいる人は、別のプログラミング言語でのプログラミングに慣れていると、コードの意図を簡単に誤解する可能性があります。実際、ほとんどの言語はlongをキーワードとして扱うことさえせず、それを使用するコードをコンパイルしません。

  • FCL には、メソッド名の一部として型名を持つ多くのメソッドがあります。たとえば、BinaryReader型はReadBooleanReadInt32ReadSingleなどのメソッドを提供し、System.Convert型は ToBooleanToInt32ToSingleなどのメソッドを提供します。次のコードを書くことは合法ですが、フロートのある行は私には非常に不自然に感じられ、その行が正しいかどうかは明らかではありません:

    BinaryReader br = new BinaryReader(...);
    float val = br.ReadSingle(); // OK, but feels unnatural
    Single val = br.ReadSingle(); // OK and feels good
    
  • C# のみを使用する多くのプログラマーは、CLR に対して他のプログラミング言語を使用できることを忘れがちです。このため、C# 主義がクラス ライブラリ コードに忍び込んでいます。たとえば、Microsoft の FCL はほぼ独占的に C# で記述されており、FCL チームの開発者は ArrayGetLongLengthなどのメソッドをライブラリに導入しました。これは C# ではlongであるInt64値を返しますが、他の言語 (C++ など) ではそうではありません。 /CLI)。もう 1 つの例は、System.Linq.EnumerableLongCountメソッドです。

パラグラフ全体を読む前に、私は彼の意見を知りませんでした.

于 2011-01-28T10:08:57.343 に答える
75

それは本当に慣例の問題です。 stringC/C++ スタイルに似ているだけです。一般的な規則は、選択した言語が提供するショートカット (int/Int for Int32) を使用することです。これは「オブジェクト」にdecimalも当てはまります。

理論的には、これは「int」が を意味する将来の 64 ビット標準にコードを移植するのに役立つ可能性がありますがInt64、それは重要ではありません。intInt32

于 2008-08-18T17:58:11.917 に答える
75

String ( System.String) は基本クラス ライブラリのクラスです。string (小文字) は、System.String のエイリアスである C# の予約済み作業です。Int32 対 int は、現状と同様の状況ですBoolean vs. bool。これらの C# 言語固有のキーワードを使用すると、C に似たスタイルでプリミティブを宣言できます。

于 2012-01-14T22:51:51.313 に答える
71

Stringはキーワードではなく、識別子として使用できますstringが、はキーワードであり、識別子として使用することはできません。そして、機能の観点からは、両方とも同じです。

于 2011-04-25T06:06:45.847 に答える
70

パーティーに遅れて来る: 私は 100% の時間、CLR 型を使用します ( C# 型を強制的に使用する場合を除きますが、前回がいつだったかは覚えていません)。

Ritchie による CLR の本によると、私はもともとこれを数年前に始めました。すべての CLR 言語が最終的に一連の CLR 型をサポートできる必要があることは理にかなっています。そのため、CLR 型を自分で使用すると、より明確で、おそらくより「再利用可能な」コードが提供されます。

私は何年もそれを行ってきたので、それは習慣であり、VS が CLR 型に対して示す色付けが好きです。

唯一の本当の欠点は、オートコンプリートが C# 型を使用することです。そのため、自動生成された型を再入力して代わりに CLR 型を指定することになります。

また、「int」または「string」を見ると、1970 年代の C コードを見ているように、本当に間違っているように見えます。

于 2012-08-24T15:22:47.460 に答える
53

違いはありません。

C# キーワードstringは .NET 型にマップされますSystem.String。これは、言語の命名規則に従うエイリアスです。

同様に、 にintマップされSystem.Int32ます。

于 2012-01-14T22:47:05.243 に答える
44

boolはい、とのように、両者に違いはありませんBoolean

于 2012-10-08T08:22:11.047 に答える
36

この2つに違いはありませんがstring、他の開発者のソースコードを検討する場合は、推奨されるオプションのようです。

于 2011-08-24T09:25:55.013 に答える
28

パスカルケースを優先するために他の場所で言及されていない1つの引数String

System.Stringは参照型であり、参照型の名前は慣例によりパスカル ケースです。

于 2012-10-03T10:52:15.897 に答える
22

実質的に違いはありません

C# のキーワード string は、.NET 型の System.String にマップされます。これは、言語の命名規則に従うエイリアスです。

于 2014-03-07T13:09:55.307 に答える
16

stringと の間に違いがないことを実際に確認すると便利な場合System.String

var method1 = typeof(MyClass).GetMethod("TestString1").GetMethodBody().GetILAsByteArray();
var method2 = typeof(MyClass).GetMethod("TestString2").GetMethodBody().GetILAsByteArray();

//...

public string TestString1()
{
    string str = "Hello World!";
    return str;
}

public string TestString2()
{
    String str = "Hello World!";
    return str;
}

どちらもまったく同じ IL バイト配列を生成します。

[ 0, 114, 107, 0, 0, 112, 10, 6, 11, 43, 0, 7, 42 ]
于 2015-10-01T17:43:01.330 に答える
14

String含まれている文字列を操作するためのさまざまな関数が付属する文字列オブジェクトを参照します。

stringプリミティブ型を指します

C# ではどちらも String にコンパイルされますが、他の言語ではコンパイルされないため、String オブジェクトを処理する場合は String を使用し、リテラルを処理する場合は string を使用する必要があります。

于 2012-10-04T10:37:21.247 に答える
10

正直なところ、実際には通常、 と の間System.Stringに違いはありませんstring

C# のすべての型はオブジェクトであり、すべてSystem.Objectクラスから派生します。1 つの違いは、string が C# キーワードでありString、変数名として使用できることです。System.Stringはこのタイプの従来の .NET 名であり、string は便利な C# 名です。System.Stringこれは、と stringの違いを示す簡単なプログラムです。

string a = new string(new char[] { 'x', 'y', 'z' });
string b = new String(new char[] { 'x', 'y', 'z' });
String c = new string(new char[] { 'x', 'y', 'z' });
String d = new String(new char[] { 'x', 'y', 'z' });
MessageBox.Show((a.GetType() == typeof(String) && a.GetType() == typeof(string)).ToString()); // shows true
MessageBox.Show((b.GetType() == typeof(String) && b.GetType() == typeof(string)).ToString()); // shows true
MessageBox.Show((c.GetType() == typeof(String) && c.GetType() == typeof(string)).ToString()); // shows true
MessageBox.Show((d.GetType() == typeof(String) && d.GetType() == typeof(string)).ToString()); // shows true

私のコンパイラの@JonSkeet

public enum Foo : UInt32 { }

は働いている。私は Visual Studio 2015 コミュニティを持っています。

于 2016-06-04T11:20:00.133 に答える
9

String: String オブジェクトは、作成後に値を変更できないため、不変 (読み取り専用) と呼ばれます。String オブジェクトを変更するように見えるメソッドは、実際には変更を含む新しい String オブジェクトを返します。文字列のようなオブジェクトの実際の内容を変更する必要がある場合

string:文字列型は、0 個以上の Unicode 文字のシーケンスを表します。string は、.NET Framework における String のエイリアスです。string組み込みの C# データ型であり、システム提供型「System.String」のエイリアスです。C# の仕様では、スタイルの問題として、完全なシステム型名 (System.String または String) よりもキーワード ( string ) が優先されると規定されています。string は参照型ですが、等価演算子 (== および !=) は、参照ではなく文字列オブジェクトの値を比較するために定義されています。これにより、文字列が等しいかどうかのテストがより直感的になります。例えば:

文字列と文字列の違い:

  • string通常宣言にString使用され、静的文字列メソッドへのアクセスに使用されます
  • C# の仕様では、これが適切なスタイルであることが'string'示されているため、定義済みの type を使用する do declare フィールド、プロパティなどを使用できます。'string'
  • 'String'String.Compare などのシステム定義のメソッドを使用するために使用できます。これらは、もともと「string」ではなく「System.String」で定義されています。'string'この場合、単なるエイリアスです。
  • 'String'他のシステムと通信するとき、特に CLR に準拠している場合は、または 'System.Int32' を使用することもできます。つまり、別の場所からデータを取得した場合、そのデータを 'int' ではなく System.Int32 にデシリアライズします (定義によるオリジンが C# システム以外の場合)。
于 2014-05-20T14:34:27.217 に答える
8

MSDN ドキュメンテーションのコンテキストでは、クラスはBCLStringの他のデータ型 ( など) と同様に文書されXmlReaderます。StreamReader

Andstringは、キーワード (C# リファレンス) または基本的な C# 言語構造 (例:forwhile)のように文書化されていdefaultます。

参照

于 2014-07-26T15:40:38.650 に答える
8

stringSystem.Stringこれを書くと、VS2015と同じになります。

System.String str;

コンパイラよりも、それを最適化するための潜在的な修正が表示され、その修正を適用すると、次のようになります

string str;
于 2017-03-25T05:04:01.083 に答える
7

私の知る限り、stringは の単なるエイリアスであり、 、、にはSystem.String同様のエイリアスが存在します ... 唯一の微妙な違いは、「using 」ディレクティブなしで使用できることですが、String にはそれが必要です (そうでない場合は、完全に指定する必要があります)。 .boolobjectintstringSystem;System.String

どちらを使うのがベストかについては、好みの問題だと思います。個人的には好きstringですが、宗教的な問題ではありません。

于 2014-06-20T03:55:31.367 に答える
7

C# キーワードを使用して変数を宣言するのが一般的です。実際、すべての C# 型には .NET で同等の型があります。別の例として、C# の short と int は、.NET の Int16 と Int32 にマップされます。したがって、技術的には string と String に違いはありませんが、C# では、string は .NET Framework の String クラスのエイリアスです。

于 2018-12-01T17:44:23.683 に答える
6

string は、.NET Framework におけるStringのエイリアスです。

「文字列」が実際にどこにあるかSystem.String.

それらは交換可能であり、いつ、どこでどちらを使用する必要があるかに違いはありません。

ただし、どちらを使用したかは一貫している方がよいでしょう。

価値があるのは、string変数、プロパティ、戻り値、およびパラメーターなどの型を宣言するために使用することです。int, bool, varこれは、他のシステム タイプの使用Int32と一致していますBoolean

String.Split()またはのように、String クラスで静的メソッドを使用する場合は String を使用しますString.IsNullOrEmpty()。メソッドはクラスに属しており、他の静的メソッドの使用方法と一貫しているため、これはより理にかなっていると思います。

于 2014-06-11T11:15:56.003 に答える
3

文字列と文字列の画像結果www.javatpoint.com C# では、.NET フレームワークstringのクラスのエイリアスです。String実際、すべての C# 型には .NET で同等の型があります。
もう 1 つの小さな違いは、クラスを使用する場合は名前空間Stringをインポートする必要があるのに対し、キーワードSystemを使用する場合は名前空間をインポートする必要がないことです。string

于 2019-07-02T05:44:28.613 に答える