例(ケースに注意してください):
string s = "Hello world!";
String s = "Hello world!";
それぞれの使用に関するガイドラインは何ですか?そして、違いは何ですか?
string
のC#のエイリアスですSystem.String
。
したがって、技術的には違いはありません。それはint
対 System.Int32
のようなものです。
string
ガイドラインに関しては、オブジェクトを参照するときはいつでも使用することをお勧めします。
例えば
string place = "world";
同様にString
、クラスを具体的に参照する必要がある場合は、一般的に使用することをお勧めします。
例えば
string greet = String.Format("Hello {0}!", place);
StyleCopがC#固有のエイリアスの使用を強制するようになったため、この領域のガイダンスが変更された可能性があります。
完全を期すために、関連情報のブレインダンプを以下に示します...
他の人が指摘したように、string
は のエイリアスですSystem.String
。String
コードを使用してコンパイルすると仮定すると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
と を除いてstring
、object
エイリアスはすべて値型です。decimal
は値型ですが、CLR のプリミティブ型ではありません。エイリアスを持たない唯一のプリミティブ型はSystem.IntPtr
.
仕様では、値型のエイリアスは「単純型」として知られています。リテラルは、すべての単純型の定数値に使用できます。他の値型にはリテラル形式がありません。(これを VB と比較してください。VB はDateTime
リテラルを許可し、エイリアスも持っています。)
エイリアスを使用しなければならない状況が 1 つあります。列挙型の基になる型を明示的に指定する場合です。例えば:
public enum Foo : UInt32 {} // Invalid
public enum Bar : uint {} // Valid
これは、仕様が列挙型宣言を定義する方法の問題です。コロンの後の部分は、型生成とは対照的に、 、 、 、 、、、...の1つのトークンである整数型生成でなければなりません。たとえば、変数宣言で使用されます。他の違いを示すものではありません。sbyte
byte
short
ushort
int
uint
long
ulong
char
最後に、どちらを使用するかについて: 個人的には、実装にはどこでもエイリアスを使用しますが、API には CLR 型を使用します。実装に関しては、どちらを使用するかはそれほど重要ではありません。チーム内で一貫性があることは良いことですが、他の誰も気にすることはありません。一方、API で型を参照する場合は、言語に依存しない方法で行うことが非常に重要です。呼び出されたメソッドReadInt32
は明確ですが、呼び出されたメソッドにReadInt
は解釈が必要です。呼び出し元は、たとえば、のint
エイリアスを定義する言語を使用している可能性があります。Int16
.NET フレームワークの設計者は、このパターンに従っています。良い例はBitConverter
、BinaryReader
およびConvert
クラスにあります。
String
の略でSystem.String
、.NET Framework 型です。の C# 言語で string
のエイリアスSystem.String
です。どちらもSystem.String
IL (Intermediate Language) でコンパイルされているため、違いはありません。好きなものを選んで使ってください。string
C# でコーディングする場合は、C# 型のエイリアスであり、C# プログラマーによく知られているため、私はそれを好みます。
( int
、System.Int32
)などについても同じことが言えます。
提供された型エイリアスを 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型はReadBoolean、ReadInt32、ReadSingleなどのメソッドを提供し、System.Convert型はToBoolean、ToInt32、ToSingleなどのメソッドを提供します。次のコードを書くことは合法ですが、フロートのある行は私には非常に不自然に感じられ、その行が正しいかどうかは明らかではありません:
BinaryReader br = new BinaryReader(...);
float val = br.ReadSingle(); // OK, but feels unnatural
Single val = br.ReadSingle(); // OK and feels good
それで、あなたはそれを持っています。これらはすべて本当に良い点だと思います。ただし、自分のコードでジェフリーのアドバイスを使用しているとは思いません。C# の世界に行き詰まりすぎているのかもしれませんが、自分のコードをフレームワーク コードのように見せようとしてしまいます。
string
は予約語ですが、String
単なるクラス名です。つまり、string
それ自体を変数名として使用することはできません。
何らかの理由でstringという変数が必要な場合は、これらのコンパイルの最初のものだけが表示されます。
StringBuilder String = new StringBuilder(); // compiles
StringBuilder string = new StringBuilder(); // doesn't compile
本当にstringという変数名が必要な場合@
は、プレフィックスとして使用できます。
StringBuilder @string = new StringBuilder();
もう 1 つの重要な違い: スタック オーバーフローでは、それらが異なる方法で強調表示されます。
違いが1つあります。事前に使用しString
ないと使用できません。using System;
上記で説明しました。string
ただし、リフレクションでは使用できません。を使用する必要がありますString
。
System.String
は.NET文字列クラスです-C#string
ではのエイリアスですSystem.String
-したがって、使用中は同じです。
ガイドラインに関しては、私は行き詰まることはなく、あなたが好きなものを使用するだけです-人生にはもっと重要なことがあり、コードはとにかく同じになるでしょう。
使用している整数のサイズを指定する必要があり、、、などを使用する傾向があるシステムを構築している場合は、使用するInt16
のがInt32
より自然に見えるかもしれません-異なる.net言語間を移動するときは物事をより理解しやすくします-そうでなければ、stringとintを使用します。UInt16
UInt32
String
.NET
フォーマット上の理由から、(エイリアスではなく)
大文字の型を好みます。型は他の.NET
オブジェクト型と同じように色付けされています (結局のところ、値型は適切なオブジェクトです)。
条件付きおよび制御キーワード ( if
、switch
、および などreturn
) は小文字で、紺色 (デフォルト) で表示されます。そして、私はむしろ使用とフォーマットの不一致を望んでいません.
検討:
String someString;
string anotherString;
string
およびString
はすべての点で同一です(大文字の「S」を除く)。どちらの方法でも、パフォーマンスへの影響はありません。
構文が強調表示されるため、ほとんどのプロジェクトでは小文字string
が推奨されます
C# は、CLR と共に使用される言語です。
string
C# の型です。
System.String
CLR の型です。
C# を CLR と一緒に使用すると、string
にマップされSystem.String
ます。
理論的には、Java バイトコードを生成する C# コンパイラを実装できます。このコンパイラの賢明な実装は、Java ランタイム ライブラリと相互運用するために、おそらく にマップstring
されます。java.lang.String
この YouTubeビデオは、それらの違いを実際に示しています。
しかし、今は長いテキストの答えです。
私たちが話すとき、.NET
1つは.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() ;
小文字string
はのエイリアスですSystem.String
。それらはで同じですC#
。
System.Int32
システムタイプ( 、、System.String
など)タイプを使用するか、C# aliases
(int
、、など)を使用するかについては議論がありますstring
。私はあなたがを使うべきだと個人的に信じていますがC# aliases
、それは私の個人的な好みです。
string
の単なるエイリアスですSystem.String
。コンパイラはそれらを同じように扱います。
唯一の実際的な違いは、あなたが言及したように構文が強調表示されていることと、を使用する場合は記述しusing System
なければならないことString
です。
どちらも同じです。ただし、コーディング ガイドラインの観点からは、 のstring
代わりに使用することをお勧めしますString
。これは、一般的に開発者が使用するものです。たとえば、使用する代わりにas is エイリアスInt32
を使用しますint
int
Int32
参考までに「キーワード文字列は、事前定義されたクラスの単なるエイリアスですSystem.String
。」- C# 言語仕様 4.2.3
http://msdn2.microsoft.com/En-US/library/aa691153.aspx
他の方がおっしゃる通り、同じです。StyleCop ルールは、デフォルトで、 、 、 などの静的関数を参照する場合を除いて、C# コード スタイルのベスト プラクティスとして使用することを強制しstring
ます。System.String
String.Format
String.Join
String.Concat
システムタイプを使用すると、C#とVB.Netの間での移植が容易になります(そのようなことに興味がある場合)。
Jon Skeet が述べたように、参照型であるという事実を強調するためだけに、他のプログラマーの間で一般的な慣行と思われるものに対して、私は よりも好みString
ます。string
String
string
のエイリアス(または省略形)ですSystem.String
。つまり、入力するということは、string
を意味しSystem.String
ます。詳細については、thinklinkを参照してください。「string」はSystem.Stringのエイリアス/省略形です。
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 はlongをInt32として扱います。ある言語でソース コードを読んでいる人は、別のプログラミング言語でのプログラミングに慣れていると、コードの意図を簡単に誤解する可能性があります。実際、ほとんどの言語はlongをキーワードとして扱うことさえせず、それを使用するコードをコンパイルしません。
FCL には、メソッド名の一部として型名を持つ多くのメソッドがあります。たとえば、BinaryReader型はReadBoolean、ReadInt32、 ReadSingleなどのメソッドを提供し、System.Convert型は ToBoolean、ToInt32、ToSingleなどのメソッドを提供します。次のコードを書くことは合法ですが、フロートのある行は私には非常に不自然に感じられ、その行が正しいかどうかは明らかではありません:
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 チームの開発者は ArrayのGetLongLengthなどのメソッドをライブラリに導入しました。これは C# ではlongであるInt64値を返しますが、他の言語 (C++ など) ではそうではありません。 /CLI)。もう 1 つの例は、System.Linq.Enumerableの LongCountメソッドです。
パラグラフ全体を読む前に、私は彼の意見を知りませんでした.
それは本当に慣例の問題です。 string
C/C++ スタイルに似ているだけです。一般的な規則は、選択した言語が提供するショートカット (int/Int for Int32
) を使用することです。これは「オブジェクト」にdecimal
も当てはまります。
理論的には、これは「int」が を意味する将来の 64 ビット標準にコードを移植するのに役立つ可能性がありますがInt64
、それは重要ではありません。int
Int32
String ( System.String
) は基本クラス ライブラリのクラスです。string (小文字) は、System.String のエイリアスである C# の予約済み作業です。Int32 対 int は、現状と同様の状況ですBoolean vs. bool
。これらの C# 言語固有のキーワードを使用すると、C に似たスタイルでプリミティブを宣言できます。
String
はキーワードではなく、識別子として使用できますstring
が、はキーワードであり、識別子として使用することはできません。そして、機能の観点からは、両方とも同じです。
パーティーに遅れて来る: 私は 100% の時間、CLR 型を使用します ( C# 型を強制的に使用する場合を除きますが、前回がいつだったかは覚えていません)。
Ritchie による CLR の本によると、私はもともとこれを数年前に始めました。すべての CLR 言語が最終的に一連の CLR 型をサポートできる必要があることは理にかなっています。そのため、CLR 型を自分で使用すると、より明確で、おそらくより「再利用可能な」コードが提供されます。
私は何年もそれを行ってきたので、それは習慣であり、VS が CLR 型に対して示す色付けが好きです。
唯一の本当の欠点は、オートコンプリートが C# 型を使用することです。そのため、自動生成された型を再入力して代わりに CLR 型を指定することになります。
また、「int」または「string」を見ると、1970 年代の C コードを見ているように、本当に間違っているように見えます。
違いはありません。
C# キーワードstring
は .NET 型にマップされますSystem.String
。これは、言語の命名規則に従うエイリアスです。
同様に、 にint
マップされSystem.Int32
ます。
bool
はい、とのように、両者に違いはありませんBoolean
。
この2つに違いはありませんがstring
、他の開発者のソースコードを検討する場合は、推奨されるオプションのようです。
パスカルケースを優先するために他の場所で言及されていない1つの引数String
:
System.String
は参照型であり、参照型の名前は慣例によりパスカル ケースです。
実質的に違いはありません
C# のキーワード string は、.NET 型の System.String にマップされます。これは、言語の命名規則に従うエイリアスです。
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 ]
String
含まれている文字列を操作するためのさまざまな関数が付属する文字列オブジェクトを参照します。
string
プリミティブ型を指します
C# ではどちらも String にコンパイルされますが、他の言語ではコンパイルされないため、String オブジェクトを処理する場合は String を使用し、リテラルを処理する場合は string を使用する必要があります。
正直なところ、実際には通常、 と の間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 コミュニティを持っています。
String: String オブジェクトは、作成後に値を変更できないため、不変 (読み取り専用) と呼ばれます。String オブジェクトを変更するように見えるメソッドは、実際には変更を含む新しい String オブジェクトを返します。文字列のようなオブジェクトの実際の内容を変更する必要がある場合
string:文字列型は、0 個以上の Unicode 文字のシーケンスを表します。string は、.NET Framework における String のエイリアスです。string
組み込みの C# データ型であり、システム提供型「System.String」のエイリアスです。C# の仕様では、スタイルの問題として、完全なシステム型名 (System.String または String) よりもキーワード ( string ) が優先されると規定されています。string は参照型ですが、等価演算子 (== および !=) は、参照ではなく文字列オブジェクトの値を比較するために定義されています。これにより、文字列が等しいかどうかのテストがより直感的になります。例えば:
文字列と文字列の違い:
string
通常宣言にString
使用され、静的文字列メソッドへのアクセスに使用されます'string'
示されているため、定義済みの type を使用する do declare フィールド、プロパティなどを使用できます。'string'
'String'
String.Compare などのシステム定義のメソッドを使用するために使用できます。これらは、もともと「string」ではなく「System.String」で定義されています。'string'
この場合、単なるエイリアスです。'String'
他のシステムと通信するとき、特に CLR に準拠している場合は、または 'System.Int32' を使用することもできます。つまり、別の場所からデータを取得した場合、そのデータを 'int' ではなく System.Int32 にデシリアライズします (定義によるオリジンが C# システム以外の場合)。string
System.String
これを書くと、VS2015と同じになります。
System.String str;
コンパイラよりも、それを最適化するための潜在的な修正が表示され、その修正を適用すると、次のようになります
string str;
私の知る限り、string
は の単なるエイリアスであり、 、、にはSystem.String
同様のエイリアスが存在します ... 唯一の微妙な違いは、「using 」ディレクティブなしで使用できることですが、String にはそれが必要です (そうでない場合は、完全に指定する必要があります)。 .bool
object
int
string
System;
System.String
どちらを使うのがベストかについては、好みの問題だと思います。個人的には好きstring
ですが、宗教的な問題ではありません。
C# キーワードを使用して変数を宣言するのが一般的です。実際、すべての C# 型には .NET で同等の型があります。別の例として、C# の short と int は、.NET の Int16 と Int32 にマップされます。したがって、技術的には string と String に違いはありませんが、C# では、string は .NET Framework の String クラスのエイリアスです。
string は、.NET Framework におけるStringのエイリアスです。
「文字列」が実際にどこにあるかSystem.String.
それらは交換可能であり、いつ、どこでどちらを使用する必要があるかに違いはありません。
ただし、どちらを使用したかは一貫している方がよいでしょう。
価値があるのは、string
変数、プロパティ、戻り値、およびパラメーターなどの型を宣言するために使用することです。int, bool, var
これは、他のシステム タイプの使用Int32
と一致していますBoolean
。
String.Split()
またはのように、String クラスで静的メソッドを使用する場合は String を使用しますString.IsNullOrEmpty()
。メソッドはクラスに属しており、他の静的メソッドの使用方法と一貫しているため、これはより理にかなっていると思います。
文字列と文字列の画像結果www.javatpoint.com
C# では、.NET フレームワークstring
のクラスのエイリアスです。String
実際、すべての C# 型には .NET で同等の型があります。
もう 1 つの小さな違いは、クラスを使用する場合は名前空間String
をインポートする必要があるのに対し、キーワードSystem
を使用する場合は名前空間をインポートする必要がないことです。string