配列 - StringとC#のstringの違いは何ですか?




string 大文字 小文字 java (20)

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は Int32 として 長い間 扱います 。 ある言語でソースコードを読んでいる人が、別のプログラミング言語でのプログラミングに慣れていると、そのコードの意図を容易に誤解する可能性があります。 実際、ほとんどの言語は キーワードとして 長く 扱うことすらなく 、それを使用するコードをコンパイルしません。

  • FCLには、メソッド名の一部として型名を持つ多くのメソッドがあります。たとえば、 BinaryReader 型は ReadBoolean ReadInt32 ReadSingle などのメソッドを提供し 、 System.Convert 型は ToBoolean ToInt32 ToSingle などのメソッドを提供します 。次のコードを書くのは合法ですが、 floatを含む 行は 私にとって非常に不自然な感じがするので、その行が正しいことは明らかではありません。

    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チームの開発者 は、 C#では 長い がC ++ではなく Int64 値 を返す Array GetLongLength などのメソッドをライブラリに導入しました。 / CLI) 別の例は、 System.Linq.Enumerable LongCount メソッドです。

私は完全な段落を読む前に私は彼の意見を得ませんでした。

例( 大文字と小文字を区別 ):

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

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


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


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

理論的にはこれは「INT」に意味するかもしれないいくつかの将来の64ビット標準にポートコードに役立つかもしれない Int64 が、それはポイントではない、と私はすべてのアップグレードウィザードは、任意の変更を期待する int ために参照を Int32 とにかく念のために。


はい、それは同じように、それらの間には違いません boolBoolean


パーティーに間に合わなくて:私はCLRタイプを100%使用しています( C#タイプを使用する こと 強制され ている 場合を除いて )。

私はもともとRitchieによるCLRの本のように、この数年前からやり始めました。 すべてのCLR言語が最終的にCLRタイプのセットをサポートできるようにする必要があることは私にとって意味がありました。

私は何年もそれをやってきた今、それは習慣です、そして私はVSがCLRタイプのために示す着色が好きです。

唯一の本当のダウナーはオートコンプリートがC#型を使うということです、それで私は代わりにCLR型を指定するために自動的に生成された型を再入力することになります。

また、今、私が "int"または "string"を見たとき、それは私には本当に間違って見えます、私が1970年代のCコードを見ているように。


両者に違いはありません string が、他の開発者のソースコードを検討する際には好ましい選択肢と思われます。


違いはありません。

C#キーワード string は.NET型に対応します System.String 。これは、言語の命名規則に従っている別名です。

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


6年5ヵ月後の新しい答え(先延ばし)

string は常に固定の意味を持つ予約済みのC#キーワードですが、 String は単なる通常の 識別子 で、何でも参照できます。 現在の型のメンバ、現在のネームスペース、適用される using ディレクティブ、およびそれらの配置に応じて、 Stringglobal::System.String 異なる値または型になり global::System.String

ディレクティブを using も意味がない 場合は、2つの例を挙げ ます

まず、 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!"; (名前空間とディレクティブの using 応じて)問題ないでしょう。

さらに悪いことに、 String.Concat(someSequence) と言うと String.Concat(someSequence) sの using Enumerable.Concat が)Linq拡張メソッド Enumerable.Concat 行く可能性があり 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 は常にピアノの stringMyPiano.String です。 メンバが存在しない( static かどうかにかかわらず) Format が存在しない(またはその基本クラスから継承される)。 そして値 "Goodbye" はそれに変換することはできません。


それは上でカバーされています。 しかしながら、あなたはリフレクションに string を使うことはできません。 あなたは String 使用する必要があります。


フォーマット上の理由から、(エイリアスではなく)大文字の .NET 型を使用します。 .NET 型は他のオブジェクト型と同じ色で表示されます(結局、値型は適切なオブジェクトです)。

条件付きおよび制御キーワード( ifswitchreturn )は小文字で、濃い青(デフォルト)になっています。 そして、私はむしろ使用法やフォーマットに意見の相違があるとは思いません。

検討してください:

String someString; 
string anotherString; 

他の人が言っているように、それらは同じです。 StyleCop規則は、デフォルトで、 System.String 静的関数( String.FormatString.JoinString.Concat など)を参照する場合を除いて、C#コードスタイルのベストプラクティスとして string を使用するように強制します。


完全を期すために、ここに関連情報の頭脳ダンプがあります。

他の人が指摘したように、 stringSystem.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と比較してみましょう。これは DateTime リテラルを許可し、それに対する別名も持っています。)

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

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

それは仕様がenum宣言を定義する方法の問題です - コロンの後の部分は 整数型 プロダクションでなければなりません、それは sbytebyteshortushortintuintlongulongchar 1つのトークンです。 ..例えば変数宣言で使われるような 生成とは対照的です。 他の違いはありません。

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


私がこれまでにC#で提供されている型の別名を使用することについて聞いたことがある最も良い答えは、彼の本 CLR Via C#の 中でJeffrey Richterから来ています。 これが彼の3つの理由です:

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

それであなたはそれを持っています。 これらはすべて本当に良い点だと思います。 しかし、私は自分自身のコードの中でJeffreyのアドバイスを使っているとは思わない。 たぶん私は私のC#の世界で動けなくなっていますが、私は自分のコードをフレームワークコードのように見せようとしています。


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

しかし、今は長いテキストによる回答です。

.NET について話すとき、2つの異なることがあり .NET 。1つは .NET フレームワークであり、もう1つはそのフレームワークを使用する言語( C#VB.NET など)です。

" System.String "、 "String"(大文字の "S")は .NET Frameworkのデータ型で、 "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 など

プログラマーの視点から見た今、100万ドルの質問それでは、いつ "String"と "string"を使うのでしょうか。

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

以下のコードでは、左側が変数宣言であり、それは "string"を使って宣言しています。 右側ではメソッドを呼び出しているので、 "String"の方が賢明です。

string s = String.ToUpper() ;

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


StringSystem.String を表し、.NET Framework型です。 string は、 System.String C#言語の エイリアス です。 どちらも IL (中間言語)で System.String コンパイルされているので、違いはありません。 好きなものを選んでそれを使う。 C#でコーディングする場合は、C#型のエイリアスでC#プログラマにはよく知られているので、 string をお勧めします。

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


string のエイリアス(または省略形)です System.String 。 つまり、入力 string するということ System.String です。 あなたは思考リンクでもっと読むことができます: 'string'はSystem.Stringの別名/省略形です。


stringString はすべての点で同一です(大文字の "S"を除く)。 どちらにしてもパフォーマンスへの影響はありません。

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


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

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

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

あなたが本当に string という名前の変数名が欲しいなら、接頭辞として @ を使うことができます:

StringBuilder @string = new StringBuilder();

もう一つの重要な違い:はそれらを異なって強調しています。


string はキーワードであり、stringを識別子として使用することはできません。

文字列 はキーワードではないので、識別子として使用できます。

string String = "I am a string";

キーワード string は、 System.String キーワードissue以外の 別名です 。この2つはまったく同じです。

 typeof(string) == typeof(String) == typeof(System.String)




alias