Madoka Chomado
You Are Reading

C# 6.0 の新機能

0

この記事の要点:C# 6.0 の新機能を使って、コードを今までよりカッコ良く書きましょう!
コード量が減るし、見やすくなり、ミスも減ることと思います!(C# 6.0 は VisualStudio 2015 で 動かせます。)
私のイチオシはNull条件演算子です!(((o(*゚▽゚*)o)))

導入

今更ですが, C# 6.0 の新機能について書こうと思います.

C# 6.0 は 「.NET Compiler Platform」(コード名:”Roslyn”)と呼ばれる新しいコンパイラー (以前のコンパイラと比べて, リファクタリングやIDE, スクリプティングなどへの利用が可能なAPIが公開されており, コンパイラ以外への様々な応用が可能) が導入されており,

さらにそれがオープンソースとしてリリース (GitHub上で公開) されるなど,

言語自体の更新よりも, 同時に発表された Roslyn についてのほうが 注目を浴びているような気がするのですが,

この記事では (Roslyn のことは触れず) 言語機能についてのみ書きます.

OverView

  • 言語機能については, あまり大きな新機能は無い.
  • コード量が削減される, コードが書きやすくなる, というか, 「今までこう書かなきゃいけなかったけど, これからはこう書けるよ」みたいな, シンタックスシュガー的なものの追加が多い.

features

  1. Null条件演算子 (Null-conditional operators)
  2. 文字列補間(String interpolation)
  3. ラムダ式によるプロパティの記述(Expression-bodied properties)
  4. using static

他にもありますが、とりあえずこの4つを書きます。

Null条件演算子 (Null-conditional operators)

これね!!!!
これ今回の新機能の中で一番感動したやつ!!!
既存のコードリファクタリング不可避ですよ!!!

例えば、
こういう Personクラスがあったとします。
(名前、年齢、好きな言語、というプロパティ(フィールド)を持ちます。)

using static System.Diagnostics.Debug; // さりげなくこの 'using static' も新機能の1つです

namespace sandbox
{
    class Program
    {
        // 人間クラス
        class Person
        {
            public string Name; // 名前
            public int Age;     // 年齢
            public Language FavoriteLang; // 好きな言語
        }
        // 言語リスト
        enum Language { None, CSharp, C, Ruby, CPP, Lisp, Java, JavaScript, };

        static void Main(string[] args)
        {
            // Personクラス使用例
            var me = new Person
            {
                Name = "Madoka",
                Age = 24,
                FavoriteLang = Language.CSharp,
            };

            WriteLine(me.FavoriteLang); // CSharp
        }
    }
}

今まで:

if (person != null) // nullチェック
{
    WriteLine(person.FavoriteLang);
}
else
{
    WriteLine(Language.None);
}

これから:

WriteLine(person?.FavoriteLang ?? Language.None);

すごい!
1行になりました!

ここで大切なのは「?.」という「Null条件演算子」です!

Null条件演算子は、、?.の前がnullであればnullを返し、nullでなければ後続の処理結果を返します。

他の例

int countWithDefault = persons?.Count() ?? 0;

int? length = customers?.Length; // null if customers is null 
Customer first = customers?[0];  // null if customers is null

int? first = customers?[0].Orders.Count(); // if customers is null, the result is null

めっちゃ感動!

String interpolation(文字列補間)

まず、

var first = "まどか";
var last = "ちょまど";

という変数が用意されてあったとして,
『私の名前は ちょまど まどか です』
という文字列を返したい場合.

今まで

String.Format メソッドを使ってきました.

// returns "私の名前は ちょまど まどか です。"
string PrintMyName()
{
	return String.Format(
            "私の名前は {0} {1} です。"
            , last
            , first
    );
}

この {0} とか {1} とかの インデックス (numbered placeholders) が, 間違いの原因になってきました.
(この例では たった 2つですけど, これが 10個とか 20個とかになってくると, わけが わからなくなる)

C# 6.0 から

$ (ドル)文字から始まります.

string PrintMyName()
{
	// 文字列補間の機能(String interpolation)
	return $"私の名前は {last} {first} です。"; 
}

スクリプト系の言語では割とよくある, 文字列内での式展開です.

さらにこれを ラムダ式で 1行で書くこともできます. (後述)(新機能)

// ラムダ式によるメソッド本体記述(Expression-bodied method)
string PrintMyName() => $"私の名前は {last} {first} です。";

一応丸コピペで動くやつを載せておきます。

using static System.Diagnostics.Debug;

namespace Sandbox
{
    class Program
    {
        const string first = "まどか";
        const string last = "ちょまど";

        static void Main(string[] args)
        {
            WriteLine(PrintMyName3());
        }

        // returns "私の名前は ちょまど まどか です。"
        static string PrintMyName()
        {
            return String.Format(
                      "私の名前は {0} {1} です。"
                      , last
                      , first
              );
        }

    // 文字列補間の機能(String interpolation)
        static string PrintMyName2()
        {
            return $"私の名前は {last} {first} です。";
        }

        // ラムダ式によるメソッド本体記述(Expression-bodied method)
        static string PrintMyName3() => $"私の名前は {last} {first} です。";
    }
}

他の例

using String.Format:

var s = String.Format("{0} is {1} year{{s}} old", p.Name, p.Age);
// ({{}} と { を重ねて記述しているのは, エスケープの意.)

String interpolation:

var s = "\{p.Name} is \{p.Age} year{s} old";

こんなこともできる:

// optional alignment and format specifiers can be given
var s = "\{p.Name,20} is \{p.Age:D3} year{s} old";

// The contents of the holes can be pretty much any expression, 
// including even other strings:
var s = "\{p.Name} is \{p.Age} year\{(p.Age == 1 ? "" : "s")} old";

べんりですね!

ラムダ式によるプロパティの記述(Expression-bodied properties)

ラムダ式によるプロパティの記述について。

今まで:

public double Dist
{
	get { return Math.Sqrt(X * X + Y * Y); }
}

これから:

// ラムダ式によるプロパティの記述(Expression-bodied properties)
public double Dist => Math.Sqrt(X * X + Y * Y);

using static

staticメソッドを使う際に、そのメソッドが所属するクラスを(usingディレクティブではなく)using staticディレクティブを使って定義すると、クラス名を指定せず、メソッドのみを記述できるようになりました。

上に書いたサンプルコードでもたびたび出てきていますが、
例えば、
私は、Debug 実行中に Debug コンソールに出力してくれる
System.Diagnostics.Debug.WriteLine(“出力”);
という関数が好きなのですが、

今まで:

using static System.Diagnostics;
// ...(略)
Debug.WriteLine("test");

これから:

using static System.Diagnostics.Debug;
// ...(略)
WriteLine("test");

と、書くことができます!

参考記事


Tags:

Madoka Chomado (ちょまど)

千代田まどかです。よくちょまどと呼ばれます。Microsoft 社員。文系出身プログラマ兼マンガ家です。私の書いた記事一覧がこちらです

(2) Comments

  1. Tomoaki Goto says:

    Dear Ms. Chiyoda Madoka

    It is my pleasure to write a comment first time to your blog.
    I am Tomoaki Goto, an entry-level programmer. I accidentally have found your blog and have known that you are an outstanding programmer, and genuine artist.
    I have gotten really interested in C# and Haskell by your blog, and would to start learning them.
    I am also really impressed by reading your article on the problem of “Hand-taking of Screenshots and Hand-copying and Hand-Pasting them on Excel Sheets” in the Japanese IT companies because I am also one of those “copying and pasting workers”.
    I am now learning Selenium 2nd to be a specialist for automatizing those painstaking tasks.

    Finally, I hope that your career in Microsoft be always blissful and exciting for you.

    Sincerely yours,
    Tomoaki Goto

    1. Thank you so much and sorry that my reply got late. I’m so glad that I found my blog article encouraged someone. I hope you enjoy your engineering work now

コメントを残す

メールアドレスが公開されることはありません。