今日も元気に真人間

好き: 中日 、アニソン 、中本 、IT 、乃木坂46(乃木坂って、どこ?、乃木坂工事中)

独習C#メモ

最近読み始めたのだが、電子書籍で付箋つけまくってたらキリがないのでここにメモ。

 

 

■941:逐語的識別子

識別子の先頭に@を付けると予約語との競合を避けることができる。@を含まない識別子と同様に解釈される。

 

■1310:逐語的文字列リテラル、変数展開

例えばファイルパスをコピペして文字列に代入するとき、そのまま貼るとエスケープ関連で面倒なことになる。

通常の文字列は""で囲むが、@""で囲むことで、エスケープシーケンスなしでバックスラッシュや改行などを表現できる。"は""で表現。

また、文字列の中に変数を埋め込む場合は、+で連結してもよいが、$""で囲って{変数名}とすれば展開される。

この場合{や}を表現する場合には{{や}}とする。

なお、この2つを組み合わせる場合には、$@""で囲む。

 

■1523:null条件演算子

変数がnullでない場合のみフィールドやメソッドにアクセスしたい場合、

str?.Trim()

のように「?.」を追加することでできる。

個人的には分かりにくさの元な気もするので、複数人での開発では避けたい気がする。

 

■1817:文字列連結のオーバーヘッド

String型は+で連結できるが、String型は変数の値を変更できないので、実際にはその都度オブジェクトを生成している。そのため、

String c = a + b;

のような処理では、a, b, cと同等なオブジェクトの計3つが生成されている。

ちょっとした処理であれば気にならない程度だが、大量にループする場合には避けた方がよい。その場合は、StringBulderクラスのインスタンスを生成し(サイズが分かっている場合には、コンストラクタの引数に整数を指定することで、文字列のサイズを指定できる)、Append()メソッドで連結して、ToString()メソッドでString型に変換するのがよい。

 

■2027:配列の比較

配列の中身が等しいかどうかを比較する場合には、EnumerableクラスのSequenceEqual()メソッドで比較。

恐らく内部では各要素に対して「==」で比較していると思われる(C#ではString型の==はオーバーライドされていて等価ではなく等値の比較になっており、Javaなどとは挙動が異なる)。Equal()で比較したい場合など要調査。

 

■2520:型によるswitch文

switch文では、変数の値で振り分ける他に、変数の型での振り分けが可能。

case (変数の型) (仮の変数名):

で振り分けられる。

なお、C#ではswitch文にbreakは必須で、複数caseの内容を実行することは不可能。