Zev Spitz
Zev Spitz

Reputation: 15337

Prevent public module variables from being globally accessible

If I have the following code:

Public Module MyModule
    Public MyVariable As Integer
End Module

VB.NET allows unqualified access to the variable (field) from anywhere in the project, which means I can write the following anywhere in the project1:

MyVariable = 5

Is there any way to disable this behavior on a specific type, such that I can only access the variable via the module name?

MyModule.MyVariable = 5

NB. I know I can use a standard class, and the Shared keyword on all the members:

Public Class MyModule
    Public Shared MyVariable
End Class

1. If I use Friend instead of Public on the module, this functionality will only apply to the assembly, not the entire project.

Upvotes: 1

Views: 143

Answers (1)

First, those need not be Public to get the global variable behavior. Friend will also work:

The Friend keyword in the declaration statement specifies that the elements can be accessed from within the same assembly, but not from outside the assembly.

If you put your module in a different namespace, you can get the behavior you are after:

Namespace Plutonix
    Friend Module GlobalVars
        Friend MyVariable As Int32
    End Module
End Namespace

Unfortunately, VB will prepend the project Namespace to whatever you use so your import would be something like:

Imports PrjNamespace.Plutonix

But then you get what you are after:

GlobalVars.MyVariable = 9

Personally, I think the class version or as few global variables as possible is better

Upvotes: 3

Related Questions