2015年05月24日

C#所感

いま関わっている仕事でC#を使ってる。この案件で初めてマトモにC#触って、割と言語の勉強と業務を並行してやってた。今度この案件から離れる事になったので、とりあえずC#の所感を書いておこうと思う。開発環境が Visual Studio 2008 だから、 C# 3.0 かな。去年の9月からだから、9ヶ月くらいの経験という事になるか。もっとも、その期間の半分以上は、何故か Visual Basic 6 を触ってた気がするが。


パーシャルクラス

C#の言語仕様として一番興味を惹かれたのがパーシャルクラス。これは、1つのクラスの定義を複数のファイルに分散できる仕組み。VSGUIデザイナが吐いたコードと、それで定義した各種GUIコンポーネントのイベントのコードを分離させる為に使われていたり、明らかにツールが自動生成したコードとユーザーが手で書くコードを分離する為の機能。言語仕様にツール連携の仕組みを入れるとか、IDE作ってる所らしいアイディアだと思う。

変数に対する「読み取り属性」の貧弱さ

個人的には、C#最大の欠点だと思う。ローカル変数とメソッドの引数に対して「読み取り専用属性」が付けられない。ので、少数の行数のコードを適切にメソッド分け出来る技量が無いと、アッという間に魔窟のようなコードが誕生する。チーム全員がそのレベルに達していれば良いんだけれど、残念な事に現実はそうとは限らない訳で。メソッドの引数は基本的に参照渡し(という言葉は正確でない気がするが)なので、ある変数の内容がメソッドの呼び出し前後で同じである事が保証されない。そのメソッドの役割的に不変の筈だと思えても、そうでないかもしれない。不具合対応の時に気をつけるべきコードが増えて閉口した。

もっとも、これはC#開発コミュニティも問題だと認識しているようなので、将来は解決されるんじゃないかなとは思う。

usingステートメント

usingで宣言したオブジェクトは、そのスコープを抜けた時に、オブジェクトが管理しているリソースが破棄される。詳しくはMSDNを参照

いや、分かる。そういう仕組みが必要な理由は分かる。でもガベコレ積んだ言語でこの仕様は正直キモイ。というか、ある型(の、オブジェクト)に対して、それがusingが必要か、そうでないか気をつける必要が在るという仕様は、あまり利口に思えない。型毎にデストラクタの実行タイミングを指定できるようにすれば良かったんじゃないだろか。スコープを抜けた時か、ガベコレに掃除された時か。

拡張メソッド

さながら、その型のメンバメソッドであるかのように、非メンバメソッドを呼び出せる。

C++の Extension Member Function イディオムっぽい。通常のメンバメソッド同様「.」演算子で呼び出せるので、より自然。だけどそれは一長一短で、例えば「obj.method();」というコードが在ったとして、果たして「method」は「obj」のメンバなのか、そうでないのか判別付きにくい。「method」の内容を読もうと「obj」のクラスの定義を見に行ったら、そこには無かった、という若干イラッとさせられる場面に何度か遭遇した。Enumerableインターフェイスの拡張メソッドを考えると、有用なのは確かなんだけど……まぁ、IDEの機能で探せ、という事なのかもしれない。

LINQとEnumerable

C#というより .NET Framework の範疇だけど。

LINQ良いよね。Enumerableの拡張メソッドも良いよね。でも共存してるのは微妙。同じ用途で使えて、同じキーワードが割り振られてて、でも微妙に書き方が異なる、ってのがどうも。

あと、こいつらは、どうも遅延評価する事になってるらしくて、VSのデバッガでステップ実行してたら想定外の場所に飛んでビックリなんて事が何度か。

いや瑣末な点なんだけど、ね。


総合的には、良い言語だと思う。上で述べたように幾つか気になる点が在って、特に変数の読み取り属性の欠落がキツイと感じるけど。 .NET Framework のMac/Linux展開も加速しそうだし、今後が楽しみな言語かなと。

続きを読む
ラベル:C#
posted by 天井冴太 at 21:09| Comment(0) | TrackBack(0) | Study | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。