マイクロソフト株式会社

セッション ID:T6-309
詳説!
Visual Basic 10, C# 4.0 の新機能
~Visual Studio 2010 で進化したコーディング環境~
マイクロソフト株式会社
デベロッパー&プラットフォーム統括本部
エバンジェリスト
新村 剛史
セッションの目的とゴール
Session Objectives and Takeaways
セッションの目的
Visual Basic 10、C# 4.0 の新機能を
理解していただく。
Visual Studio 2010 のコーディング機能を
理解していただく。
セッションのゴール
Visual Studio 2010 で Visual Basic 10、
C# 4.0 の新機能を活用した開発が可能になる。
3
アジェンダ
開発言語の今とこれまで
歴史と流れ
開発言語の新機能
C#
Visual Basic
共通項目
Visual Studio 2010 エディター新機能
コードを読む
コードを書く / 編集する
デバッグする
まとめ
4
開発言語の今とこれまで
• 開発言語の歴史
開発言語の歴史
1950
1960
1970
1980
1990
2010
VB.NET
Visual
Basic
MSBasic
2000
Basic
C#
C++
Fortran
C
Java
ALGOL
Lisp
Ruby
Small
talk
F#
Python
PHP
COBOL
Perl
6
C# と Visual Basic の歩み寄り
C# 4.0
C# 3.0
C# 2.0
C# 1.0
LINQ
ジェネリクス
.NET への対応
VB 9
VB 8
VB 7
VB4VB6
VB1VB3
7
VB 10
コンポーネント対応
Windows 開発の簡素化
開発言語の新機能
• C#
• Visual Basic
• 共通項目
C# と VB の新機能比較
C#
VB
オプション引数・名前付き引数
遅延バインド
簡易な COM 相互運用
自動実装プロパティ
コレクション初期化子
複数行のラムダ式
動的言語のサポート
共変性と反変性
コード コントラクト
既存機能
9
一部既存機能
新機能
C# の新機能
C#
VB
オプション引数・名前付き引数
遅延バインド
簡易な COM 相互運用
自動実装プロパティ
コレクション初期化子
複数行のラムダ式
動的言語のサポート
共変性と反変性
コード コントラクト
既存機能
10
一部既存機能
新機能
オプション引数・名前付き引数
呼び出し時に
引数を省略可能
順序入れ替え可能
// メソッドの宣言
void Method1(string a, string b = "b", string c = "c")
// メソッドの呼び出し
Method1("a", "d", "e");
Method1("a");
Method1("a", c: "e");
Method1("a", c: "e", b: "d");
11
//
//
//
//
通常呼出し
引数省略
名前指定呼び出し
順序変更
実装の仕組み
コンパイラの機能として実現
void Method1(string a, string b = "b", string c = "c")
void Method1(
string a,
[Optional, DefaultParameterValue("b")] string b,
[Optional, DefaultParameterValue("c")] string c)
呼び出し側は常に展開される
Method1("a");
Method1("a", "b", "c");
12
オプション引数のルール
通常系
オプション引数は普通の引数より後ろ
void Method1(string a, string b = "b", string c = "c")
コンパイルエラー
void Method1(string a, string b = "b", string c)
可変個のパラメーター
オプション引数の後ろに追加可能
void Method1(string a, string b = "b", params string[] c)
13
メソッド呼び出しの解決順序
こんな呼び出しをした場合
Method1("a");
解決順序
14
1
void Method1(string a){}
2
void Method1(string a, string b = "b"){}
3
void Method1(string a, params string[] b){}
遅延バインディング
dynamic キーワード
DLR を経由して実行時に型確定、実行
dynamic obj = ObjectFactory.GetSomeObject();
obj.Method();
静的型チェックをバイパス
インスタンス生成
メソッド実行
15
Object 型
として機能
Binder
注:Visual Basic の遅延バインディングも DLR を経由
する方式に変更されている
dynamic 型への操作による型変換
dynamic 型
dynamic 型に対する操作
固有型
dynamic 型を引数とするコンストラクター
固有型への代入
16
遅延バインディングの利用例
型としては異なっていても
同様の機能を利用
A.Method1();
A.Method2();
アセンブリ A (Ver. 1.0)
Class A
 Method1()
 Method2()
アセンブリ A (Ver. 2.0)
Class A
 Method1()
 Method2()
 Method3()
17
COM 相互運用 (Before)
遅延バインディング
Type type = Type.GetTypeFromProgID("Excel.Application");
object excelApp = Activator.CreateInstance(type);
object workBooks = excelApp.GetType().InvokeMember("Workbooks",
BindingFlags.GetProperty, null, excelApp, null);
workBooks.GetType().InvokeMember("Add",
BindingFlags.InvokeMethod, null, workBooks, null);
excelApp.GetType().InvokeMember("Visible",
BindingFlags.SetProperty, null, excelApp, new object[] {true});
煩雑な引数
excelApp.get_Range("A1", "B4").AutoFormat(myFormat,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing);
18
COM 相互運用 (After)
遅延バインディング (dynamic)
dynamic excelApp = new Application();
excelApp.Workbooks.Add();
excelApp.Visible = true;
オプション引数
excelApp.Range["A1", "B4"].AutoFormat(Format: myFormat);
19
VB の新機能
C#
VB
オプション引数・名前付き引数
遅延バインド
簡易な COM 相互運用
自動実装プロパティ
コレクション初期化子
複数行のラムダ式
動的言語のサポート
共変性と反変性
コード コントラクト
既存機能
20
一部既存機能
新機能
自動実装プロパティ
Public Property Name As String
暗黙的に生成
Private _Name As String
バッキング フィールド
ウォッチ式、デバッグ ツール、クラス内で
使用可能
IntelliSense では非表示
自動実装プロパティの展開
空白行:”G” + [Enter] or “S” + [Enter]
21
コレクション初期化子
From キーワード
Dim items As New List(Of String) From {"Foo", "Bar"}
内部的には Add メソッドが呼ばれる
Dim items As New List(Of String)
items.Add("Foo")
items.Add("Bar")
22
オブジェクト初期化子との組合せ
要素にオブジェクト初期化子を利用
Public Items As New List(Of Sample1) From {
New Sample1 With {.Foo = "Foo", .Bar = "Bar"},
New Sample1 With {.Foo = "Foo1", .Bar = "Bar1"}}
コレクション自体の初期化では組合せ不可
Dim days = New List(Of String) With {.Capacity = 7} From
{"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"}
23
暗黙の行連結
“_” なしの改行が可能
ただし、どこでも良いわけではない
Sub Go(
ByVal x As Integer,
ByVal y As Integer,
ByVal z As Integer
)
Dim query =
From n In {123, 456, 789}
Order By n
Select n +
x
End Sub
24
改行可能な条件は
Appendix をご確認
ください。
複数行のラムダ式とサブルーチン
複数行のラムダ式
複雑なラムダ式の記述が可能に
' 単一行
Dim increment1 = Function(x) x + 1
' 複数行
Dim increment2 = Function(x)
Return x + 2
End Function
ラムダ式によるサブルーチン
Dim writeline1 = Sub(x) Console.WriteLine(x)
Dim writeline2 = Sub(x)
Console.WriteLine(x)
End Sub
25
ラムダ式における戻り値の型解決
Dim typeDef1 = Function(x) x + 1 '型推論
Dim typeDef2 = Function(x) As Long '型指定
Return x + 1
End Function
Dim typeDef3 = Function(x)
If (x >= 0) Then
Return Integer.Parse(x)
Else
Return Double.Parse(x)
End If
End Function
'全ての型に拡大変換可能な型に型推論 この例は Double
26
[参考]ラムダ式とは
式とステートメントを含めることができる
匿名関数
デリゲート型
デリゲートの匿名メソッドを簡易な表記で実現
式ツリー型
式を木構造で表す。コンパイラはコードを出力。
実行時にコンパイル。(LINQ の遅延実行)
.NET Framework 4 から割り当て式、
制御フロー式を扱う API が追加に。
27
[参考]式ツリー
+
.NET Framework 3.5 まで
x
1
Function(x) x + 1
.NET Framework 4 から
Function(x)
For i = 1 To 10
x += i
Next
Return x
End Function
Function
For
=
i
Return
<=
1
i
{}
10
+=
x
28
x
i
注:上記式ツリーはイメージです。実際に生成されるツリーとは異なります。
C# と VB の新機能
C#
VB
オプション引数・名前付き引数
遅延バインド
簡易な COM 相互運用
自動実装プロパティ
コレクション初期化子
複数行のラムダ式
動的言語のサポート
共変性と反変性
コード コントラクト
既存機能
29
一部既存機能
新機能
動的言語のサポート (DLR)
IronRuby
IronPython
C#
VB.NET
Others …
Dynamic Language Runtime
動的オブジェクト
の相互運用性
式ツリー
Object
Binder
30
JavaScript
Binder
Python
Binder
呼び出し元
のキャッシュ
Ruby
Binder
COM
Binder
DLR の仕組み
式ツリーによって構文を抽象化
コンパイルされた式ツリーはCallSiteに
キャッシュされる
Dynamic Language Runtime
動的オブジェクト
の相互運用性
Function A
For
=
i
Return
<=
1
i
{}
10
式ツリー
31
x
+=
x
i
コンパイル
呼び出し元
のキャッシュ
CLR
共変性と反変性
インターフェイスにおける型システムの
柔軟性を実現
汎用デリゲート
ジェネリック インターフェイス
派
基 インターフェイス 生
底
戻り値の型
派
生
32
実体
基
底
引数の型
共変性と反変性 (デリゲート)
delegate object BaseMethod(string x);
// 共変性
public static string Method1(string x) {
return x;
}
BaseMethod baseMethod1 = Method1;
//反変性
public static object Method2(object x) {
return x.ToString();
}
BaseMethod baseMethod2 = Method2;
C# 2.0 で実現されていました
33
共変性と反変性 (デリゲート)
Delegate Function BaseMethod(ByVal x As String) As Object
'共変性
Public Shared Function DeliMeth1(ByVal x As String) As String
Return x
End Function
Dim baseMethod1 As BaseMethod = AddressOf DeliMeth1
'反変性
Public Shared Function DeliMeth2(ByVal x As Object) As Object
Return x
End Function
Dim baseMethod2 As BaseMethod = AddressOf DeliMeth2
34
共変性と反変性
(ジェネリック インターフェイス)
共変性:out キーワード
反変性:in キーワード
C#
// 共変性の定義の例
public interface IEnumerable<out T> : IEnumerable
// 反変性の定義の例
public interface IComparable<in T>
VB
‘ 共変性の定義の例
Public Interface IEnumerable(Of Out T)
Inherits IEnumerable
‘ 反変性の定義の例
Public Interface IComparable(Of In T)
35
共変性と反変性 (ジェネリック)
// 共変性
IEnumerable<String> strings = new List<String>();
IEnumerable<Object> objects = strings;
// 反変性
IComparable<string> strCompare = new ObjCompare();
class ObjCompare : IComparable<object>
{
public int CompareTo(object other){…}
}
strCompare.CompareTo("TechEd Japan");
36
共変性と反変性 (ジェネリック)
‘ 共変性
Dim strings As IEnumerable(Of String) = New List(Of String)
Dim objects As IEnumerable(Of Object) = strings
‘ 反変性
Dim strCompare As IComparable(Of String) = New ObjCompar()
Class ObjCompar
Implements IComparable(Of Object)
Public Function CompareTo(ByVal other As Object) As Integer
・・・・
End Function
End Class
strCompare.CompareTo("TechEd Japan")
37
Code Contract
契約による設計 (Design by Contract)
バートランド メイヤー
契約によりオブジェクトのインターフェイス
を厳密に定義しコードに記述
コードが必要とする条件 (事前条件)
コードが保証する内容 (事後条件)
常に満たされるべき条件 (不変表明)
注:デフォルトの状態ではほとんどの Contract ステートメント
は IL には情報として含まれません。
38
事前条件
メソッド開始前の状態をチェック
C#
public string Method1(string name){
Contract.Requires(!String.IsNullOrEmpty(name));
Contract.Requires<ArgumentException>
(name.Length < 128, "Too long string");
こちらは IL に組み込まれる
VB
Public Function Method1(ByVal name As String) As String
Contract.Requires(Not String.IsNullOrEmpty(name))
Contract.Requires(Of ArgumentException)
(name.Length < 128, "Too long string")
こちらは IL に組み込まれる
39
事前条件 (移行)
既存の引数チェックを Contract 化
C#
public void Method2(string name){
if (String.IsNullOrEmpty(name))
throw new ArgumentException();
Contract.EndContractBlock();
VB
Public Sub Meshotd2(ByVal name As String)
If (String.IsNullOrEmpty(name)) Then
Throw New ArgumentException()
End If
Contract.EndContractBlock()
40
Contract 化しても既存のコードは IL 上にも反映されます。
事後条件
メソッド実行後の状態をチェック
C#
正常終了時:Ensures
例外終了時:EnsuresOnThrow
Contract.Ensures(Contract.OldValue<int>
(this.list.Count) == this.list.Count -1);
Contract.EnsuresOnThrow<Exception>
(this.list.Count != 0);
VB
Contract.Ensures(
Contract.OldValue(Of Int32)(Me.list.Count) =
Me.list.Count - 1)
Contract.EnsuresOnThrow(Of Exception)(
Me.list.Count <> 0)
41
不変条件
C#
全てのクラスに対する処理時に状態を
チェック
[ContractInvariantMethod]
protected void InvaliantMethod()
{
Contract.Invariant(list != null);
}
VB
<ContractInvariantMethod()>
Protected Sub InvaliantMethod()
Contract.Invariant(Me.greetings IsNot Nothing)
End Sub
42
ツールによる検証、実行時検証
ツールによる解析、実行時検証 (アドオン)
43
http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx
[参考] Contract の記述順序のルール
If-then-throw
statements
Requires
Ensures
EnsuresOnThrow
Ensures
EnsuresOnThrow
下位互換性のあるパブリックな事前条件。
すべてのパブリックな事前条件。
すべてのパブリックな (標準の) 事後条件。
すべてのパブリックな例外の事後条件。
すべてのプライベートな/内部の (標準の) 事後条件。
すべてのプライベートな/内部の例外の事後条件。
if-then-throw の事前条件を他のコントラクトなしで
使用する場合は、EndContractBlock を呼び出して、
EndContractBlock
前の if チェックがすべて事前条件であることを
示します。
44
Visual Studio 2010
エディター新機能
• コードを読む
• コードを書く / 編集する
• デバッグする
強化された検索機能
マッチング
キーワード一致
キャメル表記の頭文字
46
参照の強調表示
ドキュメント内のシンボルのインスタンス
を強調表示
VB では加えて
If...Then...Else ステートメント
Select...Case ステートメント
Do...Loop ステートメント
For...Next ステートメント
For Each...Next ステートメント
Try...Catch...Finally ステートメント
Class ステートメント
Function ステートメント
Sub ステートメント
Property ステートメント
Using ステートメント
With...End With ステートメント
47
[Ctrl]+[Shift]+[↑/↓]
呼び出し階層
メソッドの「呼び出し先」と「呼び出し元」
を追跡
48
コード生成
型の生成
「XXX のクラスを生成する」
→同名のファイルを生成
「新しい型の生成」
→ダイアログによる詳細設定
型
C#
VB
49
メソッド
VS2005
から提供
IntelliSense の強化
検索機能
コード検索機能のマッチング ルールを採用
候補提示モード
入力候補モード
候補提示モード
[Ctrl] +[Alt]+[Space]
50
ヒントチップ
追跡したい値をコードの近くにピン留め
コメントの追記も可能
51
ブレークポイントの管理が可能に
ラベル付による分類とフィルタリング
インポートとエクスポート
XML 形式でファイルに保存
52
まとめ
まとめ
Visual Basic と C# のどちらでも同じよう
に強力な開発ができます。
C#
VB
オプション引数・名前付き引数
遅延バインド
得意な言語で便利な開発を可能にする
簡易な COM 相互運用
自動実装プロパティ
コレクション初期化子
複数行のラムダ式
動的言語のサポート
を是非、ご活用ください。
共変性と反変性
コード コントラクト
54
関連セッション
T6-302:Day2 9:20-10:30 Room B
Visual Studio 2010 の 新しいテスト機能による
ソフトウェア品質の向上
T6-501:Day3 15:20-16:30 Room D
多言語パラダイムによる実装手法
~ 動的言語、関数型言語などを含めた プログラミング言語の有効活用へ ~
T6-308:Day1 15:20-16:30 Room E
.NET Framework 4 を使用した 並列プログラミングと
デバッグ、プロファイリング
H-317:Day2, Day3
Visual Studio 2010
~ Test Manager による新しいテスト機能の活用 ~
BOF-06:
Let's Dynamic : IronRuby で探す .NET の付加価値
55
リファレンス
.NET Framework デベロッパー センター
http://msdn.microsoft.com/ja-jp/netframework/default.aspx
Visual Studio デベロッパー センター
http://msdn.microsoft.com/ja-jp/vstudio/default.aspx
.NET 開発コード サンプル集 Code Recipe
http://msdn.microsoft.com/ja-jp/samplecode.recipe.aspx
Days with Microsoft Web Platform (Blog)
http://blogs.msdn.com/tashinmu/
56
ご清聴ありがとうございました。
T6-309
アンケートにご協力ください。
Appendix
VB10 暗黙の改行の条件 (1/3)
構文要素
例
コンマ (,) の後。
Public Function GetUsername(ByVal username As String,
ByVal delimiter As Char,
ByVal position As Integer) As
String
Return username.Split(delimiter)(position)
End Function
Dim username = GetUsername(
Security.Principal.WindowsIdentity.GetCurrent().Name,
左かっこ (() の後、または右かっこ ()) の前。
CChar("\"),
1
)
Dim customer = New Customer With {
.Name = "Terry Adams",
左中かっこ ({) の後、または右中かっこ (}) の前。
.Company = "Adventure Works",
.Email = "[email protected]"
}
Dim customerXml = <Customer>
<Name>
<%=
customer.Name
%>
XML リテラル内の埋め込み式の開始記号 (<%=) の後、または埋め込み
</Name>
式の終了記号 (%>) の前。
<Email>
<%=
customer.Email
%>
</Email>
</Customer>
cmd.CommandText =
"SELECT * FROM Titles JOIN Publishers " &
連結演算子 (&) の後。
"ON Publishers.PubId = Titles.PubID " &
"WHERE Publishers.State = 'CA'"
60
VB10 暗黙の改行の条件 (2/3)
構文要素
例
Dim fileStream =
My.Computer.FileSystem.
OpenTextFileReader(filePath)
Dim memoryInUse =
My.Computer.Info.TotalPhysicalMemory +
式内の二項演算子 (+、-、/、*、Mod、<>、<、>、<=、>=、^、
My.Computer.Info.TotalVirtualMemory >>、<<、And、AndAlso、Or、OrElse、Like、Xor) の後。
My.Computer.Info.AvailablePhysicalMemory My.Computer.Info.AvailableVirtualMemory
If TypeOf inStream Is
IO.FileStream AndAlso
inStream IsNot
Is 演算子および IsNot 演算子の後。
Nothing Then
ReadFile(inStream)
End If
Dim query =
From n In {123, 456, 789}
Order By n
Select n +
x
Dim fileStream =
メンバーの修飾子文字 (.) の後、メンバー名の前。ただし、With ステー
My.Computer.FileSystem.
トメントを使用する場合や型の初期化リストの値を指定する場合は、メ
OpenTextFileReader(filePath)
ンバーの修飾子文字の後に行連結文字 (_) を含める必要があります。
With ステートメントやオブジェクト初期化リストを使用する場合は、代
Dim aType = New With {.PropertyName =
入演算子 (= など) の後で改行することをお勧めします。
"Value"}
Dim log As New EventLog()
With log
.Source =
"Application"
End With
代入演算子 (=、&=、:=、+=、-=、*=、/=、\=、^=、<<=、
>>=) の後。
61
VB10 暗黙の改行の条件 (3/3)
構文要素
例
Dim customerName = customerXml.
XML 軸プロパティ修飾子 (.、.@、...) の後。ただし、With キーワード
<Name>.Value
を使用する場合は、メンバーの修飾子を指定する際に行連結文字 (_) を
含める必要があります。
Dim customerEmail = customerXml...
<Email>.Value
<
Serializable()
属性を指定する際の小なり記号 (<) の後、または大なり記号 (>) の前。 >
また、属性を指定する際の大なり記号 (>) の後。ただし、アセンブリ レ Public Class Customer
ベルまたはモジュール レベルの属性を指定する場合は、行連結文字 (_)
Public Property Name As String
を含める必要があります。
Public Property Company As String
Public Property Email As String
End Class
クエリ演算子 (Aggregate、Distinct、From、Group By、Group Join、
Dim vsProcesses = From proc In
Join、Let、Order By、Select、Skip、Skip While、Take、Take While
Process.GetProcesses
、Where、In、Into、On、Ascending、および Descending) の前後。
Where proc.MainWindowTitle.Contains(“Hello!")
複数のキーワードで構成されるクエリ演算子 (Order By、Group Join、
Select proc.ProcessName, proc.Id,
Take While、および Skip While) のキーワード間で改行することはでき
proc.MainWindowTitle
ません。
For Each p In
vsProcesses
Console.WriteLine("{0}" & vbTab & "{1}" & vbTab & "{2}",
For Each ステートメントの In キーワードの後。
p.ProcessName,
p.Id,
p.MainWindowTitle)
Next
Dim days = New List(Of String) From
{
コレクション初期化子の From キーワードの後。
"Mo", "Tu", "We", "Th", "F", "Sa", "Su"
}
62
共変性、反変性を提供する
ジェネリック インターフェイスとデリゲート
型
共変の型パラメーター
反変の型パラメーター
Action<(Of <(T>)>) ~ Action<(Of <(T1, T2, T3, T4,
T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
T16>)>)
○
Comparison<(Of <(T>)>)
○
Converter<(Of <(TInput, TOutput>)>)
○
Func<(Of <(TResult>)>)
○
Func<(Of <(T, TResult>)>) ~ Func<(Of <(T1, T2, T3,
T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
T15, T16, TResult>)>)
○
Predicate<(Of <(T>)>)
IComparer<(Of <(T>)>)
IEnumerator<(Of <(T>)>)
○
○
○
IEqualityComparer<(Of <(T>)>)
IGrouping<(Of <(TKey, TElement>)>)
○
IOrderedEnumerable<(Of <(TElement>)>)
○
IOrderedQueryable<(Of <(T>)>)
○
IQueryable<(Of <(T>)>)
○
63
○
○
○
○
IComparable<(Of <(T>)>)
IEnumerable<(Of <(T>)>)
○