C#2.0/文字列操作

C#2.0/文字列操作

文字列リテラル

ダブルクォートでくくる

String hoge = "ほげ";

リテラル中のエスケープ

記号 エスケープ後
\” ダブルクォート 通常の““で挟んだ時
”“ ダブルクォート @”“で挟むヒアドキュメントのときは”“で重ねる

ヒアドキュメント

アットマーク改行に続いて書けば複数行の文字列リテラルが作れる

String hoge = @"
なにか
なにか
なにか
";

文字列の結合

+ で結合できる

String hoge = "aaa" + "bbb";

プレースホルダを使う

変数を後入れする方法

String piyo = "ぴよぴよ"
String hoge = "ほげ" + piyo + "ほげ";

こうじゃなくて、こうできる

String piyo = "ぴよぴよ"
String hoge = String.Format("ほげ{0}ほげ{1}", piyo, piyo);
// hoge は 「ほげぴよぴよほげぴよぴよ」

整数型へ変換する

int hoge = int.Parse("123");

一致の判定

こうだな

String hoge = "ほげ";
if(String.Equals(hoge, "ほげ")){
    //一致ならここ
}

== 演算子で比較可能・・・な感じがするが・・・ 可能

String hoge = "ほげ";
if(hoge == "ほげ"){
    //一致ならここ
}

っで・・・Javaみたいな

String hoge = "ほげ";
if(hoge.Equals("ほげ")){
    //一致ならここ
}

こいつもたしかに一致するんだな これはイミュータブル(変更不可能)オブジェクトでよくある実装手法。

同じオブジェクトの集まりをあらかじめ保持しておく、これをインターンプールとか言う。 同じ内容のオブジェクトがnewされたらその保持しているオブジェクトのポインタを割り当てるということを裏でやる。デザインパターンで言うとフライウェイトパターンかな。これでnewするコストが下がる

なので同じ文字列ならば、同じポインタが割り当てられている可能性が高くなるのでこの比較でも一致する

リテラルではなく、new演算子で作られたオブジェクトはプールにはいらないらしく hoge.Equals の比較ではミスる。つまりコンパイル時の最適化で判定しているのであって、実行時の仕組みではないということ

他にもいくつか入らないパターンがあるようなので == で比較しておいたほうが安全

↓ここにも似たようなことが書いてあった。 C# では文字列の比較に Equals を使うな

正規表現

これはほぼ.NET Frameworkに依存するので正規表現と同じです。

参考サイト

タグ

csharp/csharp20/string_ope.txt · 最終更新: 2017-09-26 18:59 by ore