c# - C#の文字列と文字列の違いは何ですか?




15 Answers

完全性のために、ここに関連情報の脳のダンプがあります...

他の人が指摘しているように、 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の型を参照する場合は、言語に依存しない方法で実装することが重要です。 ReadInt32というReadInt32はあいまいではありReadInt32が、 ReadInt32というメソッドは解釈が必要です。 呼び出し元は、 Int16 intエイリアスを定義する言語を使用している可能性があります。 .NET Frameworkの設計者はこのパターンに従っており、 BitConverterクラス、 BinaryReaderクラス、 Convertクラスに適しています。

c# .net string types alias

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

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

それぞれの使用のためのガイドラインは何ですか? 違いは何ですか?




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

  • 文字列文字列をコードに使用するかどうかわからない、多くの開発者が混乱しているのを見たことがあります。 C#では文字列(キーワード)がSystem.String(FCL型)に正確にマップされるため、違いはなく、いずれかを使用できます。
  • C#ではlongSystem.Int64にマップされますが、別のプログラミング言語ではInt16またはInt32にマップされます。 実際には、C ++ / CLIは実際には長い間Int32として扱われます。 ある言語でソースコードを読んでいる人が、別のプログラミング言語でプログラミングすることに慣れていると、コードの意図を誤って解釈する可能性があります。 実際、ほとんどの言語は長い間キーワードとして扱われず、それを使用するコードをコンパイルしません。
  • 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

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




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




System.Stringは.NET文字列クラスです.C#ではstringSystem.Stringエイリアスです。使用するためには同じです。

ガイドラインに関しては、あまりにもぎこちなくなっておらず、あなたが気に入っているようなものを使用してください。人生ではより重要なことがあり、コードは同じになるでしょう。

使用している整数のサイズを指定する必要があり、 Int16Int32UInt16UInt32などを使用する傾向があるシステムを構築している場合は、 Stringを使用する方が自然に見える可能性があります。 .netの言語を使うと、わかりやすくなります。そうでなければ、stringとintを使用します。




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

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




このYouTubeの動画は、実際にどのように違うのかを実証しています。

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

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

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

要するに、 "String"は "string"のエイリアス(異なる名前で呼ばれたもの)です。 したがって、技術的には以下の両方のコードステートメントで同じ出力が得られます。

String s = "I am String";

または

string s = "I am String";

同様に、以下に示すように、他のC#データ型のエイリアスがあります。

オブジェクト: System.Object 、string: System.String 、bool: System.Boolean 、byte: System.Byte 、sbyte: System.SByte 、short: System.Int16など

今、プログラマーの視点からの百万ドルの質問 "文字列"と "文字列"をいつ使用するのですか?

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

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

string s = String.ToUpper() ;



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

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




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




他のプログラマーの間でよく見られるように、私はStringよりもStringを優先しstring .Jon Skeetが指摘したように、 Stringが参照型であるという事実を強調するだけです。




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




遅くパーティーに来る:私は時間の100%のCLRタイプを使用します(ただし、C#タイプを使用すること余儀なくされている場合は例外ですが、最後の時間を覚えていません)。

私はもともとリッチーのCLRの本のように、この数年前にやり始めました。 すべてのCLR言語が最終的にCLR型のセットをサポートできる必要があるので、CLR型を使用することで、より明確で多分 "再利用可能な"コードが提供されることは間違いありませんでした。

これまで何年もやってきたので、それは習慣であり、VSがCLRタイプで示す色合いが気に入っています。

唯一の本当の欠点は、自動補完ではC#型が使用されるため、自動的に生成された型を再入力して、CLR型を指定することになります。

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




それは本当に大会の問題です。 stringはC / C ++スタイルに似ています。 一般的なコンベンションでは、選択した言語で提供されているショートカット( Int32 Int / Int)を使用します。 これは「オブジェクト」とdecimalにも適用されます。

理論的には、これは "int"がInt64意味するいくつかの将来の64ビット標準にコードを移植するのに役立つかもしれませんが、それはポイントではなく、とにかく安全性のためにInt32へのint参照を変更することを期待します。




6年5ヵ月後の新しい回答(延滞)。

while stringは常に固定の意味を持つ予約済みのC#キーワードですが、何かを参照できるString通常の識別子です。現在の型のメンバ、現在の名前空間、適用されているusingディレクティブとそれらの配置に応じて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ディレクティブに応じてOKにすることができます。

悪い:Saying String.Concat(someSequence)はおそらくusingLinq拡張メソッドに行くでしょう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はいつもピアノのstringですMyPiano.String。メンバーが存在しstaticない(またはFormat存在しない)(またはその基本クラスから継承されている)そして値"Goodbye"はそれに変換することはできません。




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

Stringはキーワードではなく、識別子として使用できます。

string String = "I am a string";

キーワードstringは、System.Stringキーワードの問題以外のエイリアスであり、2つは全く同じです。

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



両者の間には違いはありませんstringが、他の開発者のソースコードを検討する際には好ましいオプションのようです。




Related