[C#] C言語との違い (データ型)

C#はclassを前提としたオブジェクト指向言語なので、そもそもC言語とは違うのだが、classの中に書かれる実行文はCや、良く知らないがたぶんC++と、似ているところが多い。
入門書を読んでいて、Cから見た差分的なところをまとめておく。
データ型
C#は、オブジェクトやstringなどのデータ型と、byteやintと言った基本的なデータ型の扱いが異なる。オブジェクトはreference typeと呼ばれてheapに積まれ、byteやintはvalue typeと呼ばれてstackに積まれる。
基本的なデータ(intrinsic type)には、
bool, byte, sbyte, short, ushort, int, uint, long, ulong, char, float, double, decimalがある。
byteが8bit、short,int, longの順に8bitずつ広くなり、longが64bit。sが付いているものは符号付き、uが付いているものは符号なしの意味だが、これらのデータ型はC#の中間コード仕様CLSに準拠ではないので移植性が落ちる
charは16bitのUnicode文字。
floatとdoubleは浮動小数点の数値で32bitと64bit。
decimalは96bitの符号付き数。
実際にはintやcharは、System.Int32やSystem.Charというstructとして定義されている。どちらの書き方でも同じ意味になる。
string
stringというclass(System.String)はreference typeなのでheapに積まれる。
classの演算として”==”や”!=”が定義されていて文字列比較ができる。(objectが同じものかどうかの比較ではなく再定義されている)
stringはimmutableで一旦値を決めたらそれを変更できないので、

string s = "Some String.";
s = "Another String.";

のようなことをすると、2つのobject(“Some String”と”Another String”)ができることになる。何かするたびに新しいobjectができていくので効率が悪い。あまり変わらないものを扱うのには向いている。
Cの文字列とは別のものと考えた方が納得がいくかもしれない。

広告
%d人のブロガーが「いいね」をつけました。