RSS

月別アーカイブ: 11月 2012

Yield と IEnumerable, IEnumerator

C#では yield return 文を使うと foreach 文の in 句に指定可能なレンジオブジェクトを作れます。Visual Basicでも Yield 文を使って同様のことができます。

C#では、IEnumerable インタフェースを実装したクラスのインスタンスが、in 句に指定可能なレンジオブジェクトになります。一方、Visual Basic では Iterator Function という関数がその代わりになります。この関数はIEnumerable(Of )を返す必要があります。

下のサンプルはC#で yield return を使うものですが、レンジオブジェクトになるクラス MyRange は IEnumerable を実装しています。IEnumerable は IEnumerator を返す GetEnumerator() メソッドを実装しなければなりません。このメソッドの中で、yield return を使って foreach 文で使われる項目を列挙します。

using System;
using System.Collections;

namespace Yield
{
  class MyRange : IEnumerable
  {
     object[] data;

     public MyRange()
     {
        data = new object[] { 100, "abc", -0.5, 0 };
     }
     public IEnumerator GetEnumerator()
     {
       int i = 0;
       while (i < data.Length)
       {
           i++;
           yield return data[i - 1];
       }
     }
  }
  class Program
  {
     static void Main(string[] args)
     {
        foreach (var x in new MyRange())
        {
            Console.WriteLine(x);
        }
#if DEBUG
        Console.ReadKey();
#endif
     }
   }
}

下のサンプルは Yield 文を使う Visual Basic の例です。C#ではIEnumerableインタフェースを実装したクラスを作成する必要がありましたが、Visual Basic では Iterator Function という関数を定義するだけです。
この関数は IEnumerable(Of ) 型を返し、その関数値は Yield文で列挙します。

' Yieldのテスト (Visual Basic)
Module Module1
Sub Main()
 For Each i In MyRange()
   Console.WriteLine(i)
 Next
 #If DEBUG Then
   Console.ReadKey()
 #End If
End Sub

Iterator Function MyRange() As IEnumerable(Of Integer)
   For i = 1 To 20 Step 3
     Yield i
   Next
End Function
End Module
広告
 
コメントする

投稿者: : 2012/11/30 投稿先 C#, VB

 

Visual Studio 2012 Express Desktop版がリリースされたので使ってみました。

Visual Studio 2012 Express Desktop版がリリースされたので使ってみました。

vs2012_desktop

当初、Visual Studio 2012 の Express版はWebアプリ用とWindows 8 アプリ用 (Metro用、現在のWindows Store App) しかなくて、もう一般のWindowsアプリは有料のProfessional版を買わないと開発できないのかと思っていました、

でも、コミュニティからの希望が多くDesktop版も公開されることになったそうです。もし、Desktop版が公開されなかったら、フリーソフトの作者などが一気にWindowsから離れていたかもしれません。
Windows 8 アプリ用では、コンソールアプリケーションさえも開発できないそうです。開発できるのは、あのタブレット対応のアプリのみ (Windows Store アプリ)だけだそうで、Windows 8を持っていて、かつタブレットでないとまともにテストもできないです。

このExpress Desktop版ですが、従来のVisual Studio 2010 Express版と違って、言語別に分かれておらず、1つでC#、Visual Basic、C++の開発が可能です。各言語で開発できるアプリはVisual Studio 2010 Express版とほぼ同じようですが、C++ではWin32のみで.Net Frameworkのアプリの開発には対応していません。

C#の新規プロジェクトメニュー

vs2012_desktop_cs

Visual Basicの新規プロジェクトメニュー

vs2012_desktop_vb

C++の新規プロジェクトメニュー

vs2012_desktop_vc

実際の使用感ですが、バージョンが進むごとに重くなっている感じでVisual Studio 2008と比べてかなり重い感じです。古いパソコンだとキー入力が重たくてストレスを感じます。.Net Framework 4.5 対応アプリを作る必要がないなら、前のバージョンを使ったほうが快適です。

 
コメントする

投稿者: : 2012/11/30 投稿先 未分類