連載

C#入門

第20回 実行時に参照可能な属性

(株)ピーデー
川俣 晶
2002/01/23


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

 属性は、Webサービスを記述する場合にも便利に使われる。Visual Studio .NETでWebサービスのプロジェクトを作成すると自動生成されるソースコードには、コメントとしてHello Worldメソッドが埋め込まれている。コメント記号を外してこれを有効にしたのが以下のソースである。

 1: using System;
 2: using System.Collections;
 3: using System.ComponentModel;
 4: using System.Data;
 5: using System.Diagnostics;
 6: using System.Web;
 7: using System.Web.Services;
 8:
 9: namespace WebService4
10: {
11:   /// <summary>
12:   /// Summary description for Service1.
13:   /// </summary>
14:   public class Service1 : System.Web.Services.WebService
15:   {
16:     public Service1()
17:     {
18:       //CODEGEN: This call is required by the ASP.NET Web Services Designer
19:       InitializeComponent();
20:     }
21:
22:     #region Component Designer generated code
23:     /// <summary>
24:     /// Required method for Designer support - do not modify
25:     /// the contents of this method with the code editor.
26:     /// </summary>
27:     private void InitializeComponent()
28:     {
29:     }
30:     #endregion
31:
32:     /// <summary>
33:     /// Clean up any resources being used.
34:     /// </summary>
35:     protected override void Dispose( bool disposing )
36:     {
37:     }
38:
39:     [WebMethod]
40:     public string HelloWorld()
41:     {
42:       return "Hello World";
43:     }
44:   }
45: }
Visual Studio .NETにより自動生成されるサンプル・プログラム9
コメントとしてHello Worldメソッドが埋め込まれている。コメント記号を外してこれを有効にしたもの。

 これを実行し、HelloWorldのテストボタンを押すと以下のようになる。

サンプル・プログラム9の実行結果
文字列“Hello World”がXML形式で返される。

 見所はもちろん39行目の「WebMethod属性」である。このクラスには複数のメソッドが含まれているが、Webメソッドとして公開されるのは、WebMethod属性の付いたメソッドだけである。古い世代のプログラム言語では、このような指定をソースコードに記述可能とするために、回りくどい方法や独自拡張などを用いていたが、C#では属性を用いることでエレガントに実現している。

より高度なWebサービス

 上記のサンプルはそのままでは実用に耐えない。なぜなら、名前空間として“http://tempuri.org/”という一時利用のためのものが使われているためだ。これを正規のサービス用のものに置き換えねばならない。その他、よりきめ細かく指定も書き込んでみよう。

 1: using System;
 2: using System.Collections;
 3: using System.ComponentModel;
 4: using System.Data;
 5: using System.Diagnostics;
 6: using System.Web;
 7: using System.Web.Services;
 8: using System.EnterpriseServices;
 9:
10: namespace WebService4
11: {
12:   /// <summary>
13:   /// Summary description for Service1.
14:   /// </summary>
15:   [WebService(Namespace="http://www.atmarkit.co.jp/example/namespace",
16:     Description="C#のアトリビュートを解説するためのサンプル",
17:     Name="A Sample Web Service" )]
18:   public class Service1 : System.Web.Services.WebService
19:   {
20:     public Service1()
21:     {
22:       //CODEGEN: This call is required by the ASP.NET Web Services Designer
23:       InitializeComponent();
24:     }
25:
26:     #region Component Designer generated code
27:     /// <summary>
28:     /// Required method for Designer support - do not modify
29:     /// the contents of this method with the code editor.
30:     /// </summary>
31:     private void InitializeComponent()
32:     {
33:     }
34:     #endregion
35:
36:     /// <summary>
37:     /// Clean up any resources being used.
38:     /// </summary>
39:     protected override void Dispose( bool disposing )
40:     {
41:     }
42:
43:     [WebMethod(BufferResponse=false,CacheDuration=60,
44:        Description="WebMethodアトリビュートの解説用のメソッド",EnableSession=false,
45:        MessageName="SampleMethod",
46:        TransactionOption=TransactionOption.Supported)]
47:     public string HelloWorld()
48:     {
49:       return "Hello World";
50:     }
51:   }
52: }
サンプル・プログラム10
クラスに「WebService属性」を付け、WebMethod属性にも引数を追加している。

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



サンプル・プログラム10の実行結果
(上)属性で記述したWebサービスやそのメソッドに関する解説が表示されている。
(下)ネームスペースが「WebService属性」で指定したものになっている。

 まず名前空間を指定するコードから説明しよう。名前空間を指定するには、15行目のように「WebService属性」を記述する。これはクラスに付く属性なので、18行目のクラス宣言の手前に記述されている。「Namespace」には名前空間のURIを指定する。その他に、いくつかの名前付き引数を記述してみた。「Description」はそのサービスの説明文を記述する。「Name」はそのサービスの名前を記述する。

 43行目のWebMethod属性にも、オプションの名前付き引数を充実させてみた。「BufferResponse」にはレスポンスをバッファリングするかどうかを指定する。サイズの大きなレスポンスはバッファリングしない方が効率がよいらしい。「CacheDuration」にはキャッシュが有効な時間を秒単位で指定する。「Description」にはメソッドの説明を記述する。「EnableSession」にはセッション管理を有効にするかどうかを指定する。「MessageName」には送受信されるメッセージの名前を指定する。画面写真を見て分かるとおり、外部からはこの名前のメソッドが存在するかのように見える。「TransactionOption」にはトランザクションを使用するかどうかを指定する。

 このように、多くの機能が名前付き引数として用意されているので、その気になれば、かなりきめ細かく動作をコントロールできる。しかも、同じソースコード上にコードと指定をすべて一緒に記述できるため扱いやすい。これも属性という機能のおかげであろう。

 なお、「TransactionOption」の値のみSystem.Web.Servicesネームスペースではなく、System.EnterpriseServicesネームスペース上にあるようだ。そのため、8行目のusingが追加されている点に注意されたい。

まとめ

 属性は、これまでよく使われていたC++や過去のVisual Basicなどに存在しない機能であるため、どこから手を付けてよいか戸惑う人も多いだろう。しかし、分かってしまえばこんなに便利な機能はない。今まで経験のない人でも、一度馴染めば、どうして昔のプログラム言語にはなかったのだろうと思うようになるかもしれない。ぜひチャレンジして属性を使いこなそう。

 さて、次回はポインタが使用できるunsafeコードについて取り上げたいと考えている。

 それでは次回もLet's See Sharp!End of Article


 INDEX
  第20回 実行時に参照可能な属性
    1.属性(アトリビュート)とは何か?
    2.クラスに付く属性
    3.名前付き引数
    4.廃止予定を事前に告げるObsolete属性
  5.Webサービスで使われる属性
 
「C#入門」


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メールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間