Visual Basic での
Visual Basic の My
名前空間では、.NET Framework の機能を簡単に利用できるプロパティとメソッドが公開されています。
My
名前空間を使用すると、一般的なプログラミングの問題が簡略化され、多くの場合、困難なタスクが 1 行のコードに減ります。 さらに、 My
名前空間は完全に拡張可能であるため、 My
の動作をカスタマイズし、その階層に新しいサービスを追加して、特定のアプリケーションのニーズに合わせて調整できます。 このトピックでは、 My
名前空間の既存のメンバーをカスタマイズする方法と、独自のカスタム クラスを My
名前空間に追加する方法の両方について説明します。
既存の My
名前空間メンバーのカスタマイズ
Visual Basic の My
名前空間では、アプリケーション、コンピューターなどについてよく使用される情報が公開されます。
My
名前空間内のオブジェクトの完全な一覧については、「マイ リファレンス」を参照してください。 アプリケーションのニーズに合わせて、 My
名前空間の既存のメンバーをカスタマイズする必要がある場合があります。 読み取り専用ではない My
名前空間内のオブジェクトのプロパティは、カスタム値に設定できます。
たとえば、 My.User
オブジェクトを頻繁に使用して、アプリケーションを実行しているユーザーの現在のセキュリティ コンテキストにアクセスするとします。 ただし、会社ではカスタム ユーザー オブジェクトを使用して、社内のユーザーの追加情報と機能を公開します。 このシナリオでは、次の例に示すように、 My.User.CurrentPrincipal
プロパティの既定値を独自のカスタム プリンシパル オブジェクトのインスタンスに置き換えることができます。
My.User.CurrentPrincipal = CustomPrincipal
My.User
オブジェクトに CurrentPrincipal
プロパティを設定すると、アプリケーションの実行に使用する ID が変更されます。
My.User
オブジェクトは、新しく指定されたユーザーに関する情報を返します。
My
オブジェクトへのメンバーの追加
My.Application
およびMy.Computer
から返される型は、Partial
クラスとして定義されます。 そのため、MyApplication
または MyComputer
という名前のPartial
クラスを作成することで、My.Application
オブジェクトとMy.Computer
オブジェクトを拡張できます。 クラスを Private
クラスにすることはできません。
My
名前空間の一部としてクラスを指定する場合は、My.Application
またはMy.Computer
オブジェクトに含まれるプロパティとメソッドを追加できます。
次の例では、My.Computer
オブジェクトに DnsServerIPAddresses
という名前のプロパティを追加します。
Imports System.Net.NetworkInformation
Namespace My
Partial Class MyComputer
Friend ReadOnly Property DnsServerIPAddresses() As IPAddressCollection
Get
Dim dnsAddressList As IPAddressCollection = Nothing
For Each adapter In System.Net.NetworkInformation.
NetworkInterface.GetAllNetworkInterfaces()
Dim adapterProperties = adapter.GetIPProperties()
Dim dnsServers As IPAddressCollection = adapterProperties.DnsAddresses
If dnsAddressList Is Nothing Then
dnsAddressList = dnsServers
Else
dnsAddressList.Union(dnsServers)
End If
Next adapter
Return dnsAddressList
End Get
End Property
End Class
End Namespace
My
名前空間へのカスタム オブジェクトの追加
My
名前空間には、多くの一般的なプログラミング タスクのソリューションが用意されていますが、My
名前空間が対処していないタスクが発生する可能性があります。 たとえば、アプリケーションがユーザー データのカスタム ディレクトリ サービスにアクセスしたり、Visual Basic で既定でインストールされていないアセンブリをアプリケーションで使用したりする場合があります。
My
名前空間を拡張して、環境に固有の一般的なタスクにカスタム ソリューションを含めることができます。
My
名前空間を簡単に拡張して、増大するアプリケーションのニーズに合わせて新しいメンバーを追加できます。 さらに、 My
名前空間拡張機能を Visual Basic テンプレートとして他の開発者にデプロイすることもできます。
My
名前空間へのメンバーの追加
My
は他の名前空間と同様の名前空間であるため、モジュールを追加し、My
のNamespace
を指定するだけで、最上位レベルのプロパティを追加できます。 次の例に示すように、 HideModuleName
属性を使用してモジュールに注釈を付けます。
HideModuleName
属性を使用すると、IntelliSense がMy
名前空間のメンバーを表示するときにモジュール名が表示されなくなります。
Namespace My
<HideModuleName()>
Module MyCustomModule
End Module
End Namespace
My
名前空間にメンバーを追加するには、必要に応じてモジュールにプロパティを追加します。
My
名前空間に追加されたプロパティごとに、ThreadSafeObjectProvider(Of T)
型のプライベート フィールドを追加します。この型は、カスタム プロパティによって返される型です。 このフィールドは、 GetInstance
メソッドを呼び出すことによって、プロパティによって返されるスレッド セーフなオブジェクト インスタンスを作成するために使用されます。 その結果、拡張プロパティにアクセスしている各スレッドは、返された型の独自のインスタンスを受け取ります。 次の例では、My
名前空間にSampleExtension
型のSampleExtension
という名前のプロパティを追加します。
Namespace My
<HideModuleName()>
Module MyCustomExtensions
Private _extension As New ThreadSafeObjectProvider(Of SampleExtension)
Friend ReadOnly Property SampleExtension() As SampleExtension
Get
Return _extension.GetInstance()
End Get
End Property
End Module
End Namespace
カスタム My
オブジェクトへのイベントの追加
My.Application
オブジェクトを使用すると、My
名前空間のMyApplication
部分クラスを拡張することで、カスタム My
オブジェクトのイベントを公開できます。 Windows ベースのプロジェクトの場合は、ソリューション エクスプローラーでプロジェクトの [マイ プロジェクト] ノードをダブルクリックできます。 Visual Basic プロジェクト デザイナーで、[ アプリケーション ] タブをクリックし、[ アプリケーション イベントの表示 ] ボタンをクリックします。
ApplicationEvents.vbという名前の新しいファイルが作成されます。 これには、 MyApplication
クラスを拡張するための次のコードが含まれています。
Namespace My
Partial Friend Class MyApplication
End Class
End Namespace
カスタム イベント ハンドラーを MyApplication
クラスに追加することで、カスタム My
オブジェクトのイベント ハンドラーを追加できます。 カスタム イベントを使用すると、イベント ハンドラーが追加、削除、またはイベントが発生したときに実行されるコードを追加できます。 カスタム イベントの AddHandler
コードは、イベントを処理するコードがユーザーによって追加された場合にのみ実行されることに注意してください。 たとえば、前のセクションの SampleExtension
オブジェクトに、カスタム イベント ハンドラーを追加する Load
イベントがあるとします。 次のコード例は、My.SampleExtension.Load
イベントが発生したときに呼び出されるSampleExtensionLoad
という名前のカスタム イベント ハンドラーを示しています。 新しい My.SampleExtensionLoad
イベントを処理するコードが追加されると、このカスタム イベント コードの AddHandler
部分が実行されます。
MyApplication_SampleExtensionLoad
メソッドは、My.SampleExtensionLoad
イベントを処理するイベント ハンドラーの例を示すコード例に含まれています。 ApplicationEvents.vb ファイルを編集するときに、コード エディターの上にある左側のドロップダウン リストで [マイ アプリケーション イベント] オプションを選択すると、SampleExtensionLoad
イベントを使用できます。
Namespace My
Partial Friend Class MyApplication
' Custom event handler for Load event.
Private _sampleExtensionHandlers As EventHandler
Public Custom Event SampleExtensionLoad As EventHandler
AddHandler(ByVal value As EventHandler)
' Warning: This code is not thread-safe. Do not call
' this code from multiple concurrent threads.
If _sampleExtensionHandlers Is Nothing Then
AddHandler My.SampleExtension.Load, AddressOf OnSampleExtensionLoad
End If
_sampleExtensionHandlers =
System.Delegate.Combine(_sampleExtensionHandlers, value)
End AddHandler
RemoveHandler(ByVal value As EventHandler)
_sampleExtensionHandlers =
System.Delegate.Remove(_sampleExtensionHandlers, value)
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As EventArgs)
If _sampleExtensionHandlers IsNot Nothing Then
_sampleExtensionHandlers.Invoke(sender, e)
End If
End RaiseEvent
End Event
' Method called by custom event handler to raise user-defined
' event handlers.
<Global.System.ComponentModel.EditorBrowsable(
Global.System.ComponentModel.EditorBrowsableState.Advanced)>
Protected Overridable Sub OnSampleExtensionLoad(
ByVal sender As Object, ByVal e As EventArgs)
RaiseEvent SampleExtensionLoad(sender, e)
End Sub
' Event handler to call My.SampleExtensionLoad event.
Private Sub MyApplication_SampleExtensionLoad(
ByVal sender As Object, ByVal e As System.EventArgs
) Handles Me.SampleExtensionLoad
End Sub
End Class
End Namespace
設計ガイドライン
My
名前空間の拡張機能を開発する場合は、次のガイドラインを使用して、拡張機能コンポーネントのメンテナンス コストを最小限に抑えます。
- 拡張ロジックのみを含めます。
My
名前空間拡張機能に含まれるロジックには、My
名前空間で必要な機能を公開するために必要なコードのみが含まれている必要があります。 拡張機能はソース コードとしてユーザー プロジェクトに存在するため、拡張機能コンポーネントを更新すると高いメンテナンス コストが発生するため、可能であれば避ける必要があります。 - プロジェクトの前提条件を最小限に抑えます。
My
名前空間の拡張機能を作成するときは、参照、プロジェクト レベルのインポート、または特定のコンパイラ設定のセット (Option Strict
オフなど) は想定しないでください。 代わりに、Global
キーワードを使用して依存関係を最小限に抑え、すべての型参照を完全修飾します。 また、拡張機能のエラーを最小限に抑えるために、Option Strict
をオンにして拡張機能がコンパイルされるようにします。 - 拡張コードを分離します。 コードを 1 つのファイルに配置すると、拡張機能を Visual Studio 項目テンプレートとして簡単に展開できます。 詳細については、このトピックで後述する「拡張機能のパッケージ化と展開」を参照してください。
My
名前空間拡張コードをすべて 1 つのファイルまたはプロジェクト内の別のフォルダーに配置すると、ユーザーがMy
名前空間拡張機能を見つけるのにも役立ちます。
クラス ライブラリの設計 My
ほとんどのオブジェクト モデルの場合と同様に、一部のデザイン パターンは My
名前空間で適切に機能し、それ以外はうまく機能しません。
My
名前空間の拡張機能を設計するときは、次の原則を考慮してください。
- ステートレス メソッド。
My
名前空間のメソッドは、特定のタスクに対する完全なソリューションを提供する必要があります。 メソッドに渡されるパラメーター値によって、特定のタスクを完了するために必要なすべての入力が提供されていることを確認します。 リソースへの接続を開くなど、以前の状態に依存するメソッドを作成しないでください。 - グローバル インスタンス。
My
名前空間で維持される唯一の状態は、プロジェクトに対するグローバルです。 たとえば、My.Application.Info
は、アプリケーション全体で共有される状態をカプセル化します。 - 単純なパラメーター型。 複雑なパラメーター型を回避して、単純な処理を行います。 代わりに、パラメーター入力を受け取らず、または文字列、プリミティブ型などの単純な入力型を受け取るメソッドを作成します。
- ファクトリ メソッド。 一部の型は、必ずしもインスタンス化が困難です。
My
名前空間の拡張機能としてファクトリ メソッドを提供すると、このカテゴリに分類される型をより簡単に検出して使用できます。 適切に機能するファクトリ メソッドの例として、My.Computer.FileSystem.OpenTextFileReader
があります。 .NET Framework では、いくつかのストリームの種類を使用できます。 テキスト ファイルを具体的に指定することで、OpenTextFileReader
は、使用するストリームをユーザーが理解するのに役立ちます。
これらのガイドラインは、クラス ライブラリの一般的な設計原則を妨げるものではありません。 代わりに、Visual Basic と My
名前空間を使用している開発者向けに最適化された推奨事項です。 クラス ライブラリを作成するための一般的な設計原則については、「 フレームワーク設計ガイドライン」を参照してください。
拡張機能のパッケージ化とデプロイ
My
名前空間拡張機能を Visual Studio プロジェクト テンプレートに含めたり、拡張機能をパッケージ化して Visual Studio 項目テンプレートとしてデプロイしたりできます。
My
名前空間拡張機能を Visual Studio 項目テンプレートとしてパッケージ化すると、Visual Basic によって提供される追加機能を利用できます。 これらの機能を使用すると、プロジェクトが特定のアセンブリを参照するときに拡張機能を含めたり、Visual Basic プロジェクト デザイナーの [個人用拡張機能] ページを使用してMy
名前空間拡張機能を明示的に追加したりできます。
名前空間拡張機能 My
展開する方法の詳細については、「 カスタム個人用拡張機能のパッケージ化と展開」を参照してください。
こちらも参照ください
.NET