C#言語を勉強(?)中に気になった点をまとめたものです。
ただし、C言語を知らない人には何の役にも立たないかもしれません。
文字列中のNULL文字
C#言語(というか.NET)では、文字列中にNULL文字(\x00)が入っても良いらしい。
つまり、
string s = "hoge\x00\x00";
s += "hoge";
とすると、string型変数sは、
"hoge\x00\x00hoge"
となる。
が、この文字列に対して、
Debug.Print(s);
とすると、NULL文字以降が無視され、
hoge
としか出力しない。
良いのか????
(Visual C# 2005 Express Edition)
文字列比較
Basic言語などの様に
if ( str1 == str2 )
として、同一の文字列か比較できる。
また、strcmpの様な、文字列の大小比較は、stringクラスのCompareメソッドや、CompareToメソッドを使う。
if ( str1.CompareTo(str2) )
if ( string.Compare(str1, str2) )
Compareメソッドは、staticメソッドなので、比較対象の文字列変数がnullであっても例外が発生しないところがJavaと比較したときの優位な点か。
なお、stricmpの様に、英大文字小文字を同一視した比較は、
if ( string.Compare(str1, str2, true) )
とすれば可能。
また、Compareメソッドは、カルチャ(いわゆる地域化のことでしょう)に対応した文字列の大小比較も出来るらしい。
memcpy
C言語で、char配列のmemcpyに相当する処理を行うには、System.BufferクラスのBlockCopyメソッドを使う。
BlockCopyメソッドはstaticメソッドなので、Bufferクラスのインスタンスを作成する必要は無い。
C言語では、ポインタを使ってメモリブロックの任意の位置を指し示す事が簡単に出来るが、C#言語では、一般的にはポインタを意識させない作りなので、メモリブロックのオフセット位置を指定させる。
使用例1
C言語: memcmp(dst, src, len);
C#言語: Buffer.BlockCopy(src, 0, dst, 0, len);
使用例2
C言語: memcmp(&dst[10], &src[20], len);
C#言語: Buffer.BlockCopy(src, 20, dst, 10, len);
など。