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




string 大文字 小文字 java (24)

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

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

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


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


他のプログラマの間で一般的なように思われるものに反して、私が好む String オーバー string ちょうど事実強調するために、 String ジョンスキートが述べたように、参照型であるが。


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

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


両方とも同じです。 しかし、コーディングガイドラインの観点からは、 String ではなく string を使用することをお勧めします。 これが一般的に開発者が使用するものです。 例えば、 Int32 を使用する代わりに、 intInt32 別名として使用します。

FYI「キーワード文字列は、単に定義済みクラス System.String エイリアスです。」 - C#言語仕様4.2.3 http://msdn2.microsoft.com/En-US/library/aa691153.aspx


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

ガイドラインに関しては、私は行き詰まり過ぎず、どちらを使用しても構いません。人生においてもっと重要なことがあり、コードはとにかく同じになるでしょう。

使用している整数のサイズを指定する必要があり、 Int16Int32UInt16UInt32 などを使用する傾向があるシステムを構築している場合は、 String を使用する方が自然に見え UInt32 。 .net言語はそれを物事をもっと分かりやすくするかもしれません - さもなければ私はstringとintを使うでしょう。


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

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


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" はそれに変換することはできません。


この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() ;

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

System型( System.Int32System.String など)型と C# aliasesintstring など)のどちらを使用するかについては、議論があり System.String 。 私は個人的には C# aliases 使うべきだと思っていますが、それは私の個人的な好みです。


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

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


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

string はC#の型です。

System.String はCLRの型です。

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

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


string のエイリアス(または省略形)です System.String 。 つまり、入力 string するということ System.String です。 あなたは思考リンクでもっと読むことができます: '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は 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 メソッドです。

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


この問題に関する Daniel Solisの本 からの引用があり ます。

定義済みの型はすべて、基になる.NETの型に直接マッピングされています。 C#型の名前(文字列)は.NET型(StringまたはSystem.String)の単なるエイリアスであるため、.NET名の使用は構文的にはうまく機能しますが、お勧めできません。 C#プログラム内では、.NET名ではなくC#名を使用する必要があります。


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


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


string はC#の System.String エイリアスです。
技術的には違いはありません。 int System.Int32 のようです。

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

例えば

string place = "world";

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

例えば

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

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

StyleCop 現在C#固有のエイリアスの使用を強制しているため、この分野のガイダンスは変更されている可能性があります。


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


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

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

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

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

StringBuilder @string = new StringBuilder();

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


違いはありません。

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

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


1つ違いがあり ます - using System; 使わずに Stringusing System; ことはできません using System; 予め。


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

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

検討してください:

String someString; 
string anotherString; 

私がこれまでに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#の世界で動けなくなっていますが、私は自分のコードをフレームワークコードのように見せようとしています。


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

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





alias