simotin13's message

simotin13といいます。記事の内容でご質問やご意見がありましたらお気軽にコメントしてください\^o^/

C#の機能~勉強不足\(^o^)/~

とあるお客さん向けにwindowsのソフトを作っているのですがソースコードがだいぶ汚くなってきたので機能追加と合わせてリファクタリングをしています。

ソフトの実装にはC# を使っているのですが、最近すこしC#を勉強し直してみて、C#が素晴らしく進化していることを知りました。
というより自分の知識は .NetFramework2.0(Visual Studio2005)時代の知識で止まっていることに気づきました。

ここ数年仕事は組み込み系を中心にやっていたのでC#を使う機会というのは

組み込み機器との通信の対向ツールを書くとき

くらいしかC#でコードを書いてきませんでした。

現在リファクタリングしているお客様のソフトも、DBアクセス/ファイルアクセス/Officeソフトとの連携などが主な機能なので不勉強な自分の知識でも実装するのには十分事足りていました。

しかし、ソースコード量がそれなりに増えてきた結果、次第に機能追加・保守するのが辛くなってきました。

そんなある日、C#4.0は動的だ」みたいな噂を耳にしました。

Ruby好きな自分としては「動的」というキーワードには飛びつかずにいられません!

書店で適当に立ち読みしてみてこちらの本を買ってみました。

[完全版] C#実践ダイナミックプログラミング

[完全版] C#実践ダイナミックプログラミング

著者の川俣さんはC#関係の記事をかなり書かれていらっしゃるようです。
本書でもC#の色々な機能についてコードをベースに解説されています。


というわけでものすごく今更ですが、新たに理解したC#の機能ついて、私の心の叫びと一緒にまとめておきたいと思います。

■var ~型の推論~

var キーワードはC# 3.0(VisualStudio2008)で採用された機能です。
あぁこれだけでももっと早く知っておけばよかった。

    class Program
    {
        static void Main(string[] args)
        {
            var num = 12345;

            // → 12345
            Debug.WriteLine(num);        
        }
    }

なんてこったC#に型の推論があったなんて!どうかしてるぜ!


Rubyか!?Rubyにそそのかされたんだな!?


ちょっとモテるからってうちのC#2.0にちょっかい出すなんて断じて許さん。


なに違う!?


関数型だ!?あんなやつらに近寄っちゃいかん!


あんなのと関わって得するのは、本物のプログラマか意識高い系の大学生だけだ!


学者タイプで頭でっかちの素人童貞な奴らめ!


今までおれが「式の左辺に書いてきた型名」を何だと思っているんだ!


今すぐおれの書いたC#のコードの式の左辺を「var 変数名」に置換するか


慰謝料としてVisualStudio Ultimate版用意しろ!!!


LINQ ~クエリ演算子

C# 3.0時点で導入されていたこの機能についても知りませんでした。
あぁとても恥ずかしい。浦島太郎の気持ちがわかる...

    class Program
    {
        static void Main(string[] args)
        {
            int [] a = {1, 2, 3, 4, 5};

            var query = from n in a where n == 2 select n;

            Debug.WriteLine("found {0}", query.Count());

        }
    }

これがLINQを使って「配列の中に含まれる2の数」を数えるコードか。


おいおい、配列に対してSQLかよ。


古きよきfor文や、なんとなくかっこいいから使っていたforeachはどこへ行ったんだ!?


だいだい計算量としてはループ処理とどう違うんだ!?

※計算量についてはこちら
PLINQは黒歴史 - とあるソフトの開発記録
の方が
LINQデバッグに関しては川俣さんが記事
第7回 LINQ応用編(1/3) - @IT
を書かれています。

なるほど、そうか、そうか...


予想はしてたけどLINQ使うと計算量は増えて処理時間はforより遅くなるのかよ...


それにLINQだとちょっとデバッグし辛いのか...


まるで速度最適化をかけたCのコードみたいだ...


あやうく騙されるところだった。


可愛いふりして、おれに貢がせようったってそうはいかんぜ!


この、とんまなであばずれで漏れある抽象化め。


お前みたいな若いやつに貢いだ挙句に上司や客から


「処理時間の見積もり出せ!根拠示せ!」


「なんだこれ!?俺はこんな機能しらんぞ。こんなコード読めんから全部書き直せ」


とか言われて倒れていった男達をおれは沢山しってるんだ!

■引数の省略 ~デフォルト引数~

メソッドの引数の省略はC#4.0で導入された機能だそうです。
あのCOMのAPIの長い長い引数も省略できるんだろうか。。。

    class Program
    {
        static void hello(string name, string weather = "曇り")
        {
            Debug.WriteLine("はじめまして" + name + "さん。" + "今日は" + weather + "ですね!");
        }
        static void Main(string[] args)
        {
            // はじめまして宮崎さん。今日は晴れですね!
            hello("宮崎", "晴れ");

            // はじめまして宮崎さん。今日は曇りですね!
            hello("宮崎");
        }

いや知ってたし!
actionscript3.0でバリ使ってたし!

トルデフォなすうひきの奴っしょ!

マジ知ってたし!

へぇ~そうなんだ。


うんうん。

じゃあ「C#でもそろそろいっときますか」的な感じなんだ。

分かるよ~その気持ち。

■引数の省略 ~キーワード引数~

C#4.0 では引数の省略と合わせてRubyでいうキーワード引数もサポートされたようです。
メソッドの呼び出し側は引数の順番を意識することなくコードをかけます。

    class Program
    {
        static void hello(string name, string weather = "曇り")
        {
            Debug.WriteLine("はじめまして" + name + "さん。" + "今日は" + weather + "ですね!");
        }
        static void Main(string[] args)
        {
            // はじめまして山田さん。今日は大雨ですね! 
            hello( weather: "大雨", name: "山田");
        }
    }

またRubyか!?RubyC#2.0にちょっかいをだしたのか!?


Javascriptだと!?


順番を守ろうとしないのは、大阪のおばちゃんかLisp暴力団組員のどっちかだ。


社会の秩序を乱す礼儀知らずな奴らめ!


まぁいい。Lisp組の会長とは兄弟分の盃を交わしてるんだ。


今日のところはこれで納めようじゃねぇか。


というわけで自分が

C#=Java的なWindows用言語 => 楽勝楽勝!

と思い込んでる間にC#は4.0になっており非常に進化していました。


言語機能が非常に動的な方向に進んでいることはRuby好きな自分としてはうれしいです。

一概には言えませんが、

動的=コード量が減る

という式が成り立つと私は思っています。

C# もっともっと触っていきたいと思います!