2012-01-31T23:25:37の更新内容

programming/vb.net/basics/10_namespace/index.wiki.txt

current previous
1,22 1,17
 
${smdncms:title,名前空間(Namespace)}
${smdncms:title,名前空間(Namespace)}
~
${smdncms:keywords,名前空間,Namespace,Imports,インポート,エイリアス,完全修飾名,ルート名前空間,既定の名前空間}
${smdncms:keywords,名前空間,Namespace,Imports}
 
#navi(..)
#navi(..)
 
名前空間とは、プロシージャや変数をまとめておく[[モジュール>programming/vb.net/basics/08_module]]や[[クラス>programming/vb.net/basics/12_class]]自体をまとめるための論理的な構造です。 すべてのモジュール・クラス(といくつかの要素)は必ず何らかの名前空間に属しています。 その一方、変数やプロシージャなどは必ずモジュールまたはクラスに属しているので、単独で名前空間に直接属することはありません。
名前空間とは、プロシージャや変数をまとめておく[[モジュール>programming/vb.net/basics/08_module]]や[[クラス>programming/vb.net/basics/12_class]]自体をまとめるための論理的な構造です。 すべてのモジュール・クラス(といくつかの要素)は必ず何らかの名前空間に属しています。 その一方、変数やプロシージャなどは必ずモジュールまたはクラスに属しているので、単独で名前空間に直接属することはありません。
 

        

        
~
名前空間は、モジュール・クラスをただ単にまとめるだけでなく、それらをグループ化することで識別子(名前)が重複するのを防ぐために使われます。 たとえば、.NET FrameworkのSystem名前空間にはInt32、Singleなどの基本型の構造体や、String、Array、Console、Mathなどのクラスが宣言されていますし、System.Windows.Forms名前空間にはフォームのコントロールとなるクラスが多数宣言されています。 独自に作成したクラスにStringやControlという名前を付けることも出来ますが、そういったクラスが個別の名前空間に格納されていれば、.NET Frameworkに存在する同名のクラスと区別することが可能になります。
名前空間は、モジュール・クラスをただ単にまとめるだけでなく、それらをグループ化することで識別子(名前)が重複するのを防ぐために使われます。 たとえば、.NET FrameworkのSystem名前空間にはInt32、Singleなどの基本型の構造体や、String、Array、Console、Mathなどのクラスが宣言されていますし、System.Windows.Forms名前空間にはフォームのコントロールとなるクラスが多数宣言されています。
 

        

        
 
-関連するページ
-関連するページ
 
--[[programming/netfx/classlibrary/0_howtocreate]]
--[[programming/netfx/classlibrary/0_howtocreate]]
 

        

        
 
#googleadunit(banner)
#googleadunit(banner)
 

        

        
+
*完全修飾名
+
モジュール・クラスをはじめ、すべての型は''完全修飾名''を持っています。 これはモジュール・クラスそれ自体の名前に加え、そのモジュール・クラスが宣言されている名前空間を連結した名前です。 すべての型はこの完全修飾名によって識別されます。
+

          
+
例えば、System名前空間にあるMathクラスはSystem.Math、System.Text名前空間にあるEncodingクラスはSystem.Text.Encodingがその完全修飾名となります。
+

          
 
*既定の名前空間
*既定の名前空間
~
すべてのモジュール・クラスは何らかの名前空間に属するとされていますが、このコードを見る限りは名前空間に関するキーワードは出てきません。
すべてのモジュール・クラスは何らかの名前空間に属するとしましたが、このコードを見る限りは名前空間に関するキーワードは出てきません。
 

        

        
 
#code(vb){{
#code(vb){{
 
Module MainModule
Module MainModule
37,7 32,7
 
「プロジェクトのプロパティ」ダイアログを開くと、「ルート名前空間」という項目がありますが、ここに記述されている名前が既定の名前空間になります。
「プロジェクトのプロパティ」ダイアログを開くと、「ルート名前空間」という項目がありますが、ここに記述されている名前が既定の名前空間になります。
 

        

        
 
*名前空間の宣言
*名前空間の宣言
~
特に名前空間を指定しない限りは、モジュールやクラスは既定の名前空間に属します。 指定した名前空間に属するようにする場合はNamespaceキーワードを使用します。
特に名前空間を指定しない限りは、モジュール・クラスは既定の名前空間に属します。 他の名前空間に属するようにする場合はNamespaceキーワードを使用します。
 

        

        
 
#code(vb){{
#code(vb){{
 
Namespace SampleNamespace
Namespace SampleNamespace
55,9 50,9
 
End Namespace
End Namespace
 
}}
}}
 

        

        
~
この例のように名前空間の宣言はNamespace〜End Namespaceで行い、その間の部分でモジュール・クラスを宣言します。
この例のように名前空間の宣言はNamespace〜End Namespaceで行い、その間にモジュール・クラスを宣言します。
 

        

        
~
この例において、既定の名前空間が ''MyProject'' の場合、宣言した名前空間は ''MyProject'' 名前空間に属する ''MyProject.SampleNamespace'' 名前空間になります。 また、MainModuleは ''MyProject.SamleNamespace'' 名前空間に属することになり、その完全修飾名は ''MyProject.SampleNamespace.MainModule'' となります。
この例において、既定の名前空間が「SampleProject」の場合、宣言した名前空間は「SampleProject」名前空間に属する「SampleProject.SampleNamespace」名前空間になります。 また、MainModuleは「SampleProject.SamleNamespace」名前空間に属することになります。
 

        

        
 
*他の名前空間からの参照
*他の名前空間からの参照
 
他の名前空間から別の名前空間にあるモジュールのプロシージャを参照する場合は次のようにします。
他の名前空間から別の名前空間にあるモジュールのプロシージャを参照する場合は次のようにします。
92,29 87,28
 
End Namespace
End Namespace
 
}}
}}
 

        

        
~
他の名前空間のモジュール内にあるメンバを参照するには &var{名前空間};.&var{モジュール名};.&var{メンバ名}; とします。 ただし、この例のようにモジュールで宣言されているメンバは、名前空間から記述する場合はモジュール名を省略して参照することも出来るため、単に &var{名前空間};.&var{プロシージャ名}; とする事もできます。
他の名前空間のモジュール内にあるプロシージャを参照するには「名前空間.モジュール名.プロシージャ名」とします。 ただしこの場合、 ShowMessage()プロシージャのスコープはPublicなので、モジュール名を省略することができ「名前空間.プロシージャ名」とする事もできます。
 

        

        
 
#code(vb){{
#code(vb){{
 
Sub Main()
Sub Main()
 

        

        
~
    ' ShowMessage()はモジュールのメンバなのでモジュール名を省略できる
    ' ShowMessage()はPublicなのでモジュール名を省略できる
 
    AnotherNamespace.ShowMessage()
    AnotherNamespace.ShowMessage()
 

        

        
 
End Sub
End Sub
 
}}
}}
 

        

        
 
*複数箇所での名前空間の宣言
*複数箇所での名前空間の宣言
~
同名の名前空間を複数に分割して宣言することもできます。 その場合、そこで宣言されているモジュール・クラスは同じ名前空間に属しているので当然互いに参照することができます。
同名の名前空間を複数箇所で宣言することができます。 その場合、そこで宣言されているモジュール・クラスは同じ名前空間に属しているので当然互いに参照することができます。
 

        

        
 
#code(vb){{
#code(vb){{
 
Namespace MainNamespace
Namespace MainNamespace
 

        

        
+
    ' 名前空間MainNamespaceのモジュールMainModule
 
    Module MainModule
    Module MainModule
 

        

        
 
        Sub Main()
        Sub Main()
 

        

        
~
            ' 同一名前空間にあるのでモジュール名は省略できる
            ' ShowMessage()はPublicなのでモジュール名を省略できる
 
            ShowMessage()
            ShowMessage()
 

        

        
 
        End Sub
        End Sub
127,7 121,6
 
' 同じMainNamespace名前空間であることに注目してください
' 同じMainNamespace名前空間であることに注目してください
 
Namespace MainNamespace
Namespace MainNamespace
 

        

        
+
    ' 名前空間MainNamespaceのモジュールAnotherModule
 
    Module AnotherModule
    Module AnotherModule
 

        

        
 
        Sub ShowMessage()
        Sub ShowMessage()
146,19 139,17
 
#code(vb){{
#code(vb){{
 
Namespace MainNamespace
Namespace MainNamespace
 

        

        
+
    ' 名前空間MainNamespaceのモジュールMainModule
 
    Module MainModule
    Module MainModule
 

        

        
 
        Sub Main()
        Sub Main()
 

        

        
~
            ' 同一名前空間にあるのでモジュール名を省略できる
            ' ShowMessage()はPublicなのでモジュール名を省略できる
 
            ShowMessage()
            ShowMessage()
 

        

        
 
        End Sub
        End Sub
 

        

        
 
    End Module
    End Module
 

        

        
+
    ' 名前空間MainNamespaceのモジュールAnotherModule
 
    Module AnotherModule
    Module AnotherModule
 

        

        
 
        Sub ShowMessage()
        Sub ShowMessage()

programming/vb.net/basics/08_module/index.wiki.txt

current previous
1,10 1,9
 
${smdncms:title,モジュール(Module)}
${smdncms:title,モジュール(Module)}
~
${smdncms:keywords,モジュール,標準モジュール,Module,宣言,クラスとの違い,bas}
${smdncms:keywords,モジュール,Module}
 
#navi(..)
#navi(..)
~
モジュールとはVB6以前のbasファイルのように、[[関数(もしくはプロシージャ・メソッド)>programming/vb.net/basics/07_procedure]]や変数など一連のソースコードをひとかたまりにしておくためのものです。
モジュールとはVB6以前のbasファイルのように、関数(メソッド)や変数など一連のソースコードをひとかたまりにしておくためのものです。
+

          
+
VB6以前ではbasファイル自体が一つのモジュールとなっていましたが、 VB.NETでは一つのファイルに一つ以上のモジュールを記述することができます。 また、VB6以前にあった「basファイルはモジュール、clsファイルはクラス」といった拡張子による区別もなくなり、モジュールと[[クラス>programming/vb.net/basics/12_class]]はどちらもvbファイルに記述でき、一つのファイルにモジュールやクラスを混在させたり複数記述させたりすることが出来るようになっています。 名称も、標準モジュールから単にモジュールと呼ばれるようになっています。
 

        

        
-
VB6以前ではbasファイル自体が一つのモジュールとなっていましたが、 VB.NETでは一つのファイルに一つ以上のモジュールを記述することができます。
 
#googleadunit(banner)
#googleadunit(banner)
 

        

        
 
*モジュールの宣言
*モジュールの宣言
25,7 24,6
 
これはもっとも基本的な「Hello, world!」プログラムですが、これがVB.NETプログラムの基本的な形でもあります。 ModuleキーワードからEnd Moduleキーワードまでがモジュールになり、同時に名前を与えることができます。 この場合のモジュールの名前は「MainModule」になっています。 モジュールは一つのvbファイルに複数記述できるので、次のようなコードも有効です。
これはもっとも基本的な「Hello, world!」プログラムですが、これがVB.NETプログラムの基本的な形でもあります。 ModuleキーワードからEnd Moduleキーワードまでがモジュールになり、同時に名前を与えることができます。 この場合のモジュールの名前は「MainModule」になっています。 モジュールは一つのvbファイルに複数記述できるので、次のようなコードも有効です。
 

        

        
 
#code(vb){{
#code(vb){{
+
' 一つ目のモジュール
 
Module MainModule
Module MainModule
 

        

        
 
    .
    .
33,7 31,6
 

        

        
 
End Module
End Module
 

        

        
+
' 二つ目のモジュール
 
Module SubModule
Module SubModule
 

        

        
 
    .
    .
46,157 43,14
 

        

        
 
なお、一つのファイルでモジュール以外にも複数の[[クラス>programming/vb.net/basics/12_class]]や[[構造体>programming/vb.net/basics/09_structure]]を宣言することができます。
なお、一つのファイルでモジュール以外にも複数の[[クラス>programming/vb.net/basics/12_class]]や[[構造体>programming/vb.net/basics/09_structure]]を宣言することができます。
 

        

        
~
*クラスとモジュールの違い
*クラスとモジュールの比較
~
VB.NETではクラスも一つのファイルではなくClassキーワードを使って宣言することができます。 クラスについては[[クラス>programming/vb.net/basics/12_class]]で詳しく説明しますが、モジュールとクラスの相違点を簡潔にまとめると次のようになります。
VB.NETではクラスも一つのファイルではなくClassキーワードを使って宣言することができます。 クラスについては[[クラス>programming/vb.net/basics/12_class]]で詳しく説明しますが、クラスから見たモジュールとの違いを簡潔にまとめておきます。
~

          
-クラスはインスタンス化できるが、モジュールはできない。
~
|~機能|~クラス|~モジュール|h
-クラスは継承することができるが、モジュールはできない。
~
|~インスタンス化|できる|できない|
-クラスはインターフェイスを実装できるが、モジュールはできない。
~
|~継承|できる|できない|
-クラスのメソッドは暗黙的にSharedではないが、モジュールは暗黙的にSharedである。
+
|~インターフェイスの実装|できる|できない|
+
|~メソッド|Sharedを付ければ共有メソッドとなる|すべてのメソッドは暗黙的に共有メソッドとなる|
+
|~型名を省略したメンバの参照|できない|できる|
+

          
+
このように、モジュールは特殊なクラスととらえることができ、インスタンスを生成できないクラス・C#における静的クラスとほぼ同等のものとなります。
+

          
+
モジュールとクラスのどちらを使うべきかは状況によりますが、ユーティリティメソッドなど様々な場面で呼び出されるような共通処理などを記述する場合はモジュールが向いています。 一方、インスタンス化できるのはクラスとなるので、内部で状態を持つオブジェクトを複数表現するような場合はクラスが向いています。
+

          
+
*変数の宣言
+
モジュール内で変数を宣言するには、プロシージャ内などで変数を宣言するのと同様、Dimを使います。 変数の宣言と同時に、初期値を与えることもできます。 モジュール内で宣言した変数は、そのモジュールのどこからでも参照することが出来ます。
+

          
+
#code(vb){{
+
Module MainModule
+

          
+
    ' モジュール内変数の宣言と初期値の代入
+
    Dim message As String = "Hello, world!"
+

          
+
    Sub Main()
+

          
+
        Console.WriteLine(message)
+

          
+
        ' モジュール内変数の値を変更する
+
        SetMessage("こんにちわ世界")
+

          
+
        Console.WriteLine(message)
+

          
+
    End Sub
+

          
+
    ' モジュール内変数の値を設定するプロシージャ
+
    Sub SetMessage(ByVal newMessage As String)
+

          
+
      ' 引数で指定された値を設定する
+
      message = newMessage
+

          
+
    End Sub
+

          
+
End Module
+
}}
+

          
+
#prompt(実行結果){{
+
Hello, world!
+
こんにちわ世界
+
}}
+

          
+
Dimで宣言した変数はモジュール内でのみ有効であり、他のモジュールやクラスからは参照することは出来ません。 一方、Dimの代わりにPublicで宣言すれば、他のモジュールやクラスからも参照することが出来るようになります。 他のモジュールで宣言されている変数には &var{モジュール名};.&var{変数名}; と記述することで参照できます。
+

          
+
#code(vb){{
+
Module MainModule
+

          
+
    Sub Main()
+

          
+
        ' モジュールSubModuleの変数Messageの内容を表示する
+
        Console.WriteLine(SubModule.Message)
+

          
+
        ' 他のモジュールの変数の値を変更する
+
        SubModule.Message = "こんにちわ世界"
+

          
+
        Console.WriteLine(SubModule.Message)
+

          
+
    End Sub
+

          
+
End Module
+

          
+
Module SubModule
+

          
+
    ' 他のモジュールからも参照できる変数
+
    Public Message As String = "Hello, world!"
+

          
+
End Module
+
}}
+

          
+
#prompt(実行結果){{
+
Hello, world!
+
こんにちわ世界
+
}}
+

          
+
DimとPublicの違いやアクセス修飾子については[[programming/vb.net/basics/11_accessibility]]を参照してください。
+

          
+
*モジュール名を省略したメンバの参照
+
モジュール同士が同一の[[名前空間>programming/vb.net/basics/10_namespace]]にあるか、もしくはImportステートメントでモジュールの名前空間がインポートされている場合は、モジュールのメンバを参照する際にモジュール名を省略することが出来ます。 先にあげた例でも2つのモジュールは同一名前空間にあるためモジュール名を省略することができ、次のように記述することが出来ます。
+

          
+
#code(vb,モジュール名を省略したメンバの参照){{
+
Module MainModule
+

          
+
    Sub Main()
+

          
+
        ' モジュールSubModuleの変数Messageの内容を表示する
+
        Console.WriteLine(Message)
+

          
+
        ' 他のモジュールの変数の値を変更する
+
        Message = "こんにちわ世界"
+

          
+
        Console.WriteLine(Message)
+

          
+
    End Sub
+

          
+
End Module
+

          
+
Module SubModule
+

          
+
    ' 他のモジュールからも参照できる変数
+
    Public Message As String = "Hello, world!"
+

          
+
End Module
+
}}
+

          
+
#prompt(実行結果){{
+
Hello, world!
+
こんにちわ世界
+
}}
+

          
+
vbNullやvbNewLineといったVB固有の定数群は&msdn(netfx,type,Microsoft.VisualBasic.dll,Microsoft.VisualBasic.Constants){Constantsモジュール};で宣言されているものですが、モジュール名を省略して使用できるのはこの機能により実現されています。
+

          
+
*入れ子
+
モジュールを入れ子構造にすることも出来ます。 入れ子になったモジュール内のメンバには、&var{外側のモジュール名};.&var{内側のモジュール名};.&var{メンバ名}; と記述することでアクセスできます。
+

          
+
#code(vb){{
+
Module MainModule
+

          
+
    Sub Main()
+

          
+
        ' 入れ子になったモジュールの変数を参照する
+
        Console.WriteLine(SubModule.NestedModule.Message)
+

          
+
    End Sub
+

          
+
End Module
+

          
+
Module SubModule
+

          
+
    ' 入れ子になったモジュール
+
    Module NestedModule
+

          
+
        Public Message As String = "Hello, world!"
+

          
+
    End Module
+

          
+
End Module
+
}}
+

          
+
#prompt(実行結果){{
+
Hello, world!
+
}}
 

        

        
~
なお、必要に応じてモジュールにもアクセス修飾子を付けることが出来ます。 モジュールのアクセス修飾子とメンバのアクセス修飾子の組み合わせによって、モジュール外部からのアクセスをどこまで許可するかを定めることが出来ます。
このように、モジュールは特殊なクラスととらえることもできます。
 

        

        
 
*Main()プロシージャ
*Main()プロシージャ
 
Main()プロシージャは特殊なプロシージャで、プログラムの開始点となるプロシージャです。 Main()プロシージャは一つのプログラムに必ず一つ記述する必要があります。 全く記述しなかったり、二つ以上記述することはできません。 ただ、VB.NETではフォームをアプリケーションのエントリーポイントに指定した場合はMain()プロシージャが存在しない場合もあります。
Main()プロシージャは特殊なプロシージャで、プログラムの開始点となるプロシージャです。 Main()プロシージャは一つのプログラムに必ず一つ記述する必要があります。 全く記述しなかったり、二つ以上記述することはできません。 ただ、VB.NETではフォームをアプリケーションのエントリーポイントに指定した場合はMain()プロシージャが存在しない場合もあります。
204,7 58,7
 
Main()プロシージャはモジュールだけでなく、共有メソッドとしてクラスで宣言することも可能です。 Main()プロシージャの形式については[[programming/vb.net/basics/00_console]]を参照してください。
Main()プロシージャはモジュールだけでなく、共有メソッドとしてクラスで宣言することも可能です。 Main()プロシージャの形式については[[programming/vb.net/basics/00_console]]を参照してください。
 

        

        
 
*New()プロシージャ
*New()プロシージャ
~
New()プロシージャも特殊なプロシージャで、これはVB.NETから導入されました。 すべてのモジュールはこのプロシージャを持つことができます。 New()プロシージャが記述されているモジュールでは、モジュールが読み込まれた時点でこのNew()プロシージャが実行されます。 次のコードでは、New()プロシージャでメッセージを初期化し、Main()プロシージャでそのメッセージを表示しています。
New()プロシージャも特殊なプロシージャで、これはVB.NETから採用されました。 すべてのモジュールはこのプロシージャを持つことができます。 New()プロシージャが記述されているモジュールでは、モジュールが読み込まれた時点でこのNew()プロシージャが実行されます。 次のコードでは、New()プロシージャでメッセージを初期化し、Main()プロシージャでそのメッセージを表示しています。
 

        

        
 
#code(vb){{
#code(vb){{
 
Module MainModule
Module MainModule

programming/vb.net/basics/09_structure/index.wiki.txt

current previous
1,5 1,5
 
${smdncms:title,構造体(Structure)}
${smdncms:title,構造体(Structure)}
~
${smdncms:keywords,構造体,Structure,ユーザー定義型,New,ReadOnly,WriteOnly,初期化,再初期化,ゼロクリア}
${smdncms:keywords,構造体,Structure,ReadOnly,WriteOnly}
 
#navi(..)
#navi(..)
 
構造体とは基本データ型をいくつか組み合わせた構造を持った型のことです。 VB6以前でのユーザー定義型は、VB.NETからは構造体という名称に変わり、機能も追加されています。
構造体とは基本データ型をいくつか組み合わせた構造を持った型のことです。 VB6以前でのユーザー定義型は、VB.NETからは構造体という名称に変わり、機能も追加されています。
 

        

        
128,7 128,7
 

        

        
 
ただ、この場合はメソッドではなくプロパティにした方が設計的には優れているかもしれません。 プロパティについては後述します。
ただ、この場合はメソッドではなくプロパティにした方が設計的には優れているかもしれません。 プロパティについては後述します。
 

        

        
~
*コンストラクタ (初期値の設定)
*コンストラクタ
 
構造体にNewという名前のメソッドを作成すると、それはコンストラクタとして扱われます。 コンストラクタは構造体変数が宣言されたときに呼び出される特殊なメソッドで、主にメンバ変数の初期化を行います。 ただし、クラスのコンストラクタとは異なり、構造体におけるコンストラクタは必ず1つ以上の引数を取る必要があります。 引数のないコンストラクタは暗黙的に作成されています。
構造体にNewという名前のメソッドを作成すると、それはコンストラクタとして扱われます。 コンストラクタは構造体変数が宣言されたときに呼び出される特殊なメソッドで、主にメンバ変数の初期化を行います。 ただし、クラスのコンストラクタとは異なり、構造体におけるコンストラクタは必ず1つ以上の引数を取る必要があります。 引数のないコンストラクタは暗黙的に作成されています。
 

        

        
 
次のコードは先ほどのRect構造体に、宣言時に初期化できるようなコンストラクタを追加した例です。
次のコードは先ほどのRect構造体に、宣言時に初期化できるようなコンストラクタを追加した例です。
190,109 190,6
 
Console.WriteLine("({0}, {1})-({2}, {3})", r.Left, r.Top, r.Right, r.Bottom)
Console.WriteLine("({0}, {1})-({2}, {3})", r.Left, r.Top, r.Right, r.Bottom)
 
}}
}}
 

        

        
+
*ゼロクリア (再初期化)
+
既に値が代入・設定されている構造体変数を初期化するには、Nothingを代入します。 Nothingを代入することで、構造体内の各フィールドには0など(参照型ならNothing)のデフォルト値が設定された状態になります。 これにより、構造体に対してゼロクリアに相当する再初期化を行うことが出来ます。 (型とそのデフォルト値については[[programming/netfx/basictypes]]を参照してください)
+

          
+
#code(vb){{
+
Structure Rect
+

          
+
    Dim Left As Integer
+
    Dim Top As Integer
+
    Dim Right As Integer
+
    Dim Bottom As Integer
+

          
+
    Sub New(ByVal l As Integer, ByVal t As Integer, ByVal r As Integer, ByVal b As Integer)
+

          
+
        Left = l
+
        Top = t
+
        Right = r
+
        Bottom = b
+

          
+
    End Sub
+

          
+
End Structure
+

          
+
Module MainModule
+

          
+
    Sub Main()
+

          
+
        ' 構造体変数を宣言し、初期値を設定
+
        Dim r As New Rect(160, 120, 640, 480)
+

          
+
        Console.WriteLine("({0}, {1})-({2}, {3})", r.Left, r.Top, r.Right, r.Bottom)
+

          
+
        ' Nothing(構造体の初期値)を代入して変数を再初期化
+
        r = Nothing
+

          
+
        Console.WriteLine("({0}, {1})-({2}, {3})", r.Left, r.Top, r.Right, r.Bottom)
+

          
+
    End Sub
+

          
+
End Module
+
}}
+

          
+
#prompt(実行結果){{
+
(160, 120)-(640, 480)
+
(0, 0)-(0, 0)
+
}}
+

          
+
構造体変数をNothing(何も参照していない状態・ヌル参照)にすることは出来ないことから、Nothingを代入することで変数を再初期化するのは一見すると予想と反する動作に見える点で注意が必要です。 Nothingの代入は、実際にはフィールドをすべてデフォルト値に設定するというよりは、暗黙のコンストラクタで初期化された値を代入して上書きすると言った方が適切でしょう。 次のように暗黙のコンストラクタを使って再初期化しても結果は同じで、両者は見た目・記述の違い程度でしかないため、コーディング規約や読みやすさなどを考慮して適切な方を選ぶとよいでしょう。
+

          
+
#code(vb){{
+
' 構造体変数を宣言し、初期値を設定
+
Dim r As New Rect(160, 120, 640, 480)
+

          
+
Console.WriteLine("({0}, {1})-({2}, {3})", r.Left, r.Top, r.Right, r.Bottom)
+

          
+
' 暗黙のコンストラクタで初期化された値を代入して変数を再初期化
+
r = New Rect
+
}}
+

          
+
また、あらかじめ初期値に相当する値を定数として用意しておいて、それを代入するという方法も取れます。 .NET Frameworkでも、&msdn(netfx,member,System.Drawing.dll,System.Drawing.Rectangle.Empty){Rectangle.Empty};、&msdn(netfx,member,System.Drawing.dll,System.Drawing.Point.Empty){Point.Empty};や&msdn(netfx,member,System.Decimal.Zero){Decimal.Zero};などといったフィールドがそのような方法にも使えるよう用意されています。
+

          
+
次の例は先のコードに追記してEmptyというフィールドを用意し、その値を代入することで変数を初期化しています。
+

          
+
#code(vb){{
+
Structure Rect
+

          
+
    Dim Left As Integer
+
    Dim Top As Integer
+
    Dim Right As Integer
+
    Dim Bottom As Integer
+

          
+
    Sub New(ByVal l As Integer, ByVal t As Integer, ByVal r As Integer, ByVal b As Integer)
+

          
+
        Left = l
+
        Top = t
+
        Right = r
+
        Bottom = b
+

          
+
    End Sub
+

          
+
    ' 初期値となる値の定数
+
    Public Shared ReadOnly Empty As Rect = New Rect
+

          
+
End Structure
+

          
+
Module MainModule
+

          
+
    Sub Main()
+

          
+
        ' 構造体変数を宣言し、初期値を設定
+
        Dim r As New Rect(160, 120, 640, 480)
+

          
+
        Console.WriteLine("({0}, {1})-({2}, {3})", r.Left, r.Top, r.Right, r.Bottom)
+

          
+
        ' 構造体の初期値の定数を代入して変数を初期化
+
        r = Rect.Empty
+

          
+
        Console.WriteLine("({0}, {1})-({2}, {3})", r.Left, r.Top, r.Right, r.Bottom)
+

          
+
    End Sub
+

          
+
End Module
+
}}
+

          
 
*プロパティ
*プロパティ
 
プロパティはすでにVBを使ったことがある方であれば概要は分かると思います。 ただ、VB6以前でのクラスのプロパティプロシージャの構文とは多少異なります。 プロパティ構文は次のようになっています。
プロパティはすでにVBを使ったことがある方であれば概要は分かると思います。 ただ、VB6以前でのクラスのプロパティプロシージャの構文とは多少異なります。 プロパティ構文は次のようになっています。
 

        

        

programming/vb.net/basics/01_variables/index.wiki.txt

current previous
1,5 1,5
 
${smdncms:title,変数とプリミティブ型}
${smdncms:title,変数とプリミティブ型}
~
${smdncms:keywords,変数,型,宣言,Dim,As,Static,Const,プリミティブ,ローカル,ブロック,定数,静的変数,サフィックス}
${smdncms:keywords,変数,型,宣言,Dim}
 
#navi(..)
#navi(..)
 

        

        
 
変数とは値を一時的に覚えておくためのものです。 イメージとしては、メモリ領域に確保された「箱」が変数であり、その中身が「変数の値」と言うような感じです。
変数とは値を一時的に覚えておくためのものです。 イメージとしては、メモリ領域に確保された「箱」が変数であり、その中身が「変数の値」と言うような感じです。
261,25 261,9
 
Const ci As Integer = 2
Const ci As Integer = 2
 

        

        
 
i = 15
i = 15
~
ci = 15 ' BC30074: 定数を代入式のターゲットにすることはできません。
ci = 15 ' 定数を代入式のターゲットにすることはできません。
 
}}
}}
 

        

        
+
*サフィックス
+
変数や定数を宣言する時に値の型をより厳密にするために''サフィックス''を付けることが出来ます。 デフォルトでは整数値はInteger、実数値はDoubleとみなされますが、LongやSingleと明示した上で代入したい場合などはそれぞれ次のように型を表す記号を値の後ろに付けます。
+

          
+
#code(vb){{
+
Dim i As Integer = 7 ' サフィックスなし(Integer型の値)
+
Dim l As Long = 100000000000L ' Long型の値であることを明示するサフィックス付き
+

          
+
Dim d As Double = 3.1415926535 ' サフィックスなし(Double型・倍精度の値)
+
Dim s As Single = 3.1416F ' Single型(単精度)の値であることを明示するサフィックス付き
+

          
+
Dim str As String = "あいう" ' サフィックスなし(String型・文字列)
+
Dim ch As Char = "あ"c ' Char型(文字)であることを明示するサフィックス付き
+
}}
+

          
+
VBで指定できるサフィックスの一覧は[[programming/netfx/basictypes]]を参照してください。
+

          
 
*静的変数
*静的変数
 
静的な変数を宣言するにはStaticを用います。 静的変数は、そのスコープから抜けても変数の値を保持し続けます。
静的な変数を宣言するにはStaticを用います。 静的変数は、そのスコープから抜けても変数の値を保持し続けます。