我想使用一個在我的項目範圍內的變量,有什麼好的方法來實現這個目標?如何聲明一個具有多個屬性的全局變量?
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