宇宙仮面の
C# Programming

 
Image

Attributes について

開発環境: Visual Studio 2003 

1.目次

2.目的

アトリビュートって、ほとんど説明がないにもかかわらず、実は重要な役割を果たしています。
例えば、Windows.Forms アプリケーションを作ると、デフォルトで次のようなメインが作られますが、
ここで、[STAThread] というアトリビュートがつけられているのを気がつきましたか?

/// <summary>
/// アプリケーションのメイン エントリ ポイントです。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}

これは、詳しいことはわからないんですが、Single Thread Appartment の略で、スレッド間の分離レベルをあらわしています。
STA の場合、スレッドごとに異なる Appartment に分かれるため、スレッド間ではマーシャリングが必要になります。
Windows.Forms は必ず STA で作られるようです。 

MTA は、COM の中で使われる場合があるようです。MTAの場合には複数のスレッドが1つの Appartment に存在するためスレッド間のマーシャリングが必要なくなり、その分高速になるそうです。ただ、これらのスレッドアパートメントは、COM のつくりによって変わってくるようで、STA のCOMと
MTA の COM の両方のパターンがあるようです。

ちょっと、それましたが、アトリビュート(Attributes) はプログラムに対して宣言とメタデータを追加します。
あっさり書いてありますが、正しく理解するためには重要な項目だと思います。
C#では、リフレクション(Reflection) により、実行時にアトリビュートの値を参照することができます。

3.参考

(1) http://www.c-sharpcorner.com/Code/2002/May/UserDefinedCompDev.asp
(2) http://www.syncfusion.com/FAQ/WinForms/FAQ_c81c.asp
けっこうディープな内容。
(3) http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndotnet/html/vsnetpropbrow.asp

4.フォームデザイナーでのプロパティの編集に使用する Attributes


Visual Studio.NET のフォームデザイナーでプロパティを編集する際に便利に使えます。 例えば、次のようにプロパティにアトリビュートを追加すると、
                private string testProp;

                [Category("Category に記述したカテゴリー")]
                [DefaultValue("Default Value")]
                [Description("Description に記述した説明文です")]
                [Browsable(true)]       // プロパティウィンドウに表示するかどうか
                public string TestProperty
                {
                        get
                        {
                                return testProp;
                        }
                        set
                        {
                                testProp = value;
                        }
                }
プロパティエディタで、次のようにTestProperty を表示、編集することができるようになります。
Image

5.シリアライズを指定する Attributes

シリアライズ可能を示します。このクラスは継承できません。
using System;

...
[Serializable]
public class MyData
{
    ...
}

シリアライズについては、こちらを見てください。

6.Attributes


Property level Attributes
名前
説明
[Browsable(true or false)]プロパティウィンドウで表示するかどうかの切り替え。
デフォルトは true。隠したいときに使う。
[DesignOnly(true or false)]デザイン時のみに存在するかどうか。
デフォルトは false。
[Category("カテゴリ名")]プロパティウィンドウでの分類を指定する。
[Description(".....")]プロパティウィンドウの最下段に表示される説明文。

[Defaultvalue( )]

プロパティのデフォルト値
[DesignerSerializationVisibility( )] デザイン時シリアライザに対するプロパティの参照可能範囲を指定

Content オブジェクトの内容のコードを生成します。
Hidden オブジェクトのコードを生成しません。
Visible オブジェクトのコードを生成します。

[Editor( )]プロパティエディタに何を使うかの指定
[Localizable(true or false)]ローカライズできるかどうかの指定
[TypeConverter( )]

7.独自のコレクションを作成し、コレクションエディタで編集する方法

このセクションは、結構面倒な内容だけど重要なので、Collection へ独立しました。