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 + "拡張!"; } } }
ラムダ式
なんかいよいよ違う方向に進化か!?
関数型言語じみた機能追加。
(いいぞ〜もっとやれ〜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は可)