概要: My 関数が、利用可能なクラス、動的に生成されたクラス、スレッドなどの .NET Framework 機能を公開する方法の概要。
注: この記事とサンプル コードは、Microsoft Visual Studio 2005 (以前のコード名は「Whidbey」) のプレリリース バージョンに基づいています。ここに含まれるすべての情報は変更される可能性があります。サンプルプロジェクトにはVisual Studio2005Beta1以降が必要です。
導入
My は Visual Basic 2005 の新機能で、頻繁に使用する機能をすぐに利用できるようにし、記述しなければならないコードの行数を減らします。これは効率的で信頼性が高く、スレッドセーフな方法で行われます。プログラマーの生産性が特に重要な環境では、My は作業をより速く完了するのに役立ちます。これが Visual Basic の本質です。
この記事の目的は、My を使用してプロジェクト内の .NET Framework の機能と項目にアクセスする方法を検討することです。
My から入手できる .NETFramework クラス
.NET Framework には非常に多くの機能が含まれているため、必要な機能を見つけるのが難しい場合があります。この問題を解決するために、My は一般的に使用される .NET Framework のクラスと関数へのエントリ ポイントを提供します。また、関連する機能をタスクベースの API に集約する新しい高レベル .NET Framework クラスも公開します。
My は、インスタンス化されてすぐに使用できる .NETFramework クラスを返し、.NETFramework メソッドの呼び出しを延期し、プロジェクト内の項目にアクセスするために使用できる動的に生成されたクラスを返すことによって機能を公開します。
直接公開
可能な限り、My は .NET Framework の既存のクラスの検出メカニズムとして機能し、これらの型を直接公開します。次の My.application.Deployment の例を参照してください。
PublicReadOnlyPRpertyDeployment()As_
System.Deployment.ApplicationDeployment
得る
戻る_
System.Deployment.ApplicationDeployment.CurrentDeployment
EndGet
終了プロパティ
直接公開される他の例には、My.Computer.FileSystem.OpenTextFileReader() (System.IO.StreamReader を返す)、My.Application.OpenForms() (System.Windows.Forms.FormsCollection を返す)、My.User (これは System.IO.StreamReader を返す) などがあります。 System.Security.Principal.IPrincipal) など
外観
また、機能を見つけるのが難しかったり、連携するために複数のオブジェクトが必要だったりするために、以前は実行が困難だった操作を実行するためのタスクベースの API を提供する新しいクラスを返すこともできます。
低レベルの .NET Framework API の使用や複数行のコードを必要とする一般的なタスクが大幅に簡素化されています。ネットワーク接続が利用可能かどうかを確認するには、次のタスク例を参照してください。
インポートSystem.Net.NetworkInformation
PublicReadOnlyPropertyIsAvailable()AsBoolean
得る
ForEachNetInterfaceAsNetworkInterfaceIn_
NetworkInterface.GetAllNetworkInterfaces()
IfNetInterface.Type<>InterfaceType.Loopback_
AndAlsoNetInterface.Type<>InterfaceType.Tunnel_
AndAlsoNetInterface.OperationalStatus=_
OperationalStatus.UpThen
True を返す
EndIf
次
偽を返す
EndGet
終了プロパティ
上記のコードには、System.Net.NetworkInformation 名前空間のいくつかの型に関する詳細な知識が必要です。 My.Computer.Network は、出現パターンを使用して、これらの型とその関係を 1 行のコード My.Computer.Network.IsAvailable() にまとめます。
外観を使用すると、見つけにくい関連機能を簡単にまとめることもできます。たとえば、My.Computer はさまざまなクラスのプロパティをまとめて、コンピューター名と画面へのアクセスを提供します。
PublicReadOnlyPropertyName()AsString
得る
ReturnSystem.Environment.MachineName
EndGet
終了プロパティ
PublicReadOnlyPropertyScreen()AsSystem.Windows.Forms.Screen
得る
ReturnSystem.Windows.Forms.Screen.PrimaryScreen
EndGet
終了プロパティ
複数の .NET Framework 型の関連機能をまとめた My のクラスの他の例には、My.Application、My.Computer、My.Computer.FileSystem、My.Computer.Info、および My.Application.Info などがあります。
プロキシクラス
プロキシ クラスは、すべての呼び出しを基本オブジェクトに転送する非常に「薄い」クラスです。たとえば、My.Computer.Clipboard.GetText() を呼び出すと、実際には次のように定義されたプロキシ クラス メソッド ClipboardProxy.GetText() を呼び出していることになります。
PublicFunctionGetText()AsString
ReturnClipboard.GetText()
エンドファンクション
慣例により、プロキシ クラスには常に Proxy という接尾辞が付きます。プロキシによって公開される基本クラスは、IntelliSense では表示されない共有メソッドで構成されているため、クリップボード、ファイル システム、およびレジストリにアクセスするときにプロキシを使用します。ユーザーは Proxy クラスをインスタンス化できません。パフォーマンス テストの結果、プロキシ経由での通話の転送は無意味であることがわかりました。
動的に生成されたクラス
「機能をすぐに使えるようにする」という目的に沿って、My はプロジェクトで定義されたフォーム、Web サービス、リソース、設定へのアクセスを提供します。たとえば、プロジェクトに Web サービス MapDirections への参照が含まれている場合、Web サービス プロキシのインスタンスを開始する方法を知らなくても、Web サービスをすぐに使用できます。次のように入力するだけです: My.WebServices.MapDirections.GetDirections(...)
これはどのように作動しますか?ファクトリ クラスは、プロジェクト内のフォーム、Web サービス、設定、リソースに対してオンデマンドで遅延作成されたインスタンスを返すコンパイラーによって生成されます。ファクトリ クラスは、コードが実行されているプロジェクトの種類 (exe/dll/web) に適した方法でインスタンスを返すように適合されています。詳細については、「スレッド処理」セクションを参照してください。
My.Forms
動的に生成されるクラスの例として、My.Forms を考えてみましょう。このクラスは提供されており、プロジェクト内の各フォームのファクトリ メソッドを定義します。 My.Forms.Form1 を通じて Form にアクセスすると、ファクトリ メソッドは Form1 のインスタンスがすでに開いているかどうかを確認します。インスタンスがすでに開いている場合は、そのインスタンスが返されます。それ以外の場合は、Form1 のインスタンスが作成されて返されます。 Form1 を含むプロジェクト用に生成されたコードは次のようになります。
クラスマイフォーム
'コンパイラによって生成されたコードインボールド
Publicm_Form1AsForm1
PublicPropertyForm1()AsForm1
得る
m_Form1=Create__Instance__(OfForm1)(m_Form1)
Returnm_Form1
EndGet
Set(ByValValueAsForm1)
IfValueIsm_Form1
戻る
EndIf
IfNotValueIsNothingThen
ThrowNewArgumentException(_
プロパティは何も設定しないことのみ可能です。)
EndIf
Dispose__Instance__(OfForm1)(m_Form1)
エンドセット
終了プロパティ
エンドクラス
Create__Instance__() 関数は、オンデマンドでフォームのインスタンスを作成する役割を果たします。フォーム (m_Form1 に保存されている) がインスタンス化されているかどうかを確認します。フォームがすでにインスタンス化されている場合は、フォームが返されます。それ以外の場合は、インスタンスが作成されて返されます。 Create__Instance__() は、再帰的なフォーム作成の試行もキャプチャします。 Dispose__Instance__() はフォームを閉じる役割を果たします。
My.Forms には、以前のバージョンの Visual Basic でおなじみのフォームの既定のインスタンスを再導入するメソッドも提供されます。デフォルト インスタンスを使用すると、最初にフォームのインスタンスを明示的に作成しなくても、フォームのインスタンスを参照できるようになります。
たとえば、Visual Basic 6.0 では、代わりに Form1.Show() を記述した可能性があります。
DimForm1InstanceasForm1
Form1Instance=新しいフォーム1
Form1Instance.Show()
Visual Basic 2005 のコンパイラは My.Forms を使用してデフォルトのインスタンスを作成するため、Form1.Show() を記述するだけで済みます。
My.WebServices
Web サービスをコーディングするときに遭遇する困難の 1 つは、どのクラスに対してコーディングするかを決定することです。 My.WebServices は、この決定プロセスを排除し、Web サービス プロキシのインスタンスをオンデマンドで提供します。
My.WebServices は、Web サービスへの同期呼び出しに最適です。 Web サービス プロキシのインスタンスを提供するために生成されるコード パターンは、フォームのインスタンスを返すために示されているコード パターンと同じです。
私の設定
Visual Basic 2005 の新機能は、アプリケーションまたはユーザー ベースでアプリケーション設定を指定できる設定デザイナーです。デザイナーは、厳密に型指定された方法で設定にアクセスするために使用できるクラスを作成します。 MySettings クラスの例を確認するには、ソリューション エクスプローラーですべてのファイルを表示し、MySettings.Settings ノードの下で MySettings.vb ファイルを探します。
以下は、SampleUserSetting という名前のアプリケーション設定を管理するために生成されるプロパティの例です。
PartialNotInheritableClassMySettings
InheritsSystem.Configuration.ApplicationSettingsBase
<System.Diagnostics.DebuggerNonUserCode(),_
System.Configuration.UserScopedSettingAttribute(),_
System.Configuration.DefaultSettingValueAttribute(TryMe)>_
PublicPropertySampleUserSetting()AsString
得る
ReturnCType(Me(SampleUserSetting),String)
EndGet
セット
私(サンプルユーザー設定)=値
エンドセット
終了プロパティ
エンドクラス
生成されたクラスは、面倒な作業をすべて行ってくれます。この設定にアクセスするには、次のように入力します。
My.Settings.SampleUserSetting
私のリソース
Visual Basic 2005 のもう 1 つの新機能は、アプリケーションにリソースを追加できるリソース デザイナです。リソース デザイナーは、厳密に型指定された方法でアプリケーション内のリソースにアクセスするために使用できるモジュールも作成します。たとえば、Smiley という名前のビットマップをプロジェクトに追加すると、My.Resources.Smiley を使用してビットマップにアクセスできます。生成されたリソース モジュールの例を確認するには、サンプル プロジェクトのソリューション エクスプローラーで [すべてのファイル] を表示し、MyResources.resx ノードの下で MyResources.vb ファイルを探します。
以下は、Smiley リソースのファクトリ プロパティを返すために生成されたサンプル プロジェクトの例です。
PublicReadOnlyPropertySmiley()AsSystem.Drawing.Bitmap
得る
ReturnCType(ResourceManager.GetObject(Smiley,_resCulture),_
System.Drawing.Bitmap)
EndGet
終了プロパティ
生成された厳密に型指定されたリソース モジュールは、大文字と小文字を区別するリソース ID を処理し、System.Resources.ResourceManager クラスを使用してリソースを取得し、アプリケーション用に ResourceManager を正しく作成するための詳細を管理します。
VisualBasic2002 または VisualBasic2003 で同じスマイリー ビットマップにアクセスするには、まずビットマップを .resx ファイルに配置する必要がありますが、これは困難です。もう 1 つの方法は、埋め込みリソースとしてプロジェクトに配置する方法です。埋め込みリソースとなるリソースのプロパティ グリッドでビルド アクションを忘れずに変更する必要があります。このようにして、作成するコードは次のようになります。
DimCurrentAssemblyAsReflection.Assembly=_
Reflection.Assembly.GetExecutingAssembly
DimBitMapStreamAsIO.Stream=_
CurrentAssembly.GetManifestResourceStream(_
WindowsApplication2.Smiley.bmp)
DimSmileyBitmapasDrawing.Bitmap=NewBitmap(BitMapStream)
このコードには、知っておく必要がある重要な詳細がいくつかあります。現在実行中のアセンブリを取得し、それに対して GetManifestResourceStream() を呼び出す方法を知っておく必要があります。リソース名をルート名前空間名で修飾することを忘れないでください。 GetManifestResourceStream() に渡される名前では大文字と小文字が区別されるため、大文字と小文字の許可を取得する必要があります。ストリーム オブジェクトで GetManifestResource の戻り値をキャプチャできるように、ストリーム クラスを定義する場所を知っておく必要があります。ストリームからビットマップを作成する方法を知っておく必要があります。上記の問題のいずれかが原因で、BitMapStream が常に Nothing を返す理由を判断しようとすると、イライラする可能性があります。
Visual Basic 2005 は、新規または既存のリソースを .resx ファイルに簡単に配置できる ResourceEditor を提供することで、最初の問題を解決します。これらのリソースには、My を使用して簡単にアクセスできます。次のように書くだけです。
DimSmileyBitmapasDrawing.Bitmap=My.Resources.Smiley
ねじ切り
My オブジェクトのインスタンスはスレッドごとに提供されるため、My で使用可能なクラス インスタンスは、スレッドの問題を軽減する方法で公開されます。つまり、スレッド 1 で返される My.Computer のインスタンスは、スレッド 2 で返される My.Computer のインスタンスとは異なります。これは、My オブジェクトを使用するときに同期コードを記述する必要がないことを意味します。
Web アプリケーションでは、My から返されたインスタンスはリクエストに応じて保存されます。
まとめ
My が .NET Framework クラスを公開する方法と、My を補完するために動的に生成されるクラスをどのように生成できるかを見てきました。
最後に、My を使用すると、記述しなければならないコードの行数が減り、よく使用される機能へのアクセスが提供されます。これは効率的で信頼性が高く、スレッドセーフな方法で行われます。プログラマの作業効率が特に重要な環境では、My は作業をより迅速かつ効果的に完了するのに役立ちます。
->