2013-05-17 3 views
1

Я хочу использовать переменную, которая входит в сферу действия всего моего проекта, что это хороший способ сделать это?Как объявить глобальную переменную с несколькими свойствами?

public User as (some type) 
(
var (sometype) 
var2 (sometype) 
) 

Пример:

If User.name = "ADMIN" Then 
    otherForm.Caption = User.name 
    otherForm.Show 
End If 

ответ

1

Если вы пытаетесь создать класс «настроек», как некоторые предложили, вы, вероятно, захотите посмотреть пространства имен My.Settings или My.Resources для VB .Net

Вы бы в конечном итоге с чем-то вроде:

If User.name = My.Settings.Admin Then 
    otherForm.Caption = User.name 
    otherForm.Show 
End If 

Является ли это то, что вы пытаетесь сделать?

Другой вариант - использовать модуль или класс «Открытый NotInheritable» с частным конструктором с общедоступными свойствами или константами. Как это:

Public NotInheritableClass ProjectSettings 

    Public Const Admin as String = "ADMIN" 
    Public Const Whatever as Decimal = 3.14D 

    Private Sub New() 
    End Sub 

End Class 

Тогда вы могли бы:

If User.name = ProjectSettings.Admin Then 
    otherForm.Caption = User.name 
    otherForm.Show 
End If 

Мне нравятся эти решения немного лучше, потому что нет никакого способа, которым вы можете создать экземпляр класса настроек.

Если вы хотите, чтобы ваш пользовательский класс был доступен по всему миру (что подразумевает наличие только одного данного Пользователя за раз), вы можете сделать что-то подобное с классом User.

EDIT: Ваш класс пользователя будет выглядеть так:

Public NotInheritableClass User 

    Public Const Name as String = "Some Name" 
    Public Property YouCanChangeThisProperty as String = "Change Me" 

    Private Sub New() 
    End Sub 

End Class 

Чтобы использовать его:

User.YouCanChangeThisProperty = "Changed" 
MessageBox.Show("User name: " & User.Name & "; the other property is now: " & User.YouCanChangeThisProperty") 

Это даст вам окно сообщения с: «Имя пользователя: Некоторые имя, другой имущество в настоящее время: Изменено «

+0

Да, это один пользователь за раз. – paulopulus

2

Я предлагаю вам определить класс для таких 'глобальных' свойств. Например, вы можете назвать его «ProjectSettings».

Public Class ProjectSettings 
    Public Shared CurrentUser as String 
    Public Shared DateTimeFormat as String 
    ...etc... 
    Public Shared Sub Initialize() 
    'Initialize your members here 
    End Sub 
End Class 

Снаружи, вы можете получить доступ к нему, как это:

ProjectSettings.CurrentUser 
ProjectSettings.DateTimeFormat 

Но помните, есть куча разных подходов, как это сделать. В приведенном выше случае вы также можете определить члены как Readonly Properties, убедившись, что никто случайно не перезаписывает значения. Или вы можете определить объект «Пользователь» для CurrentUser, если вам нужно сохранить больше данных.

Это действительно зависит от что вы хотите достичь с вашими глобальными свойствами. Важно только сохранить центральный, чтобы все в вашей команде (включая вас самих) знали, где их найти. Иначе это может легко привести к неструктурированному, плохому коду.

+1

@douglas: Там нет статических классов в vb.net. –

+1

Приведенный выше пример отлично работает. Просто попробуйте. MSDN: «Обмен членом класса или структуры делает его доступным для каждого экземпляра» –

+0

Он отлично работает, за исключением того, что он позволяет создавать экземпляр класса, что, вероятно, не является тем, что он хочет. Кто-то может каким-то образом создать экземпляр класса, изменить свойства на что-то еще, и поскольку они статичны (называются «shared» в VB), они будут перезаписывать то, что было определено в классе. Это может быть или не быть приемлемым для него. Если он использует константы вместо свойств, класс все равно может быть создан, но константы не могут быть перезаписаны. –

2

Вы можете создать класс, который инкапсулирует все эти данные внутри него:

Пример:

Public Class User 

    Public Property Name As String 
    Public Property Age As Integer 

    Sub New(_Name As String, _age As Integer) 
     Name = _Name 
     Age = _age 
    End Sub 

End Class 

Тогда, вы бы просто объявить его и установить свойства:

Dim U as new User("Thomas", 18) 
Messagebox.Show(U.Name) ' Will print "Thomas" 
+2

+1, но ваш ответ был бы лучше, если бы после объяснения классов он также обескуражил использование глобалов вообще. –

+1

Чтобы создать экземпляр класса и установить все значения программно, рода поражений, цель иметь класс со всеми вашими настройками в нем, если это то, что он пытается сделать. Если он просто хочет класс с глобально доступными переменными, это будет работать. –

+0

@DouglasBarbin хороший дизайн программного обеспечения почти никогда не определяется тем, насколько требуется типизация. Необходимость создать экземпляр класса один раз вряд ли так сложно, что это причина не делать этого таким образом. Поскольку настройки не должны храниться в глобальной переменной в любом случае, по крайней мере, если она хранится в объекте, ее можно передать в методы и классы, которые хотят (правильно) запрашивать настройки, а не (неправильно) обращаться к глобальную переменную для получения данных. Итак, пока все еще плохо, это, по крайней мере, шаг в правильном направлении. –

1

Вы можете создать новый класс с именем Пользователь

Public Class User 
    Private mstrName As String 
    Private mdBirth As Date 

    Public Property Name() As String 
     Get 
      Return mstrName 
     End Get 
     Set(ByVal vName As String) 
      mstrName = vName 
     End Set 
    End Property 

    Public Property BirthDate() As Date 
     Get 
      Return mdBirth 
     End Get 
     Set(ByVal vBirth As Date) 
      mdBirth = vBirth 
     End Set 
    End Property 

    ReadOnly Property Age() As Integer 
     Get 
      Return Now.Year - mdBirth.Year 
     End Get 
    End Property 
End Class 

Вы можете использовать этот класс, как это:

Dim Name1 as New User 
Name1.Name = "ADMIN" 
Name1.BirthDate = CDate("February 12, 1969") 

Затем проверьте его (MsgBox или любой другой):

Msgbox(Name1.Name) 
Msgbox(Name1.BirthDate.ToString & " and Now is " & format(Name1.Age) & " years old") 
Смежные вопросы