Visual Basic のオブジェクトとクラスObjects and classes in Visual Basic

"オブジェクト" は、1 つの単位として扱うことができるコードとデータの組み合わせです。An object is a combination of code and data that can be treated as a unit. オブジェクトは、コントロールやフォームのように、アプリケーションの一部になることができます。An object can be a piece of an application, like a control or a form. アプリケーション全体も、オブジェクトになることができます。An entire application can also be an object.

Visual Basic でアプリケーションを作成する場合は、常にオブジェクトを操作します。When you create an application in Visual Basic, you constantly work with objects. Visual Basic によって提供されるオブジェクト (コントロール、フォーム、データアクセスオブジェクトなど) を使用できます。You can use objects provided by Visual Basic, such as controls, forms, and data access objects. また、Visual Basic アプリケーション内の他のアプリケーションのオブジェクトを使用することもできます。You can also use objects from other applications within your Visual Basic application. 独自のオブジェクトを作成し、それらのプロパティとメソッドを追加で定義することもできます。You can even create your own objects and define additional properties and methods for them. オブジェクトはプログラムの作成済みの構成要素として機能し、コードを一度記述すれば、何度も再利用できます。Objects act like prefabricated building blocks for programs — they let you write a piece of code once and reuse it over and over.

このトピックでは、オブジェクトの詳細について説明します。This topic discusses objects in detail.

オブジェクトとクラスObjects and classes

Visual Basic 内の各オブジェクトは、クラスによって定義されます。Each object in Visual Basic is defined by a class. クラスは、オブジェクトの変数、プロパティ、プロシージャ、およびイベントを記述します。A class describes the variables, properties, procedures, and events of an object. オブジェクトはクラスのインスタンスです。クラスを定義したら、必要な数のオブジェクトを作成することができます。Objects are instances of classes; you can create as many objects you need once you have defined a class.

オブジェクトとそのクラス間の関係を理解するために、クッキーの抜き型とクッキーを考えてみましょう。To understand the relationship between an object and its class, think of cookie cutters and cookies. クッキーの抜き型はクラスです。The cookie cutter is the class. それは、クッキーの特徴 (大きさや形など) を定義します。It defines the characteristics of each cookie, for example size and shape. クラスを使用して、オブジェクトを作成します。The class is used to create objects. オブジェクトはクッキーです。The objects are the cookies.

メンバーにアクセスする前に、オブジェクトを作成する必要があります。You must create an object before you can access its members.

クラスからオブジェクトを作成するにはTo create an object from a class

  1. オブジェクトの作成元となるクラスを決定します。Determine from which class you want to create an object.

  2. Dim ステートメントを記述して、クラス インスタンスを割り当てることができる変数を作成します。Write a Dim Statement to create a variable to which you can assign a class instance. 変数は、目的のクラスの型にする必要があります。The variable should be of the type of the desired class.

    Dim nextCustomer As customer
  3. New 演算子キーワードを追加して、変数をクラスの新しいインスタンスに初期化します。Add the New Operator keyword to initialize the variable to a new instance of the class.

    Dim nextCustomer As New customer
  4. これで、オブジェクト変数を使用してクラスのメンバーにアクセスできるようになりました。You can now access the members of the class through the object variable.

    nextCustomer.accountNumber = lastAccountNumber + 1


可能であれば、変数は、変数に割り当てる予定のクラスの型で宣言する必要があります。Whenever possible, you should declare the variable to be of the class type you intend to assign to it. これは、事前バインディングと呼ばれます。This is called early binding. コンパイル時にクラスの型を把握していない場合は、変数を Object データ型で宣言することで、遅延バインディングを呼び出すことができます。If you don't know the class type at compile time, you can invoke late binding by declaring the variable to be of the Object Data Type. ただし、遅延バインディングでは、パフォーマンスが低下し、実行時のオブジェクトのメンバーへのアクセスが制限される可能性があります。However, late binding can make performance slower and limit access to the run-time object's members. 詳細については、「オブジェクト変数の宣言」を参照してください。For more information, see Object Variable Declaration.

複数インスタンスMultiple instances

多くの場合、クラスから新しく作成されたオブジェクトは互いに同一です。Objects newly created from a class are often identical to each other. ただし、個々のオブジェクトとして存在した後、それぞれの変数とプロパティは、他のインスタンスとは無関係に変更することができます。Once they exist as individual objects, however, their variables and properties can be changed independently of the other instances. たとえば、次の 3 つのチェック ボックスをフォームに追加する場合、各チェック ボックスのオブジェクトは、CheckBox クラスのインスタンスになります。For example, if you add three check boxes to a form, each check box object is an instance of the CheckBox class. 個々の CheckBox オブジェクトは、クラスによって定義された特性と機能 (プロパティ、変数、プロシージャ、およびイベント) の共通セットを共有します。The individual CheckBox objects share a common set of characteristics and capabilities (properties, variables, procedures, and events) defined by the class. ただし、それぞれが独自の名前を持ち、別々に有効または無効にすることができ、フォームの異なる場所に配置することができます。However, each has its own name, can be separately enabled and disabled, and can be placed in a different location on the form.

オブジェクトのメンバーObject members

オブジェクトはアプリケーションの要素であり、クラスの "インスタンス" を表しています。An object is an element of an application, representing an instance of a class. フィールド、プロパティ、メソッド、およびイベントは、オブジェクトの構成要素であり、オブジェクトのメンバーを構成します。Fields, properties, methods, and events are the building blocks of objects and constitute their members.

メンバー アクセスMember Access

オブジェクトのメンバーにアクセスするには、オブジェクト変数の名前、ピリオド (.)、およびメンバーの名前をこの順序で指定します。You access a member of an object by specifying, in order, the name of the object variable, a period (.), and the name of the member. Label オブジェクトの Text プロパティを設定する例を次に示します。The following example sets the Text property of a Label object.

warningLabel.Text = "Data not saved"

メンバーの IntelliSense の一覧IntelliSense listing of members

IntelliSense は、[メンバーの一覧] オプションが呼び出されたとき (たとえばメンバー アクセス演算子としてピリオド (.) が入力されたとき) に、クラスのメンバーを一覧表示します。IntelliSense lists members of a class when you invoke its List Members option, for example when you type a period (.) as a member-access operator. ピリオドに続けて、そのクラスのインスタンスとして宣言された変数の名前を入力すると、IntelliSense は、すべてのインスタンス メンバーを表示しますが、共有メンバーは表示しません。If you type the period following the name of a variable declared as an instance of that class, IntelliSense lists all the instance members and none of the shared members. クラス名に続けてピリオドを入力すると、IntelliSense は、すべての共有メンバーを表示し、インスタンス メンバーは表示しません。If you type the period following the class name itself, IntelliSense lists all the shared members and none of the instance members. 詳細については、「IntelliSense の使用」を参照してください。For more information, see Using IntelliSense.

フィールドとプロパティFields and properties

"フィールド" と "プロパティ" は、オブジェクトに格納されている情報を表します。Fields and properties represent information stored in an object. 代入ステートメントによる値の取得と設定は、プロシージャでローカル変数の取得と設定を行うのと同じ方法で実行します。You retrieve and set their values with assignment statements the same way you retrieve and set local variables in a procedure. 次の例では Width プロパティを取得し、Label オブジェクトの ForeColor プロパティを設定しています。The following example retrieves the Width property and sets the ForeColor property of a Label object.

Dim warningWidth As Integer = warningLabel.Width
warningLabel.ForeColor = System.Drawing.Color.Red

フィールドは、"メンバー変数" とも呼ばれます。Note that a field is also called a member variable.

次の場合は、プロパティ プロシージャを使用します。Use property procedures when:

  • 値を設定または取得するタイミングと方法を制御する必要がある。You need to control when and how a value is set or retrieved.

  • プロパティに、検証する必要がある適切に定義された一連の値がある。The property has a well-defined set of values that need to be validated.

  • 値を設定することで、オブジェクトの状態をはっきりと変更する (例: IsVisible プロパティ)。Setting the value causes some perceptible change in the object's state, such as an IsVisible property.

  • プロパティを設定することで、他の内部変数またはその他のプロパティの値を変更する。Setting the property causes changes to other internal variables or to the values of other properties.

  • プロパティを設定または取得する前に、一連の手順を実行する必要がある。A set of steps must be performed before the property can be set or retrieved.

次の場合は、フィールドを使用します。Use fields when:

  • 値は自己検証型である。The value is of a self-validating type. たとえば、Boolean 変数に True または False の値が割り当てられた場合は、エラーまたはデータの自動変換が発生します。For example, an error or automatic data conversion occurs if a value other than True or False is assigned to a Boolean variable.

  • データ型によってサポートされている範囲の値はすべて有効である。Any value in the range supported by the data type is valid. これは、Single 型または Double 型の多くのプロパティに当てはまります。This is true of many properties of type Single or Double.

  • プロパティは String データ型であり、文字列のサイズまたは値に制限がない。The property is a String data type, and there is no constraint on the size or value of the string.

  • 詳細については、「プロパティ プロシージャ」を参照してください。For more information, see Property Procedures.


"メソッド" は、オブジェクトが実行できる処理です。A method is an action that an object can perform. たとえば、Add は、コンボ ボックスに新しいエントリを追加する ComboBox オブジェクトのメソッドです。For example, Add is a method of the ComboBox object that adds a new entry to a combo box.

次の例は、Timer オブジェクトの Start メソッドを示しています。The following example demonstrates the Start method of a Timer object.

Dim safetyTimer As New System.Windows.Forms.Timer

メソッドは、オブジェクトによって公開される "プロシージャ" です。Note that a method is simply a procedure that is exposed by an object.

詳細については、「プロシージャ」を参照してください。For more information, see Procedures.


イベントは、マウスのクリックやキーの押下などのオブジェクトによって認識される操作であり、それに応答するコードを記述できます。An event is an action recognized by an object, such as clicking the mouse or pressing a key, and for which you can write code to respond. イベントは、ユーザーの操作またはプログラム コードの結果として発生する可能性がありますが、システムによって発生する場合もあります。Events can occur as a result of a user action or program code, or they can be caused by the system. イベントを通知するコードを、イベントを "発生させる" と言い、イベントに応答するコードを、イベントを "処理する" と言います。Code that signals an event is said to raise the event, and code that responds to it is said to handle it.

オブジェクトによって発生する独自のカスタム イベントを作成し、その他のオブジェクトで処理することもできます。You can also develop your own custom events to be raised by your objects and handled by other objects. 詳細については、「イベント」を参照してください。For more information, see Events.

インスタンス メンバーと共有メンバーInstance members and shared members

クラスからオブジェクトを作成した結果が、そのクラスのインスタンスになります。When you create an object from a class, the result is an instance of that class. Shared キーワードなしで宣言されたメンバーは、"インスタンス メンバー" になり、特定のインスタンスにのみ属します。Members that are not declared with the Shared keyword are instance members, which belong strictly to that particular instance. あるインスタンスのインスタンス メンバーは、同じクラスの別のインスタンスに同じメンバーがあっても互いに独立しています。An instance member in one instance is independent of the same member in another instance of the same class. たとえばインスタンス メンバー変数は、インスタンスごとに異なる値を持つことができます。An instance member variable, for example, can have different values in different instances.

Shared キーワード付きで宣言されたメンバーは "共有メンバー" になり、全体がクラスに属し、特定のインスタンスには属しません。Members declared with the Shared keyword are shared members, which belong to the class as a whole and not to any particular instance. 共有メンバーは、作成するクラスのインスタンスの数に関係なく 1 度だけ存在します。これは、インスタンスを作成していない場合でも同じです。A shared member exists only once, no matter how many instances of its class you create, or even if you create no instances. たとえば共有メンバー変数は、クラスにアクセスできるすべてのコードが使用できる 1 つの値のみを持っています。A shared member variable, for example, has only one value, which is available to all code that can access the class.

非共有メンバーへのアクセスAccessing nonshared members

オブジェクトの非共有メンバーにアクセスするにはTo access a nonshared member of an object
  1. オブジェクトがクラスから作成され、オブジェクト変数に割り当てられていることを確認してください。Make sure the object has been created from its class and assigned to an object variable.

    Dim secondForm As New System.Windows.Forms.Form
  2. メンバーにアクセスするステートメントで、てオブジェクト変数名に続けて、"メンバー アクセス演算子" (.) とメンバー名を指定します。In the statement that accesses the member, follow the object variable name with the member-access operator (.) and then the member name.


共有メンバーへのアクセスAccessing shared members

オブジェクトの共有メンバーにアクセスするにはTo access a shared member of an object
  • クラス名に続けて、"メンバー アクセス演算子" (.) とメンバー名を指定します。Follow the class name with the member-access operator (.) and then the member name. オブジェクトの Shared メンバーは、常にクラス名から直接アクセスする必要があります。You should always access a Shared member of the object directly through the class name.

    MsgBox("This computer is called " & Environment.MachineName)
  • 既にクラスからオブジェクトを作成している場合は、オブジェクト変数を使用して Shared メンバーにアクセスすることもできます。If you have already created an object from the class, you can alternatively access a Shared member through the object's variable.

クラスとモジュールの違いDifferences between classes and modules

クラスとモジュールの主な違いは、クラスはオブジェクトとしてインスタンス化できますが、標準モジュールではできないことです。The main difference between classes and modules is that classes can be instantiated as objects while standard modules cannot. 標準モジュールのデータは 1 つしかないため、プログラムのある部分が標準モジュールのパブリック変数を変更した場合、その後、プログラムの他の部分がその変数を読み取ると、変更後の値が取得されます。Because there is only one copy of a standard module's data, when one part of your program changes a public variable in a standard module, any other part of the program gets the same value if it then reads that variable. これに対し、オブジェクト データは、インスタンス化されたオブジェクトごとに個別に存在します。In contrast, object data exists separately for each instantiated object. 別の相違点は、標準モジュールとは異なり、クラスはインターフェイスを実装できることです。Another difference is that unlike standard modules, classes can implement interfaces.


Shared 修飾子は、クラス メンバーに適用された場合は、クラスの特定のインスタンスではなく、クラス自体に関連付けられます。When the Shared modifier is applied to a class member, it is associated with the class itself instead of a particular instance of the class. メンバーへのアクセスは、モジュール メンバーへのアクセス方法と同じように、クラス名を使用して直接行います。The member is accessed directly by using the class name, the same way module members are accessed.

さらに、クラスとモジュールは、メンバーに対して異なるスコープを使用します。Classes and modules also use different scopes for their members. クラス内に定義されているメンバーのスコープはクラスの特定のインスタンス内に限られ、オブジェクトの有効期間のみ存在します。Members defined within a class are scoped within a specific instance of the class and exist only for the lifetime of the object. クラスの外部からクラス メンバーにアクセスするには、"オブジェクト.メンバー" 形式の完全修飾名を使用する必要があります。To access class members from outside a class, you must use fully qualified names in the format of Object.Member.

その一方で、モジュール内に宣言されているメンバーは、既定ではパブリックにアクセスすることができ、モジュールにアクセスできるすべてのコードからアクセスできます。On the other hand, members declared within a module are publicly accessible by default, and can be accessed by any code that can access the module. つまり、標準モジュール内の変数は、プロジェクト内の任意の場所から参照でき、プログラムが実行されている間は存在するため、実質的にはグローバル変数です。This means that variables in a standard module are effectively global variables because they are visible from anywhere in your project, and they exist for the life of the program.

クラスとオブジェクトの再利用Reusing classes and objects

オブジェクトを使用すると、変数とプロシージャを 1 度宣言した後、必要に応じていつでもそれらを再利用できます。Objects let you declare variables and procedures once and then reuse them whenever needed. たとえば、スペル チェック機能をアプリケーションに追加する場合は、スペル チェック機能を提供するためのすべての変数とサポート機能を定義することができます。For example, if you want to add a spelling checker to an application you could define all the variables and support functions to provide spell-checking functionality. スペル チェック機能をクラスとして作成した場合は、コンパイルされたアセンブリへの参照を追加することで、他のアプリケーションで再利用できます。If you create your spelling checker as a class, you can then reuse it in other applications by adding a reference to the compiled assembly. さらに、誰かが既に開発したスペル チェック機能のクラスを使用することで、作業の手間を省くことができます。Better yet, you may be able to save yourself some work by using a spelling checker class that someone else has already developed.

.NET Framework には、使用可能なコンポーネントの例が多数用意されています。The .NET Framework provides many examples of components that are available for use. 次の例では、System 名前空間に TimeZone クラスが使用されています。The following example uses the TimeZone class in the System namespace. TimeZone は、現在のコンピューター システムのタイム ゾーンに関する情報を取得できるメンバーを提供します。TimeZone provides members that allow you to retrieve information about the time zone of the current computer system.

Public Sub examineTimeZone()
    Dim tz As System.TimeZone = System.TimeZone.CurrentTimeZone
    Dim s As String = "Current time zone is "
    s &= CStr(tz.GetUtcOffset(Now).Hours) & " hours and "
    s &= CStr(tz.GetUtcOffset(Now).Minutes) & " minutes "
    s &= "different from UTC (coordinated universal time)"
    s &= vbCrLf & "and is currently "
    If tz.IsDaylightSavingTime(Now) = False Then s &= "not "
    s &= "on ""summer time""."
End Sub

上記の例では、最初の Dim ステートメントTimeZone 型のオブジェクト変数を宣言し、CurrentTimeZone プロパティによって返された TimeZone オブジェクトに割り当てています。In the preceding example, the first Dim Statement declares an object variable of type TimeZone and assigns to it a TimeZone object returned by the CurrentTimeZone property.

オブジェクト間の関係Relationships among objects

オブジェクトは、いくつかの方法で相互に関連付けることができます。Objects can be related to each other in several ways. リレーションシップの主要な種類は、"階層" と "含有" です。The principal kinds of relationship are hierarchical and containment.

階層関係Hierarchical relationship

より基礎的なクラスから派生したクラスは、"階層関係" があると言います。When classes are derived from more fundamental classes, they are said to have a hierarchical relationship. クラスの階層は、より一般的なクラスのサブタイプである項目を記述する場合に便利です。Class hierarchies are useful when describing items that are a subtype of a more general class.

次の例では、通常の Button と同じように機能しますが、前景と背景の色を逆転させるメソッドも公開する、特殊な Button を定義します。In the following example, suppose you want to define a special kind of Button that acts like a normal Button but also exposes a method that reverses the foreground and background colors.

既に存在するクラスから派生するクラスを定義するのにはTo define a class is derived from an already existing class

  1. Class ステートメントを使用して、必要なオブジェクトの作成元となるクラスを定義します。Use a Class Statement to define a class from which to create the object you need.

    Public Class reversibleButton

    クラスのコードの最後の行の後に、必ず End Class ステートメントを指定してください。Be sure an End Class statement follows the last line of code in your class. 統合開発環境 (IDE) では、既定により、Class ステートメントを入力すると、End Class が自動的に生成されます。By default, the integrated development environment (IDE) automatically generates an End Class when you enter a Class statement.

  2. Class ステートメントの直後に、Inherits ステートメントを記述します。Follow the Class statement immediately with an Inherits Statement. 新しいクラスの派生元クラスを指定します。Specify the class from which your new class derives.

    Inherits System.Windows.Forms.Button

    新しいクラスは、基本クラスによって定義されたすべてのメンバーを継承します。Your new class inherits all the members defined by the base class.

  3. 派生クラスで公開される追加のメンバー用のコードを追加します。Add the code for the additional members your derived class exposes. たとえば、reverseColors メソッドを追加すると、派生クラスは次のようになります。For example, you might add a reverseColors method, and your derived class might look as follows:

    Public Class reversibleButton
        Inherits System.Windows.Forms.Button
            Public Sub reverseColors()
                Dim saveColor As System.Drawing.Color = Me.BackColor
                Me.BackColor = Me.ForeColor
                Me.ForeColor = saveColor
           End Sub
    End Class

    reversibleButton クラスからオブジェクトを作成すると、オブジェクトは、Button クラスのすべてのメンバーだけでなく、reverseColors メソッドとreversibleButton に定義したその他の新しいメンバーにもアクセスできます。If you create an object from the reversibleButton class, it can access all the members of the Button class, as well as the reverseColors method and any other new members you define on reversibleButton.

派生クラスは、派生元のクラスからメンバーを継承するため、クラス階層が深くなるにつれて、クラスをより複雑にすることができます。Derived classes inherit members from the class they are based on, allowing you to add complexity as you progress in a class hierarchy. 詳細については、「継承の基本」を参照してください。For more information, see Inheritance Basics.

コードのコンパイルCompile the code

コンパイラが、新しいクラスの派生元となるクラスにアクセスできることを確認します。Be sure the compiler can access the class from which you intend to derive your new class. これは、上記の例のように名前を完全に修飾するか、名前空間を Imports ステートメント (.NET 名前空間と型) で識別することを意味する場合があります。This might mean fully qualifying its name, as in the preceding example, or identifying its namespace in an Imports Statement (.NET Namespace and Type). クラスが別のプロジェクト内にある場合は、そのプロジェクトへの参照の追加が必要になることがあります。If the class is in a different project, you might need to add a reference to that project. 詳細については、「プロジェクト内の参照の管理」を参照してください。For more information, see Managing references in a project.

含有リレーションシップContainment relationship

オブジェクトを関連付けることのできる別の方法は、"含有関係" にすることです。Another way that objects can be related is a containment relationship. コンテナー オブジェクトは、その他のオブジェクトを論理的にカプセル化します。Container objects logically encapsulate other objects. たとえば、OperatingSystem オブジェクトには、その Version プロパティによって返される Version オブジェクトが論理的に含まれています。For example, the OperatingSystem object logically contains a Version object, which it returns through its Version property. コンテナー オブジェクトが物理的にその他のオブジェクトを含んでいるわけではないことに注意してください。Note that the container object does not physically contain any other object.


特別な種類のオブジェクトの含有として、"コレクション" と表現されるものがあります。One particular type of object containment is represented by collections. コレクションは、列挙できる、類似したオブジェクトのグループです。Collections are groups of similar objects that can be enumerated. Visual Basic の For Each...Next ステートメントには、コレクションの項目を反復処理するための特別な構文があります。Visual Basic supports a specific syntax in the For Each...Next Statement that allows you to iterate through the items of a collection. さらに、多くの場合、コレクションでは、Item[String] を使用して、その要素を、インデックスまたは一意の文字列の関連付けによって取得することができます。Additionally, collections often allow you to use an Item[String] to retrieve elements by their index or by associating them with a unique string. コレクションは、インデックスなしで項目を削除または追加できるため、配列よりも簡単に使用できます。Collections can be easier to use than arrays because they allow you to add or remove items without using indexes. 簡単に使用できるため、多くの場合、コレクションは、フォームとコントロールを格納するために使用されます。Because of their ease of use, collections are often used to store forms and controls.

チュートリアル: クラスの定義Walkthrough: Defining Classes
クラスを作成する方法を手順を追って説明します。Provides a step-by-step description of how to create a class.

オーバーロードされたプロパティとメソッドOverloaded Properties and Methods
オーバーロードされたプロパティとメソッドOverloaded Properties and Methods

継承の基本Inheritance Basics
継承修飾子、メソッドとプロパティのオーバーライド、MyClass、および MyBase について説明します。Covers inheritance modifiers, overriding methods and properties, MyClass, and MyBase.

オブジェクトの有効期間: オブジェクトの作成と破棄Object Lifetime: How Objects Are Created and Destroyed
クラス インスタンスの作成と破棄について説明します。Discusses creating and disposing of class instances.

匿名型Anonymous Types
匿名型を作成して使用する方法について説明します。匿名型を使用すると、データ型のクラス定義を記述せずにオブジェクトを作成できます。Describes how to create and use anonymous types, which allow you to create objects without writing a class definition for the data type.

オブジェクト初期化子 : 名前付きの型と匿名型Object Initializers: Named and Anonymous Types
1 つの式で名前付きの型と匿名型のインスタンスを作成するために使用する、オブジェクト初期化子について説明します。Discusses object initializers, which are used to create instances of named and anonymous types by using a single expression.

方法: 匿名型の宣言でプロパティの名前と型を推論するHow to: Infer Property Names and Types in Anonymous Type Declarations
匿名型で宣言されたプロパティの名前と型を推論する方法について説明します。Explains how to infer property names and types in anonymous type declarations. 推論の成功例と失敗例を示します。Provides examples of successful and unsuccessful inference.