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



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クラスに適しています。

Question

例( この場合に注意してください ):

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

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




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




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

理論的には、これは "int"がInt64を意味するかもしれない将来の64ビット標準にコードを移植するのに役立つかもしれませんが、それはポイントではなく、私はいずれのアップグレードウィザードでも "int32"への "int"安全です。




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




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




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

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

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

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

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




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#の世界であまりにも立ち往生しているかもしれませんが、私は自分のコードをフレームワークコードのように見せかけることになります。




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

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

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




New answer after 6 years and 5 months (procrastination).

While string is a reserved C# keyword that always has a fixed meaning, String is just an ordinary identifier which could refer to anything. Depending on members of the current type, the current namespace and the applied using directives and their placement, String could be a value or a type distinct from global::System.String .

I shall provide two examples where using directives will not help .

First, when String is a value of the current type (or a local variable):

class MySequence<TElement>
{
  public IEnumerable<TElement> String { get; set; }

  void Example()
  {
    var test = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
  }
}

The above will not compile because IEnumerable<> does not have a non-static member called Format , and no extension methods apply. In the above case, it may still be possible to use String in other contexts where a type is the only possibility syntactically. For example String local = "Hi mum!"; could be OK (depending on namespace and using directives).

Worse: Saying String.Concat(someSequence) will likely (depending on using s) go to the Linq extension method Enumerable.Concat . It will not go to the static method string.Concat .

Secondly, when String is another type , nested inside the current type:

class MyPiano
{
  protected class String
  {
  }

  void Example()
  {
    var test1 = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
    String test2 = "Goodbye";
  }
}

Neither statement in the Example method compiles. Here String is always a piano string , MyPiano.String . No member ( static or not) Format exists on it (or is inherited from its base class). And the value "Goodbye" cannot be converted into it.




Yes, that's no difference between them, just like the bool and Boolean .




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

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




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




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

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




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




Related