ブログ@kaorun55

HoloLensやKinectなどのDepthセンサーを中心に書いています。

C++ と C# を比べて・その1

ここ1,2カ月で C#C++/CLI での開発の機会があり、やっと C#C++/CLI をそれなりに使えるようになった。
慣れてきたところで自分なりの C++C# の違いが見えてきた。
まずは C#C++ と比べて残念なところ。
#まぁ、独断と偏見なので悪しからず。

C# は型変換がめんどう? X(

C# を使ってて一番めんどくさかったのが、通信とかでパケットをバイト列に直す処理。
いちいち BitConverter やら Converter でバイト列とクラス属性を変換せないかん。


C++ なら構造体をポインタで流し込めばいいだけなのでめんどくさい。

C# は型の制約が厳しい? X(

型変換の話にもなるけど、C# では byte から sbyte とか変換ができない??
C++ で単純にポインタのキャストでできることができない。
C# でポインタを使うと unsafe になるんだっけ?これはなんかいやだ。

C#インスタンスの生存範囲が見えづらい? X(

C#GC があるので、インスタンスの破棄は GC まかせ。


なので、スコープを抜けてもすぐに破棄されるとは限らず、インスタンスは残ったままのことが多い。
C++ の感覚でファイルやらポートやらをスコープが抜けた瞬間に Close とかが普通にできず、using で囲わないといかんのでめんどくさい。


その using も IDispose を継承していないといかんので、その制約がなんとも。

C# で多重継承ができないのが・・・ X(

たまに mixin とかで使いたくなる多重継承ができない。
interface に拡張メソッドでそれっぽくはできるみたいだけどそれはちょっと。。。


せめて「ひし形継承ができない」くらいにしてくれれば。。。

typedef がない・・・ X(

どうでもいいっちゃどうでもいいけど、ジェネリックをサポートするなら typedef みたいなのもサポートしてくれないと、型名が長くなっちゃう。。。
using よる別名もスコープがファイルなのでいまいちだし。

似て非なる機能が多い・・・ X(

違いを覚えて使い分ければいいだけだけど。。。

  • キャストと is(例外と null )(例外と 真偽値 )
  • キャストと as(例外と null )
  • const と readonly(定数と変数)

キャスト多すぎ・・・ X(

ジェネリックがない時の名残か、コンテナが object を格納するので、キャストが多い。
VSTOExcel とかいじってるとキャストの嵐。。。
こんなとき as とか is とか使うと、ソースがきれいに見えた:)

とりあえず

今思いつくのはこんなもんか。