programing

기본 유형 생성자를 호출하기 전에 VB.NET이 인스턴스 변수를 초기화하도록 강제할 수 있습니까?

topblog 2023. 5. 13. 08:42
반응형

기본 유형 생성자를 호출하기 전에 VB.NET이 인스턴스 변수를 초기화하도록 강제할 수 있습니까?

VB에서 특히 까다로운 문제를 디버깅한 후.인스턴스 변수가 초기화되는 순서를 포함하는 NET, C#에서 예상한 동작과 VB의 실제 동작 사이에 단절된 불일치가 있음을 발견했습니다.그물.

혜택 없음:이 질문은 VB 동작의 약간의 차이에 관한 것입니다.NET 및 C#.만약 당신이 "그래서 당신이 C#을 사용해야 하는 이유, noob" 이외의 답을 제공할 수 없는 언어 편협한 사람이라면, 여기에는 당신이 볼 수 있는 것이 아무것도 없습니다. 계속하세요.

특히 C# 언어 사양(강조 추가)에서 설명한 동작을 예상했습니다.

가 없거나 이니셜라이저가 base(...)생성자는 클래스에 선언된 인스턴스 필드의 변수 초기화자에 의해 지정된 초기화를 암시적으로 수행합니다.이것은 직접 기본 클래스 생성자를 암시적으로 호출하기 전에 생성자에 대한 입력 즉시 실행되는 일련의 할당에 해당합니다.변수 이니셜라이저는 클래스 선언에 나타나는 텍스트 순서로 실행됩니다.

VB 부분과 비교해 보십시오.인스턴스 생성자와 관련된 NET 언어 규격: (강조 추가됨)

첫 일 때MyBase.New(...)생성자는 형식에 선언된 인스턴스 변수의 변수 초기화자에 의해 지정된 초기화를 암시적으로 수행합니다.이는 직접 기본 유형 생성자를 호출한 후 즉시 실행되는 할당 시퀀스에 해당합니다.이러한 순서를 지정하면 인스턴스에 액세스할 수 있는 문이 실행되기 전에 모든 기본 인스턴스 변수가 변수 이니셜라이저에 의해 초기화됩니다.

여기서의 차이는 즉시 명백합니다.C#은 기본 생성자를 호출하기 전에 클래스 수준 변수를 초기화합니다.VB.NET은 인스턴스 필드의 값을 설정하기 전에 기본 생성자를 호출하는 것을 선호하기 때문에 그 반대입니다.

일부 코드를 보려면 이 관련 질문을 통해 다양한 동작의 구체적인 예를 볼 수 있습니다.불행하게도, 그것은 VB를 강요하는 방법에 대한 힌트를 제공하지 않습니다.C#에 의해 확립된 모델을 따르는 NET.

저는 두 언어의 디자이너들이 왜 그렇게 다른 접근법을 선택했는지에 대해 저보다 문제에 대한 가능한 해결책에 관심이 적습니다.궁극적으로 제 질문은 다음과 같습니다.VB로 코드를 작성하거나 구성할 수 있는 방법이 있습니까?C#의 표준 동작처럼 기본 유형의 생성자가 호출되기 전에 인스턴스 변수를 강제초기화하는 NET?

구축 중에 호출될 가상 구성원이 있는 경우(최적의 조언과는 달리 이미 동의했지만), 여러 호출에 대해 자체적으로 보호할 수 있는 별도의 방법으로 초기화를 이동해야 합니다(즉, 초기화가 이미 수행된 경우 즉시 복귀).그런 다음 가상 멤버와 생성자가 초기화를 수행하기 전에 이 메서드를 호출합니다.

약간 지저분하고 약간의 성능 저하를 나타낼 수 있지만 VB에서 할 수 있는 다른 방법은 거의 없습니다.

잘 작성된 클래스는 부분적으로 구성된 인스턴스에서 호출될 수 있는 모든 가상 멤버가 올바르게 동작하는지 확인해야 합니다.C#은 필드 이니셜라이저가 실행된 클래스 인스턴스가 가상 메서드를 사용할 수 있도록 충분히 인식 가능한 상태가 될 것이라는 철학을 사용합니다.VB.net 은 필드 이니셜라이저가 부분적으로 제한된 개체(그리고 약간의 작업으로 생성자에게 전달된 매개 변수)를 사용할 수 있도록 허용하는 것이 가상 메서드가 호출되기 전에 필드 이니셜라이저가 실행된다는 보장보다 더 유용하다는 철학을 채택합니다.

IMHO, 언어 설계 관점에서 올바른 접근 방식은 지정된 필드 이니셜라이저가 "초기" 또는 "후기"로 실행되어야 함을 나타내는 편리한 수단을 제공하는 것이었을 것입니다. 왜냐하면 각각 유용할 수 있기 때문에 ("후기" 스타일을 선호하지만, 생성자 매개변수를 필드 이니셜라이저에 사용할 수 있기 때문입니다.예:

ClassParamPasserBase(Of T) ' 하나의 생성자 매개 변수를 전달하기 위한 일반 클래스보호된 생성자 매개 변수 1을 T로 지정하위 새로 만들기(Param As T)생성자 매개 변수 1 = 매개 변수SUB 종료클래스 종료클래스 마이싱ParamPasserBase(정수의) 상속MyArray(생성자 매개 변수 1-1)를 문자열로 지정하위 새로 만들기(배열 크기를 정수로 지정)마이베이스.새로 만들기(어레이 크기)끝 하위 항목...클래스 종료

C#에서는 필드 선언이나 이니셜라이저가 생성자에게 전달된 인수를 사용하도록 하는 좋은 방법이 없습니다.vb에서는 위 그림과 같이 합리적으로 깨끗하게 수행할 수 있습니다.vb에서는 필드 이니셜라이저를 실행하기 전에 기준 생성자 매개 변수를 사용하여 생성 중인 개체의 복사본을 밀반출할 수도 있습니다. 클래스의 Dispose 루틴이 부분적으로 생성된 개체를 처리하기 위해 적절하게 작성되면 생성자에 던져진 개체를 적절하게 정리할 수 있습니다.

언급URL : https://stackoverflow.com/questions/4602468/can-vb-net-be-forced-to-initialize-instance-variables-before-invoking-the-base-t

반응형