C# の文字列と文字列の違いは何ですか?
質問
例 (ケースに注意してください):
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);
これは Microsoft がよく使用するスタイルです 彼らの例.
この分野のガイダンスは変更された可能性があるようです。 スタイルコップ C# 固有のエイリアスの使用が強制されるようになりました。
他のヒント
完全を期すために、関連情報のブレインダンプをここに示します...
他の人も指摘しているように、 string
のエイリアスです System.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 と比較してください。 DateTime
リテラルであり、エイリアスもあります。)
あなたがいる状況が 1 つあります。 持っている エイリアスを使用するには:列挙型の基になる型を明示的に指定する場合。例えば:
public enum Foo : UInt32 {} // Invalid
public enum Bar : uint {} // Valid
それは単に仕様で enum 宣言を定義する方法の問題です。コロンの後の部分は 一体型 生産、これは 1 つのトークンです sbyte
, byte
, short
, ushort
, int
, uint
, long
, ulong
, char
...とは対照的に タイプ たとえば、変数宣言で使用されるようなプロダクション。それ以外の違いは示されていません。
最後に、どちらを使用するかというと、次のようになります。個人的には、実装にはどこでもエイリアスを使用しますが、API には CLR タイプを使用します。実装に関しては、どちらを使用するかは実際にはそれほど重要ではありません。チーム内で一貫性があるのは良いことですが、他の人は気にしません。一方、API で型を参照する場合は、言語に依存しない方法で参照することが非常に重要です。と呼ばれるメソッド ReadInt32
は明確ですが、 と呼ばれるメソッドは ReadInt
解釈が必要です。呼び出し元は、 int
のエイリアス Int16
, 、 例えば。.NET Framework の設計者はこのパターンに従っており、良い例は次のとおりです。 BitConverter
, BinaryReader
そして Convert
クラス。
String
を意味する System.String
これは .NET Framework タイプです。 string
別名です C#言語では System.String
. 。両方とも次のようにコンパイルされます System.String
イリノイ州で (中級言語)なので違いはありません。好きなものを選んで使ってください。C#でコードを書くなら、私はそれを好みます string
これは C# 型のエイリアスであり、C# プログラマにはよく知られているためです。
についても同じことが言えます (int
, System.Int32
) 等..
C# で提供された型エイリアスの使用について私がこれまで聞いた中で最も優れた答えは、Jeffrey Richter の著書にあります。 C#経由のCLR. 。彼の3つの理由は次のとおりです。
- 多くの開発者が、使用すべきかどうかわからず、混乱しているのを見てきました。 弦 または 弦 彼らのコードでは。C# では、文字列 (キーワード) が System.String (FCL 型) に正確にマップされるため、違いはなく、どちらも使用できます。
- C#では、 長さ にマップします System.Int64, ただし、別のプログラミング言語では、 長さ にマッピングできます Int16 または Int32. 。実際、C++/CLI では、long を Int32. 。ある言語でソース コードを読んでいる人が、別のプログラミング言語でのプログラミングに慣れている場合、コードの意図を簡単に誤解する可能性があります。実際、ほとんどの言語では扱いさえしません。 長さ キーワードとして使用すると、それを使用するコードはコンパイルされません。
- FCL には、メソッド名の一部として型名を持つメソッドが多数あります。たとえば、 バイナリリーダー type は次のようなメソッドを提供します ReadBoolean, ReadInt32, ReadSingle, 、など、 System.Convert type は次のようなメソッドを提供します ToBoolean, ToInt32, シングルへ, 、 等々。次のコードを書くことは合法ですが、float を含む行は私にとって非常に不自然に感じられ、その行が正しいかどうかは明らかではありません。
BinaryReader br = new BinaryReader(...);
float val = br.ReadSingle(); // OK, but feels unnatural
Single val = br.ReadSingle(); // OK and feels good
これで完了です。どれも本当に良い点だと思います。しかし、私は自分のコードで Jeffrey のアドバイスを使用しているとは思いません。私は C# の世界に囚われすぎているのかもしれませんが、自分のコードをフレームワーク コードのように見せようとしてしまいます。
string
は予約語ですが、 String
は単なるクラス名です。この意味は string
単独で変数名として使用することはできません。
何らかの理由で、という変数が必要な場合は、 弦, の場合、次のコンパイルのうち最初のものだけが表示されます。
StringBuilder String = new StringBuilder(); // compiles
StringBuilder string = new StringBuilder(); // doesn't compile
本当に変数名が必要な場合は、 弦 使用できます @
プレフィックスとして:
StringBuilder @string = new StringBuilder();
もう 1 つの重要な違い:Stack Overflow では、それらを別の方法で強調表示します。
違いが 1 つあります - 使えません String
それなし using System;
予め。
それについては上で説明しました。ただし、使用することはできません string
反省の中で。使わなければなりません String
.
System.String
は .NET 文字列クラスです - C# の場合 string
のエイリアスです System.String
- したがって、使用中は同じです。
ガイドラインに関しては、私はあまり行き詰まりすぎず、自分の好きな方を使用するつもりです。人生にはもっと重要なことがあるので、コードはいずれにせよ同じになります。
使用している整数のサイズを指定する必要があるシステムを構築している場合は、 Int16
, Int32
, UInt16
, UInt32
等そうすれば、使ったほうが自然に見えるかもしれません String
- そして、異なる .net 言語間を移動するとき、それは物事をより理解しやすくするかもしれません - それ以外の場合は、string と int を使用します。
大文字の方が好きです .NET
形式上の理由から (エイリアスではなく) タイプを使用します。の .NET
型は他のオブジェクト型と同じ色で表示されます (結局のところ、値型は適切なオブジェクトです)。
条件キーワードと制御キーワード ( if
, switch
, 、 そして return
) は小文字で、濃い青に色付けされます (デフォルト)。そして、使用法や形式に関して意見の相違があることは避けたいと思っています。
考慮する:
String someString;
string anotherString;
string
そして String
すべての点で同一です (大文字の「S」を除く)。どちらの方法でもパフォーマンスへの影響はありません。
小文字 string
構文が強調表示されるため、ほとんどのプロジェクトで好まれます。
C# は CLR とともに使用される言語です。
string
C# の型です。
System.String
CLR の型の 1 つです。
C# を CLR と一緒に使用する場合 string
にマッピングされます System.String
.
理論的には、Java バイトコードを生成する C# コンパイラーを実装できます。このコンパイラの賢明な実装では、おそらく次のようにマッピングされます。 string
に java.lang.String
Java ランタイム ライブラリと相互運用するため。
この YouTube ビデオでは、それらがどのように異なるかを実際に示しています。
ここで、長いテキストの回答を説明します。
について話すとき .NET
二つの異なるものが存在する .NET
フレームワークとその他の言語があります( C#
, VB.NET
など)そのフレームワークを使用します。
"System.String
「別名「文字列」(大文字の「S」)は、 .NET
フレームワークのデータ型ですが、「string」は C#
データ・タイプ。
つまり、「String」は「string」のエイリアス(同じものを別の名前で呼ぶ)です。したがって、技術的には、以下の両方のコードステートメントは同じ出力を返します。
String s = "I am String";
または
string s = "I am String";
同様に、以下に示すように、他の C# データ型のエイリアスもあります。
物体: System.Object
, 、 弦: System.String
, 、ブール: System.Boolean
, 、バイト: System.Byte
, 、sbyte: System.SByte
, 、 短い: System.Int16
等々
プログラマの観点から見た 100 万ドルの質問 それでは、「String」と「string」をいつ使用するのでしょうか?
混乱を避けるためには、まずいずれかの方法を一貫して使用してください。ただし、ベスト プラクティスの観点から、変数宣言を行う場合は "string" (小さな "s") を使用するのが適切であり、クラス名として使用する場合は "String" (大文字の "S") が推奨されます。
以下のコードの左側は変数宣言であり、「string」を使用して宣言されています。右側ではメソッドを呼び出しているため、「String」の方が賢明です。
string s = String.ToUpper() ;
小文字 string
のエイリアスです System.String
。それらは同じです C#
.
System タイプ (System.Int32
, System.String
, 、など)タイプまたは C# aliases
(int
, string
, 、など)。私は個人的には、を使用する必要があると信じています C# aliases
, 、しかしそれは私の個人的な好みにすぎません。
string
は単なるエイリアスです System.String
. 。コンパイラはそれらを同一に扱います。
唯一の実質的な違いは、あなたが述べたように構文の強調表示であり、次のように記述する必要があります。 using System
使用する場合 String
.
どちらも同じです。ただし、コーディングガイドラインの観点からは、使用する方が良いです string
の代わりに String
. 。これは一般に開発者が使用するものです。例えばを使用する代わりに Int32
を使用しております int
として int
のエイリアスです Int32
参考までに「キーワード文字列は単に事前定義されたクラスのエイリアスです System.String
。」 -C#言語仕様4.2.3http://msdn2.microsoft.com/En-US/library/aa691153.aspx
他の方もおっしゃっている通り、同じです。StyleCop ルールでは、デフォルトで次の使用が強制されます。 string
参照する場合を除き、C# コード スタイルのベスト プラクティスとして System.String
静的関数など String.Format
, String.Join
, String.Concat
, 、など...
6年5ヶ月ぶりの新たな答え(先延ばし)。
その間 string
は常に固定された意味を持つ予約された C# キーワードです。 String
ただの普通です 識別子 それは何でも指すことができます。現在の型のメンバー、現在の名前空間、および適用された using
ディレクティブとその配置、 String
とは異なる値または型である可能性があります global::System.String
.
2 つの例を示します。 using
指示は役に立ちません.
まず、いつ String
です 価値 現在の型 (またはローカル変数):
class MySequence<TElement>
{
public IEnumerable<TElement> String { get; set; }
void Example()
{
var test = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
}
}
上記はコンパイルされません。 IEnumerable<>
という非静的メンバーがありません Format
, 、拡張メソッドは適用されません。上記の場合でもご利用いただける場合がございます。 String
他のコンテキストでは、 タイプ 構文的にはこれが唯一の可能性です。例えば String local = "Hi mum!";
OKかもしれません(名前空間と using
指令)。
悪い:言ってる String.Concat(someSequence)
おそらく(状況に応じて) using
s) Linq 拡張メソッドに移動します Enumerable.Concat
. 。静的メソッドには移行しません string.Concat
.
第二に、いつ String
別のものです タイプ, 、現在の型内にネストされています。
class MyPiano
{
protected class String
{
}
void Example()
{
var test1 = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
String test2 = "Goodbye";
}
}
どちらの声明も Example
メソッドがコンパイルされます。ここ String
いつもピアノです 弦, MyPiano.String
. 。メンバーがいません (static
か否か) Format
上に存在します (またはその基本クラスから継承されます)。そしてその価値は "Goodbye"
それに変換することはできません。
システム型を使用すると、C# と VB.Net 間の移植が容易になります (そのようなことに興味がある場合)。
他のプログラマーの間で一般的に行われていると思われることに対して、私は次のことを好みます。 String
以上 string
, という事実を強調するためだけに、 String
Jon Skeet が述べたように、これは参照型です。
string
のエイリアス (または略記) です。 System.String
. 。つまり、次のように入力すると、 string
私たちが意味したのは System.String
. 。詳細については、リンクを参照してください。 「string」は、System.String の別名/短縮形です。
弦 (System.String
) は、基本クラス ライブラリ内のクラスです。string (小文字) は C# で予約された作業であり、System.String のエイリアスです。Int32 と int も同様の状況です Boolean vs. bool
. 。これらの C# 言語固有のキーワードを使用すると、C に似たスタイルでプリミティブを宣言できます。
Ritchersの本から、これをlfoustsの回答に追加したいと思います。
C#言語仕様には、「スタイルの問題として、キーワードの使用は、完全なシステムタイプ名の使用よりも好まれます。」私は言語仕様に同意しません。FCLタイプ名を使用して、プリミティブタイプ名を完全に回避することを好みます。実際、コンパイラがプリミティブタイプ名さえ提供しておらず、開発者に代わりにFCLタイプ名を使用するように強制したことを願っています。私の理由は次のとおりです。
多くの開発者が、使用すべきかどうかわからず、混乱しているのを見てきました。 弦または 弦 彼らのコードでは。なぜならC#では 弦 (キーワード) に正確にマッピングされます System.String (FCLタイプ)と違いはなく、どちらでもご使用いただけます。同様に、一部の開発者がそれを言うのを聞いたことがあります 整数 アプリケーションが32ビットOSで実行されている場合、32ビット整数を表し、アプリケーションが64ビットOSで実行されているときに64ビット整数を表します。この声明は完全に誤りです。C# では、 整数 常にマップします System.Int32, 、したがって、コードが実行されているOSに関係なく、32ビット整数を表します。プログラマーが使用する場合 Int32 コードでは、この潜在的な混乱も排除されます。
C#では、 長さ にマップします System.Int64, ただし、別のプログラミング言語では、 長さにマッピングできます Int16 または Int32. 。実際、C++/CLI は 長さ として Int32。ある言語でソースコードを読んでいる人は、別のプログラミング言語でのプログラミングに慣れていた場合、コードの意図を簡単に誤解する可能性があります。実際、ほとんどの言語では扱いさえされません。 長さ キーワードとして、それを使用するコードをコンパイルしません。
FCL には、メソッド名の一部として型名を持つメソッドが多数あります。たとえば、 バイナリリーダー type は次のようなメソッドを提供します ReadBoolean, ReadInt32, ReadSingle, 、など、 System.Convert type は次のようなメソッドを提供します ToBoolean, ToInt32, シングルへ, 、 等々。次のコードを書くことは合法ですが、 浮く 私には非常に不自然に感じます、そして、線が正しいことは明らかではありません:
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チームの開発者は現在、ライブラリに方法を導入しました。 配列の GetLongLength, を返します。 Int64 という値 長さ C#では、他の言語ではありません(C ++/CLIなど)。別の例は System.Linq.Enumerableの ロングカウント 方法。
全文を読むまで彼の意見を聞くことはできませんでした。
String
はキーワードではないため、識別子として使用できますが、 string
はキーワードであるため、識別子として使用できません。そして機能の観点ではどちらも同じです。
パーティーに遅れて来る:私は 100% の場合 CLR タイプを使用します (ただし、次の場合は除きます)。 強制的 C# 型を使用するためですが、最後に使用したのがいつかは覚えていません)。
私はもともとリッチーの CLR 本に従って何年も前にこれを始めました。すべての CLR 言語は最終的に一連の CLR 型をサポートできなければならないことが私には理解できました。そのため、CLR 型を自分で使用すると、より明確で、おそらくより「再利用可能な」コードが提供されました。
もう何年もやっているので、それが習慣になっていて、VS が CLR タイプで見せる色合いが気に入っています。
唯一の問題は、オートコンプリートで C# 型が使用されるため、代わりに CLR 型を指定するために自動生成された型を再入力することになることです。
また、今、「int」や「string」を見ると、1970 年代の C コードを見ているかのように、本当に間違っているように見えます。
本当に、それは慣例の問題です。 string
見た目は C/C++ スタイルに似ています。一般的な規則では、選択した言語が提供するショートカット (int/Int の場合) を使用します。 Int32
)。これは「オブジェクト」にも当てはまりますが、 decimal
同じように。
理論的には、これはコードを将来の 64 ビット標準に移植するのに役立つ可能性があります。 Int64
, 、しかし、それは重要ではありません、そして、私はアップグレードウィザードが何かを変更すると予想します int
への参照 Int32
とにかく安全のために。
違いはありません。
C# キーワード string
.NET タイプにマップします System.String
- これは言語の命名規則に従うエイリアスです。
同様に、 int
にマップします System.Int32
.
この問題に関する引用は次のとおりです。 ダニエル・ソリスの本.
すべての事前定義されたタイプは、基礎となる.NETタイプに直接マッピングされます。C#タイプ名(文字列)は、.NETタイプ(StringまたはSystem.String)の単なるエイリアスです。したがって、.NET名を使用すると構文的に正常に機能しますが、これは落胆します。C#プログラム内では、.NET名ではなくC#名前を使用する必要があります。
弦 はキーワードであり、文字列を識別子として使用することはできません。
弦 はキーワードではないため、識別子として使用できます。
例
string String = "I am a string";
キーワード string
のエイリアスです System.String
キーワードの問題は別として、2つはまったく同等です。
typeof(string) == typeof(String) == typeof(System.String)
はい、それは両者に違いはありません。 bool
そして Boolean
.
両者に違いはありません - string
, ただし、他の開発者のソース コードを考慮する場合は、推奨されるオプションのようです。