我想使用一个在我的项目范围内的变量,有什么好的方法来实现这个目标?如何声明一个具有多个属性的全局变量?
public User as (some type)
(
var (sometype)
var2 (sometype)
)
例子:
If User.name = "ADMIN" Then
otherForm.Caption = User.name
otherForm.Show
End If
我想使用一个在我的项目范围内的变量,有什么好的方法来实现这个目标?如何声明一个具有多个属性的全局变量?
public User as (some type)
(
var (sometype)
var2 (sometype)
)
例子:
If User.name = "ADMIN" Then
otherForm.Caption = User.name
otherForm.Show
End If
如果您尝试让某个“设置”类像某些人所建议的那样,您可能需要查看VB的My.Settings或My.Resources命名空间.Net
你最终会得到这样的:
If User.name = My.Settings.Admin Then
otherForm.Caption = User.name
otherForm.Show
End If
难道这就是你想干什么?
您的其他选择是使用具有公共属性或常量的私有构造函数的模块或“Public 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类会是什么样子:
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")
这会给你一个消息框: “用户名:有些名称;另属性为:更改“
我建议你定义一个类这样的 '全球性' 的属性。例如,您可以将其命名为'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
但是请记住,也有如何做到这一点不同的方法堆。 在上述情况下,您还可以将成员定义为只读属性,确保没有人意外覆盖这些值。或者,如果您需要存储更多数据,则可以为CurrentUser定义一个对象“用户”。
这真的取决于你想要达到与你的全球性能。只有让他们保持中央这样才能让团队中的每个人(包括你自己)都知道在哪里找到他们。否则它很容易导致非结构化的错误代码。
@douglas:没有静态类在vb.net。 –
上面的例子工作得很好。试试吧。 MSDN:“共享类或结构的成员使其可用于每个实例” –
它工作正常,但它允许类实例化,这可能不是他想要的。有人可以在某处实例化该类,将属性更改为其他类型,并且由于它们是静态的(在VB中称为“共享”),它们将覆盖类中定义的内容。这可能会或可能不会被他接受。如果他使用常量而不是属性,那么类仍然可以被实例化,但常量不能被覆盖。 –
您可以创建一个类,它将所有这些数据里面它:
例子:
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"
+1,但如果在解释课程之后,你的答案会更好,但它也不鼓励使用全局变量。 –
必须实例化类并以编程方式设置所有值,这种方式会让您拥有一个拥有所有设置的类的目的,如果这是他正在尝试做的。如果他只想要一个具有全局可访问变量的类,这将起作用。 –
@DouglasBarbin良好的软件设计几乎从不决定需要多少打字。不得不一次性实例化一个类不是那么困难,这是不这样做的原因。由于设置不应该存储在一个全局变量中,至少如果它存储在一个对象中,它可以被传递到想要(正确)请求设置而不是(不恰当地)伸出到某个对象的方法和类全局变量来获取数据。所以,虽然它仍然不好,但至少是朝着正确方向迈出的一步。 –
您可以创建新类,名为用户
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")
是的,它是一次一个用户。 – paulopulus