programing

VB에 모든 양식의 기본 인스턴스가 있는 이유는 무엇입니까?망은 있지만 C#에는 없습니까?

stoneblock 2023. 6. 3. 08:07

VB에 모든 양식의 기본 인스턴스가 있는 이유는 무엇입니까?망은 있지만 C#에는 없습니까?

양식 클래스의 이름을 나타내는 (이름) 속성이 있는지 궁금합니다.이 속성은 네임스페이스 내에서 양식이 인스턴스인 클래스를 고유하게 식별하는 데 사용되며, Visual Basic의 경우 양식의 기본 인스턴스에 액세스하는 데 사용됩니다.

이제 이 기본 인스턴스가 어디서 왔는지, C#이 이와 동등한 방법을 가질 수 없는 이유는 무엇입니까?

또한 C#에서 양식을 표시하기 위해 다음과 같은 작업을 수행합니다.

// Only method
Form1 frm = new Form1();
frm.Show();

근데 VB에서는.Net 우리는 두 가지 방법을 모두 가지고 있습니다.

' First common method
Form1.Show()

' Second method
Dim frm As New Form1()
frm.Show()
  1. 제 질문은 이 첫 번째 방법에서 나온 것입니다.이것은 무엇인가…Form1의 예인가요?Form1또는Form1계급 그 자체?위에서 언급했듯이 Form 이름은 VB의 기본 인스턴스입니다.넷. 하지만 우리는 또한 알고 있습니다.Form1에서 정의된 클래스입니다.Designer인스턴스 이름과 클래스 이름이 어떻게 동일할 수 있습니까?한다면Form1클래스이고 없음(정적\)Shared) 메서드 이름이 Show()입니다.그렇다면 이 방법은 어디서 나온 것일까요?

  2. 생성된 IL에는 어떤 차이가 있습니까?

  3. 그리고 마지막으로 왜 C#은 이것과 동등한 것을 가질 수 없습니까?

이것은 VS2005와 함께 제공된 VB.NET 버전에서 언어에 다시 추가되었습니다.일반적인 요구로 인해 VB6 프로그래머는 유형과 해당 유형의 객체에 대한 참조 간의 차이를 파악하는 데 어려움을 겪었습니다.당신의 스니펫에 Form1 vs frm.VB는 VB4까지 수업을 받지 못했지만 양식은 VB1까지 거슬러 올라갑니다.이것은 프로그래머들의 마음을 매우 아프게 합니다. 효과적인 객체 지향 코드를 작성하기 위해서는 차이점이 매우 중요하다는 것을 이해하는 것입니다.C#에 이것이 없는 이유의 큰 부분.

C#은 VB.NET처럼 글로벌 네임스페이스에 속성과 메서드를 추가하는 것을 허용하지 않기 때문에 그다지 깨끗하지는 않지만 C#에서도 이를 반환할 수 있습니다.다음과 같이 양식 코드에 접착제를 약간 추가할 수 있습니다.

public partial class Form2 : Form {
    [ThreadStatic] private static Form2 instance;

    public Form2() {
        InitializeComponent();
        instance = this;
    }

    public static Form2 Instance {
        get {
            if (instance == null) {
                instance = new Form2();
                instance.FormClosed += delegate { instance = null; };
            }
            return instance;
        }
    }
}

이제 양식 2를 사용할 수 있습니다.VB.NET의 Form2를 사용할 수 있는 것처럼 코드의 인스턴스입니다.부동산 게터의 if 문에 있는 코드는 효율적으로 만들기 위해 자체적인 개인 방법으로 옮겨져야 합니다. 명확성을 위해 이렇게 남겨두었습니다.

덧붙여서, 그 스니펫의 [ThreadStatic] 속성은 많은 VB.NET 프로그래머들이 스레드화를 완전히 포기하게 만든 원인입니다.추상화가 누설될 때의 문제.당신은 이것을 전혀 하지 않는 것이 정말 좋습니다.

VB는 기본적으로 당신의 뒤에 있는 프로젝트에 많은 코드를 추가합니다.

진행 상황을 가장 쉽게 확인할 수 있는 방법은 최소 프로젝트를 구축하고 Reflector를 사용하여 프로젝트를 살펴보는 것입니다.방금 VB가 포함된 새로운 WinForms 앱을 만들고 이 클래스를 추가했습니다.

Public Class OtherClass    
    Public Sub Foo()
        Form1.Show()
    End Sub
End Class

Foo의 컴파일된 코드는 C#:로 압축 해제되었을 때 다음과 같습니다.

public void Foo()
{
    MyProject.Forms.Form1.Show();
}

MyProject.Forms된 생된속다에 입니다.MyProject 류의클래 유형의MyForms여기로 잠수하기 시작하면 꽤 많은 양의 생성된 코드를 볼 수 있습니다.

물론 C#은 이 모든 것을 할 수 있지만, 일반적으로 뒤에서 그렇게 많은 일을 한 적이 없습니다.익명 유형, 반복기 블록, 람다 식 등을 위한 추가 메소드와 유형을 구축하지만 VB와 같은 방식은 아닙니다.C#이 구축하는 모든 코드는 당신이 작성한 소스 코드에 해당합니다. 단지 교묘하게 변형되었을 뿐입니다.

물론 두 가지 접근법 모두에 대한 주장이 있습니다.개인적으로 저는 C# 접근 방식을 선호하지만, 놀랄 일은 아닐 것입니다.왜 양식의 인스턴스에 접근하는 방법이 싱글톤인 것처럼 있어야 하는지 모르겠어요. 양식에 대해서만...저는 기본적으로 GUI 클래스를 사용하든 다른 어떤 것을 사용하든 언어가 같은 방식으로 작동하는 것을 좋아합니다.

언급URL : https://stackoverflow.com/questions/4698538/why-is-there-a-default-instance-of-every-form-in-vb-net-but-not-in-c