技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

C#3.0 が何気に良い意味で気持ち悪い(2回目)

C# の 3.0 について見ていこうと思う。
片っ端から列挙しようか。

暗黙的型付け

VBの人たち大喜び?
C++の人やJavaの人は悲鳴上げるだろうか?
代入時に型が固定される、暗黙的型付け機能搭載。

テストコード

var n = 1;
System.Console.WriteLine(n.GetType().ToString());

一度型が固定されたら、型変更は出来ないらしい。
この後 n に true 突っ込もうとしたら怒られたw

拡張メソッド

クラスメソッドを外側から拡張できるようになりました(笑
こういうPythonじみた機能とか結構好きだよ。

テストコード

namespace StringExtend
{
    static class Program
    {
        static void Main(string[] args)
        {
            string s = "string class ";
            System.Console.WriteLine(s.AddStr());
        }

        public static string AddStr(this string s)
        {
            return s + "拡張!";
        }
    }
}

オブジェクトデリゲート代入みたいなPythonまがいは出来ないものの、これはこれでよい。

Javaだかで、噂になってたAspect指向に近いことできそうな、、、、

ラムダ式

なんかいよいよ違う方向に進化か!?
関数型言語じみた機能追加。
(いいぞ〜もっとやれ〜w)
そのうちErlangあたりからグリーンスレッドでも実装するんじゃなかろうか?

先日のコードの、匿名デリゲート部分書き直し

executeSomething( s => s / 2 );

( ○口○)ポカーン
とする人多そうだ。
現場のコーディング規約で使用禁止とか食らわないだろうな?
個人的には面白くてよい。

イニシャライザ

オブジェクト初期化方法の亜種?

namespace test_initializer
{
    public class Point
    {
        int x, y;
        public Point()
        {
            x = 0;
            y = 0;
            System.Console.WriteLine("Call 1");
        }
        public Point(int x, int y)
        {
            /* 実際には呼び出されない */
            this.x = x;
            this.y = y;
            System.Console.WriteLine("Call 2");
        }
        public int X
        {
            get { return x; }
            set { x = value; }
        }
        public int Y
        {
            get { return y; }
            set { y = value; }
        }
    }
    static class Program
    {
        static void Main(string[] args)
        {
            Point p = new Point { X = 2, Y = 8 };
        }
    }
}

なんと、ジェネリック系コレクションも初期化出来るらしい。

Dictionary<string, int> dic = new Dictionary<string, int> { {"sample",1},{"code",2}};
System.Console.WriteLine(dic["code"]);

動いたヽ(゚∀゚)ノ
コレ結構美味しいかも知れませんね。
特にGenericに関しては恩恵大きいです。

匿名型

なんじゃらほい?
と思ってたのですが、コレ。

var x = new { Family="スプリングフィールド" , First="ネギ" };
System.Console.WriteLine(x.First +" = "+ x.Family);

変数ホルダ?
Xml 操作なんかでこんなのあると便利かもわからんね。

「==」ではどうも比較できないらしい。
同じ値を持った、同じ匿名型でFalseになりました。
「Equals( object )」で比較すると、Trueになったことを考えれば、
同じ要素を持つ匿名型は、同じ「型」であると認識するらしい。
が、演算子オーバーロードが定義出来ないため、比較には「Equals」メソッドを使うべし。

暗黙型付け配列

まぁなんのこっちゃない。

int[] array = new[] {1, 2, 3, 4};

これ、コーディング規約的に怒られそうだな、、、。

パーシャルメソッド

C# 2.0 でパーシャルクラス(クラス定義を複数に分割)が出来たわけですが、どうもメソッドでも出来るようになったらしいです。

namespace partial_test
{
    static partial class Program
    {
        static void Main(string[] args)
        {
            Call();
            System.Console.WriteLine("メイン");
        }

        static partial void Call();
    }

    static partial class Program
    {
        static partial void Call()
        {
            System.Console.WriteLine("パーシャルじゃぁあああ");
        }
    }
}

なんか、プロトタイプ宣言見てる気分だ。
尚、パーシャルメソッドは、privateで、尚且つ void 型でないと出来ないようだ。
(試してみたら怒られた。因みに非staticは可)

↑の記事振り返って

うん。気持ち悪い(良い意味で)。
面白い機能一杯あってホント好きだわぁ。

次はもっとキモいLONQいきますよー。