連載

改訂版
プロフェッショナルVB.NETプログラミング

Chapter 14 属性

株式会社ピーデー 川俣 晶
2004/09/02
Page1 Page2 Page3 Page4

 本記事は、(株)技術評論社が発行する書籍『VB6プログラマーのための入門 Visual Basic .NET 独習講座』の一部分を許可を得て転載したものです。同書籍に関する詳しい情報については、本記事の最後に掲載しています。
 
名前付き引数

 前節のサンプルソース(リスト14-20)を見て、「おや?」と思った人がいるだろう。属性の引数は、そのまま属性クラスのコンストラクタに引き渡されると説明したが、AttributeUsageAttributeクラスのコンストラクタには、AllowMultipleなどという引数は存在しないからだ。これは、属性で利用可能な特別な引数の渡し方で、「名前付き引数」と呼ばれる。実際に自作属性で、名前付き引数をサポートしたサンプル・プログラムをリスト14-22に示す。

 1: <AttributeUsage(AttributeTargets.Class)> Public Class AuthorAttribute
 2:   Inherits Attribute
 3:
 4:   Private _name As String
 5:   Private _organization As String
 6:
 7:   Public Sub New(ByVal name As String)
 8:     _name = name
 9:     _organization = "(no organization)"
10:   End Sub
11:
12:   Public ReadOnly Property name() As String
13:     Get
14:       Return _name
15:     End Get
16:   End Property
17:
18:   Public Property organization() As String
19:     Get
20:       Return _organization
21:     End Get
22:     Set(ByVal Value As String)
23:       _organization = Value
24:     End Set
25:   End Property
26: End Class
27:
28: <Author("Ichiro")> Public Class Test1
29: End Class
30:
31: <Author("Jiro", organization:="The Program Company")> Public Class Test2
32: End Class
33:
34: <Author("Saburo", organization:="The Software Group")> Public Class Form1
35:   Inherits System.Windows.Forms.Form
36:
37: …Windows フォーム デザイナで生成されたコード…
38:
39:   Public Sub dumpAuthor(ByVal className As String)
40:     Dim targetType As Type = Type.GetType("Sample008n." + className)
41:     Dim list() As Object = targetType.GetCustomAttributes(GetType(AuthorAttribute), False)
42:     Dim item As AuthorAttribute
43:     For Each item In list
44:       Trace.WriteLine("class " & className & " is written by " & item.name & " in " & item.organization)
45:     Next
46:   End Sub
47:
48:   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
49:     dumpAuthor("Test1")
50:     dumpAuthor("Test2")
51:     dumpAuthor("Form1")
52:   End Sub
53: End Class
リスト14-22 名前付き引数をサポートした属性を記述したプログラム

 これを実行すると以下のようになる。

1: class Test1 is written by Ichiro in (no organization)
2: class Test2 is written by Jiro in The Program Company
3: class Form1 is written by Saburo in The Software Group
リスト14-23 リスト14-22の実行結果

 名前付き引数を実現するには、使用した引数に対応するプロパティやフィールドを用意するだけでよい。リスト14-22では、18〜25行目のorganizationという名前のプロパティがそれに当たる。このorganizationプロパティが存在することにより、31行目や34行目の、organization:="〜"という記述が可能になる。もちろん、これは省略も可能であり、28行目のように書かないという選択も可能である。

 名前付き引数は、単なるフィールドやプロパティにすぎないので、参照するために特別な方法は必要とされていない。44行目で分かるように、item.nameと同じように、item.organizationと記述することができる。ただのプロパティである以上、ただのプロパティとして利用可能である。

Webサービスで使われる属性の概要

 本連載ではWebサービスの詳細にまで踏み込まないが、Webサービスを記述する際にも属性が活用される。その使われ方を見るために、簡単なWebサービスのサンプル・プログラムを作ってみよう。

 VS.NETのIDEのメニューから、[ファイル]-[新規作成]-[プロジェクト]と選び、[プロジェクトの種類]から[Visual Basicプロジェクト]を選択してから、[テンプレート]に[ASP.NET Webサービス]を選ぶ。これによって、リスト14-24のようなソース・コードを持つプロジェクトが生成される。

 1: Imports System.Web.Services
 2:
 3: <WebService(Namespace := "http://tempuri.org/")> _
 4: Public Class Service1
 5:   Inherits System.Web.Services.WebService
 6:
 7: …Web サービス デザイナで生成されたコード…
 8:
 9:   ' WEB SERVICE EXAMPLE
10:   ' HelloWorld() サービスのサンプルは文字列 Hello World を返します。
11:   ' ビルドするには、以下の行からコメントを削除して保存してからプロジェクトをビルドします。
12:   ' この Web サービスをテストするには、.asmx ファイルがスタートページに設定されていることを確認し、
13:   ' F5 キーを押してください。
14:   '
15:   '<WebMethod()> Public Function HelloWorld() As String
16:   '   HelloWorld = "Hello World"
17:   ' End Function
18:
19: End Class
リスト14-24 テンプレート[ASP.NET Webサービス]で生成されるプログラム

 ここで、15〜17行目のコメントを外してから、ビルドして実行してみよう。すると、以下のようにWebブラウザが開き、Webサービスの情報が表示される。

●図14-25 自動生成されたリスト14-24にあるWebサービスの実行画面

 ここで、HelloWorldというリンクをクリックすると以下のような画面になる。

●図14-26 HelloWorld Webサービスの起動画面

 この起動ボタンを押すと、ソース・コード中の15〜17行目のHelloWorldメソッドが呼び出され、以下のような結果が表示される。

●図14-27 HelloWorld Webサービスの実行結果

 リスト14-24での属性の使い方を見てみよう。まず、3行目のWebService属性は、クラスに対してWebサービスに関連する情報を付加するために使われている。例えば、この例では、Webサービスの名前空間(VB.NETの名前空間とは異なるものであることに注意)を“Namespace := http://tempuri.org/”という名前付き引数で指定している。

 また、15行目のWebMethod属性は、メソッドがWebサービス経由で呼び出し可能であることを指定している。ソースからは見えない状態になっているが、このクラスには多数のメソッドが存在している。その中で、実際にHelloWorldメソッドだけがWebサービスとして閲覧したときに見えるのは、このメソッドにのみ、WebMethod属性が付いているためである。つまり、Webサービスを行うクラスを作成する場合、属性の有無により、実際に公開するメソッドと、公開しない内部処理用のメソッドを容易に区別することができるわけである。属性の価値を理解するために、ここで特に注目しておきたいのは、WebMethod属性はVB.NETの言語の一部ではないということである。あとからソース・コードに埋め込める情報を追加定義できることが、属性の大きな長所である。将来、何か新しい技術が出現し、VB.NETがそれに対応する場合でも、属性を使ってそれを行うことができるなら、言語そのものを拡張する必要はなく、とても柔軟であるといえる。End of Article

『VB6プログラマーのための入門 Visual Basic .NET 独習講座』

 本記事は、(株)技術評論社が発行する書籍『VB6 プログラマーのための 入門 Visual Basic .NET 独習講座』から許可を得て転載したものです。

【本連載と書籍の関係について 】
 この書籍は、本フォーラムで連載した「連載 プロフェッショナルVB.NETプログラミング」を大幅に加筆修正し、発行されたものです。技術評論社、および著者である川俣晶氏のご好意により、書籍の内容を本フォーラムの連載記事として掲載させていただけることになりました。

技術評論社の解説ページ

ご注文はこちらから

 

 INDEX
  [連載] 改訂版 プロフェッショナルVB.NETプログラミング
  Chapter 14 属性
    1.属性とは何か?/固定長配列を指定するVBFixedArray属性/オブジェクトのシリアライズ
    2.属性の名前のバリエーション/Declare文の引数型を変換するMarshalAs属性/条件付きメソッド
    3.属性を自作する/クラスに付く属性/複数の属性を持たせる
  4.名前付き引数/Webサービスで使われる属性の概要
 
「改訂版 プロフェッショナルVB.NETプログラミング 」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH