programing

Visual Studio 2010 및 VB.NET에서 글로벌 변수 선언

padding 2023. 5. 18. 20:49
반응형

Visual Studio 2010 및 VB.NET에서 글로벌 변수 선언

Visual Basic에서 글로벌 변수를 선언하려면 어떻게 해야 합니까?

이러한 변수는 모든 Visual Basic 양식에서 액세스할 수 있어야 합니다.특정 양식에 대해 공용 변수를 선언하는 방법을 알고 있지만 프로젝트의 모든 양식에 대해 이를 수행하려면 어떻게 해야 합니까?

글로벌 변수는 VB.NET에서 상상하는 것처럼 선언할 수 없습니다.

다른 답변 중 일부에서 제안한 것처럼 글로벌 변수로 취급할 모든 것을 특정 클래스 내에서 대신 정적 변수로 선언할 수 있습니다.

Public Class GlobalVariables
    Public Shared UserName As String = "Tim Johnson"
    Public Shared UserAge As Integer = 39
End Class

그러나 코드에 사용할 변수에 대한 모든 참조를 완전히 검증해야 합니다.이러한 의미에서, 그것들은 여전히 특정 클래스와 연관되어 있기 때문에 다른 언어에서 친숙한 글로벌 변수의 유형이 아닙니다.

예를 들어 양식 코드에 사용자 이름과 함께 메시지 상자를 표시하려면 다음과 같은 작업을 수행해야 합니다.

Public Class Form1: Inherits Form

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
        MessageBox.Show("Hello, " & GlobalVariables.UserName)
    End Sub

End Class

변수를 입력하여 쉽게 액세스할 수 없습니다.UserName정의된 클래스 외부 - 정의된 클래스의 이름도 지정해야 합니다.


, 변수 선언이 를 가져올 수 GlobalVariables각 코드 파일의 맨 위(또는 프로젝트 수준의 경우에도 프로젝트의 속성 창)에 있습니다.그런 다음 변수 이름을 사용하여 변수를 간단히 참조할 수 있습니다.

Imports GlobalVariables

이것은 당신이 당신의 글로벌 변수를 선언할 때 컴파일러가 당신을 위해 막후에서 하는 것과 정확히 같은 것입니다.Module보다는 니▁rather▁a.ClassVB와 역호환성을에서 a "VB"는 와전버전모제역듈목 VB입니다.NET에서는Module 클래스용어로 "VB.NET"(VB.NET),Shared NotInheritable ClassIDE를 사용하면 모듈에서 구성원을 호출할 수 있습니다. 모듈에 대한 참조를 완전히 검증하거나 가져오지 않아도 됩니다.여러분이 이 길을 가기로 결정하더라도, VB.NET과 같은 객체 지향 언어로 배후에서 무슨 일이 일어나고 있는지 이해할 가치가 있습니다.프로그래머로서, 사용하기로 결정했더라도 현재 진행 중인 작업과 도구가 정확히 어떤 역할을 하는지 이해하는 것이 중요하다고 생각합니다.또한 이를 "베스트 프랙티스"로 추천하지는 않습니다. 모호하고 깨끗한 객체 지향 코드/디자인의 경향이 있기 때문입니다.당신이 당신의 코드를 모듈에 쑤셔넣고 컴파일러가 모든 것을 처리하도록 하는 것보다 위와 같이 작성된다면 C# 프로그래머가 당신의 코드를 이해할 가능성이 훨씬 더 높습니다.


하나 이상의 다른 답변과 마찬가지로 VB.NET은 완전히 객체 지향적인 언어입니다.그것은 무엇보다도 모든 것이 하나의 물체라는 것을 의미합니다."글로벌" 변수도 객체이기 때문에 클래스의 인스턴스 내에서 정의해야 합니다.객체 지향 언어에서 글로벌 변수를 사용해야 한다고 느낄 때마다 디자인을 다시 생각해 볼 필요가 있습니다.객체 지향 프로그래밍으로 전환하는 것이라면 코드 작성에 몰두하기 전에 잠시 멈추고 기본 패턴을 배우는 것이 더 가치 있는 일입니다.

클래스 대신 "모듈"을 사용하고 기존 "글로벌" 키워드 대신 "공개"를 사용하는 등 항상 사용하는 방식과 거의 같습니다.

Public Module Module1
    Public Foo As Integer
End Module

좋아요. 저는 마침내 질문을 받은 것처럼 보이는 질문에 대답하기 위해 실제로 효과가 있는 것을 발견했습니다.

"많은 모듈과 양식이 필요할 때 변수를 모든 모듈에 공개하여 각 모듈이 동일한 변수를 참조하도록 하려면 어떻게 해야 합니까?

놀랍게도, 저는 웹에서 단순해 보이는 질문을 검색하는 데 상당한 시간을 보냈습니다. 여전히 오류가 발생하는 모호함 외에는 아무것도 발견하지 못했습니다.

하지만 코디 그레이가 예시로 연결된 덕분에, 저는 적절한 답을 알아낼 수 있었습니다.


상황: 여러 개의 모듈 및/또는 양식이 있으며 각각 또는 모두에서 특정 변수를 참조하려고 합니다.

작동하는 "A" 방식. 한 모듈에 다음 코드를 배치합니다(여기서 "글로벌 정의"는 임의로 선택한 이름).

Public Module DefineGlobals

Public Parts As Integer                 'Assembled-particle count
Public FirstPrtAff As Long              'Addr into Link List 
End Module

그런 다음 변수 "부품"을 해결해야 하는 각 모듈/폼에 다음 코드를 배치합니다("InitForm2" 양식의 예).

Public Class InitForm2
Private Sub InitForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    Parts = Parts + 3

End Sub

End Class

그리고 아마도 다른 양식; 공개 클래스 양식X

Sub CreateAff()

   Parts = 1000

End Sub 

 End Class

이러한 유형의 코딩은 VB2008 Express에서 작동한 것으로 보이며 "Ohbtw."의 끝을 찾지 못했음에도 불구하고 현재로서는 (알 수 없는 파일이 백그라운드에서 로드되는 것을 제외하고) 모두 필요한 것으로 보입니다.깜짝 놀랄 만한 세부 사항그리고 저는 더 높은 수준의 표준화가 선호될 것이라고 확신하지만, 첫 번째 과제는 단순히 표준이 있든 없든 어떤 것이 작동하도록 하는 것입니다.

정확하고 표현된 명시적인 예를 능가하는 것은 없습니다.

다시 한 번 고마워, 코디

정적으로 만듭니다(VB에서 공유됨).

Public Class Form1

   Public Shared SomeValue As Integer = 5

End Class

공개 변수는 코드 냄새입니다. 응용 프로그램을 다시 설계하여 필요하지 않도록 하십시오.여기와 여기에 있는 대부분의 추론은 VB.NET에 적용할 수 있습니다.

를 VB로 ).NET에서 전역 변수를 갖는 가장 간단한 방법은 클래스에 공개 정적 변수를 만드는 것입니다.Public Shared).

키워드를 사용하면 프로젝트의 모든 양식에서 전역 변수에 액세스할 수 있습니다.public shared수업 중이라면.또한 모듈 아래에 있는 경우 "public" 키워드를 사용하는 경우에도 사용할 수 있지만 여러 가지 이유로 인해 최상의 방법은 아닙니다.

(... 네, "Cody Gray"와 "RBarry Young"이 말한 것을 다소 반복합니다.)

문제 중 하나는 동일한 전역 변수를 동시에 호출하는 두 개의 스레드가 있는 경우입니다.깜짝 놀랄 일이 있을 겁니다.그들의 한계를 모른다면 예상치 못한 반응을 보일 수도 있습니다.Visual Basic .NET게시된 글로벌 변수를 보고 샘플 프로젝트를 다운로드하십시오!

작은 비고: 저는 웹 기반 애플리케이션(asp.net )에서 모듈을 사용하고 있습니다.저는 제가 모듈의 변수에 저장하는 모든 것이 애플리케이션의 모든 사람들에 의해 보인다는 것을 기억해야 합니다, 웹사이트를 읽어보세요.내 세션에서만은 아닙니다.세션에서 계산을 추가하려면 세션 및 다른 세션의 숫자를 필터링할 배열을 만들어야 합니다.모듈은 훌륭한 작업 방법이지만 사용 방법에 대한 집중이 필요합니다.

실수를 방지하기 위해: 수업은 다음으로 보내집니다.

캐비지 콜렉터

페이지가 끝나면,모듈은 활성 상태를 유지하며(애플리케이션이 종료되거나 다시 시작되지 않는 한) 모듈의 데이터를 재사용할 수 있습니다.IIS에 의한 세션 처리로 인해 때때로 손실되는 데이터를 저장하기 위해 사용합니다.

IIS 양식 인증

그리고.

IIS_session

동기화되지 않고 모듈과 함께 감소를 초과한 데이터를 회수합니다.

시작 양식에서 런타임에 대한 친구 값을 선언하면 위의 모든 것을 피할 수 있습니다.

Public Class Form1 
Friend sharevalue as string = "Boo"

그런 다음 단순히 다음을 사용하여 모든 양식에서 이 변수에 액세스합니다.Form1.sharevalue

프로젝트 속성 아래에 새 변수를 추가할 수 있습니다. 해당 변수를 가져올 때마다 사용해야 합니다.

My.Settings.(Name of variable)

그것은 모든 형태의 프로젝트 전체에 효과가 있을 것입니다.

이 블로그의 다양한 답변은 객체 지향 프로그래밍의 일반적인 규칙을 엄격하게 준수하는 SE에 의해 정의되는 것 같습니다(퍼블릭 클래스를 사용하여 공개 공유(일명 정적) 및 완전한 자격을 갖춘 클래스 참조).또는 컴파일러가 작동하기 위해 동일한 작업을 수행해야 하는 하위 호환성 기능(모듈)을 사용하도록 홍보하는 SE입니다.

30년 이상의 경력을 가진 SE로서, 저는 다음과 같은 지침을 제안하고자 합니다.

  1. 모든 새 코드를 작성하는 경우(레거시 앱을 변환하지 않음), 이러한 양식은 끔찍한 결과(그리고 정말 찾기 어려운 버그)를 초래할 수 있기 때문에 정적 변수가 필요한 드문 경우를 제외하고는 사용하지 않습니다.(멀티스레드 및 멀티프로세싱 코드에는 정적 변수 주위에 세마포어가 필요합니다...)

  2. 이미 몇 개의 글로벌 변수가 있는 작은 응용 프로그램을 수정하는 경우 모듈에 의해 해당 응용 프로그램이 가려지지 않도록 공식화합니다. 즉, 개체 지향 프로그래밍의 표준 규칙을 사용하여 해당 응용 프로그램을 공개 정적으로 다시 만들고 전체 자격으로 액세스하여 다른 사용자가 무슨 일이 일어나고 있는지 파악할 수 있도록 합니다.

  3. 수십 개 또는 수백 개의 글로벌 변수가 포함된 거대한 레거시 응용프로그램이 있는 경우 모듈을 사용하여 이를 정의합니다.애플리케이션을 작동시킬 때 시간을 낭비할 이유가 없습니다. 속성 등에 소요되는 시간이 이미 8-ball보다 늦었기 때문입니다.

첫 번째로 공개석상에 있는 사람이 훨씬 더 말이 됩니다.원래 사람은 여러 가지 형태를 가지고 있고 글로벌 변수가 필요하다면 글로벌 클래스가 더 나을 것입니다.그의 뒤에서 코딩하는 사람을 생각해 보세요. 그리고 당신이 IntelliSense를 가지고 있는 클래스에서 글로벌 변수를 사용해야 합니다. 그것은 또한 6개월 후에 코딩하는 것을 훨씬 더 쉽게 만들 것입니다.

또한 만약 내가 뇌 방귀를 뀌고 모듈 수준의 예제 부품처럼 사용한다면 나는 내 글로벌 부품을 원할 것입니다.

Dim Parts as Integer
parts = 3
GlobalVariables.parts += Parts  '< Not recommended but it works

적어도 그것이 제가 수업 경로로 가는 이유입니다.

변수를 출력 디렉터리의 파일로 연결한 다음 해당 파일을 변수에 로드할 수 있습니다.

Imports System.IO

이 코드는 파일을 씁니다.

Dim somevariable = "an example"

Dim fs As FileStream = File.Create("globalvars/myvar1.var")
                Dim filedata As Byte() = New UTF8Encoding(True).GetBytes(somevariable)
                fs.Write(filedata, 0, filedata.Length)
                fs.Close()

그러면 다른 형식으로 파일이 로드됩니다.

Dim form2variable

    Dim fileReader As String
fileReader = My.Computer.FileSystem.ReadAllText("globalvars/myvar1.var")
form2variable = filereader
Public Class Form1

   Public Shared SomeValue As Integer = 5

End Class

정답:

MessageBox.Show("this is the number"&GlobalVariables.SomeValue)

언급URL : https://stackoverflow.com/questions/4529862/declare-global-variables-in-visual-studio-2010-and-vb-net

반응형