レベルエンター山本大のブログ

面白いプログラミング教育を若い人たちに

BLOCKVROCKリファレンス目次はこちら

C# 3.0の新しい言語仕様

C#2.0と比較したときのC#3.0の新しい言語仕様を紹介します。
引用元:http://www.codepost.org/view/126

動的型付け言語の影響を強く受けた仕様だという印象があります。(MSらしいなぁ)

「var」キーワード

VB6.0以前のVariant型に似たものでしょう。「何でも型」です。

// C# 2.0 behavior
int i = 10;
string s = "Hello codepost visitors!";

// New C# 3.0 var type
var i = 5;
var s = "Hello again!";

ただ、このvarは宣言時に初期化構文で初期化してやらないと型が決められないので、
以下のような記述の仕方だと動かないようです。

// Will not work, 'cause the right-hand side of the var is unknown
var b;
b = 1337;

オブジェクトイニシャライザー

C# 3.0では次のようなオブジェクト初期化方法をサポートしています。

// The "old"/regular way
Person p = new Person(); // Create object
p.Name = "Niek"; // Initialize property Name
p.Gender = "Male"; // Initialize property Gender
p.Active = true; // Initialize property Active

// New way
Person p = new Person { Name = "Niek", Gender = "Male", Active = true };

1行で済みますね。

匿名型(Anonymous types)

C#3.0では匿名型というのを新たにサポートしました。varキーワードと組み合わせるとクラスを作らずに動的に型を定義出来ます。

var o = new { Name = "Niek", Gender = "Male", Active = true };

コンパイラは、匿名クラスを作ります。このクラスでは3つのプライベート属性と、3つのパブリックなプロパティーが作られます。
DTOなんかに使うと便利だって言ってます。

メソッド拡張(Extension methods)

クラス(基本クラスを含む)にメソッドを追加することが出来るようです。
たとえば、以下のコードはStringクラスにToMD5()メソッドを追加しています。
このクラスが定義されたネームスペースがインポートされるとStringが拡張されます。

public static class StringExtensions
{
    public static string ToMD5(this string s)
    {
        System.Security.Cryptography.MD5 md5;
        md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
        byte[] result = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(s));
        // Return the result, replace unneeded "-"
        return System.BitConverter.ToString(result).Replace("-", string.Empty); 
    }
}

コンパイルするとStringオブジェクトがToMD5()メソッドを持つようになります。
このnamespaceで使うString型の「インスタンス」でインスタンスメソッドのように利用することが出来ます。

string s = "Hello, this string is gonna be MD5-ed!";
Console.WriteLine(s.ToMD5()); // Prints the MD5 hash 


この機能は結構微妙で、コードの可読性としては非常に悪くなります。
JavaScriptで実現されているインスタンスへの動的なメソッド追加に似たものですが、
乱用しないように警告がされているそうです。