.NET & Control > 文字列(Stringクラス)
のぶ亭『プログラミングの相談窓口』 … 様々なプログラミング問題を個別対応致します |
文字列(Stringクラス)
C#の言語仕様で言えば、可変長の文字列を扱う型 stringです。'S'が小文字の's'です。string は、.NET
FrameのStringクラスのエイリアス
つまり「別名、またの名前」という意味で同じものです。string
はコンパイラがStringクラスと判断してアセンブリに展開します。
また、Stringクラスは sealed で修飾(宣言)されているため、派生することはできません。
Stringクラスの応用クラスとして、Stringsクラスがあります。名前空間はMicrosoft.VisualBasicですが、C#でも使用できます。
Stringクラスの機能
初期化 | Stringコンストラクタ |
比較 | Compare、CompareOrdinal、CompareTo、Equals、EndsWith、StartsWith |
検索 | IndexOf、IndexOfAny、Contains、LastIndexOf、LastIndexOfAny |
コピー | Copy、CopyTo |
抽出 | Substring |
分割 | Split |
結合 | Concat、Join |
挿入 | Insert |
置き換え | Replace |
埋込 | PadLeft、PadRight |
削除 | Remove、Trim、TrimEnd、TrimStart |
小文字 | ToLower、ToLowerInvariant |
大文字 | ToUpper、ToUpperInvariant |
文字数 | Length |
文字抽出 | インデクサ |
書式 | Format |
状態 | IsInterned、IsNullOrEmpty |
正規化 | IsNormalized、Normalize |
末尾null | null文字を字列末尾へ埋め込み対応 |
共通参照 | Intern |
文字配列 | ToCharArray |
Stringクラスのコンストラクタ
String型の変数を初期化する場合、文字列はそのまま代入式を使います。
例 String txt = "Text";
文字配列を文字列にする場合は、コンストラクタを使用します。
文字配列には、Charのポインタ、Charの配列、SByteのポインタが指定できます。
コンストラクタの機能は、文字列が分解されたChar配列を任意の位置から任意のサイズで文字列に戻すことができます。
また、バイナリーデータの文字部分を文字列に変換することができます。バイナリーデータはファイルや通信データなどがあって、その一部に文字が含まれている場合があります。これらの機能は、滅多に使用しませんが、知識として知っておくと便利です。
1:String Text = null; 2:sbyte[] sbArr1 = new sbyte[] { 0x41, 0x42, 0x43, 0x00 }; 3: 4:unsafe 5:{ 6: fixed (sbyte* pAsciiUpper = sbArr1) 7: { 8: Text = new String(pAsciiUpper); 9: } 10:} 11: 12:sbyte[] sbArr2 = { 0x61, 0x62, 0x63, 0x00 }; 13: 14:unsafe 15:{ 16: fixed (sbyte* pAsciiLower = sbArr2) 17: { 18: Text = new String(pAsciiLower, 0, sbArr2.Length); 19: } 20:}
1:文字列Textを宣言し、nullで初期化
2:sbArr1は、sbyteは符号付きbyte型のポインタです。
sbArr1の配列を 'A','B','C',null で初期化
4:unsafeは、{}ブロック内でポインタを使用することを許可
6:fixdは、()内で宣言された変数がガベージ コレクタに
より再配置(メモリ上の移動)を防ぎます。
sbyte* pAsciiUpper = sbArr1 は
sbyte* pAsciiUpper =
&sbArr1[0] と等価です。
※この書き方は、C,C++と同じです。
8:StringコンストラクタにsbArr1を渡して、Textに文字列が代入されます。
12:sbArr2は、sbyteは符号付きbyte型のポインタです。
sbArr2の配列を
'a','b','c',null で初期化
14:unsafeは、{}ブロック内でポインタを使用することを許可
16:6行と同じ意味
18:StringコンストラクタにsbArr2、配列の開始文字位置、長さを渡して、Textに文字列が代入されます。
- バイト配列にUnicode以外の2バイト文字になっている場合、Encodingで指定することができます。
- .NETでは、Char型の文字コードはUnicodeです。
- ガベージ コレクタは、メモリを効率的に使用するため、不要になったオブジェクトを削除したり再配置するための機能です。アプリケーションでは、その処理がいつ行われるのかわかりません。
- ポインタとは、データが存在するメモリ上のアドレスを保持する変数です。もし、データが移動すると実際のアドレスと異なる場合が生じる可能性があります。そのため、アプリケーションでは、ガベージコレクタに対してfixedを宣言することで、再配置を抑止することで対処します。
- 2行目の 0x00(=null)は、文字列の最後を意味するC/C++系の基本的な実装です。
もし、nullが無ければ、…と思って、0x00を削除して警戒しながら実行すると、問題なく正常に動作しました。だったら、{ 0x41, 0x42, 0x43, 0x00, 0x61, 0x62, 0x63, 0x00 };だとどうなるのでしょうか?
予想はしていましたが、結果は "ABC"でした。つまり、配列要素の個数を対象に、nullが現れると終了するということです。途中にnullがなければ配列要素数分を変換します。
これはあくまでも実験結果に基づく仮説です・・・
万が一ですが「データの内容によっては暴走の可能性もある」と考えてプログラミングすべきです。できるだけ、トラブルのリスクを下げる努力をしましょう。C/C++では、暴走したり、データを壊す危険性があります。
Stringのコンストラクタは、高速化を図るためC++のネイティブコードで書かれているので、詳細はわかりません。