클래스에 가상 속성이나 가상 메서드가 정의되어 있고 생성자에서 해당 가상 속성이나 메서드에 접근하면 이때 Visual Studio에서는 경고를 내지 않아 컴파일에는 문제가 없지만, 설치된 경우 Resharper 플러그인은 "생성자에서 가상 멤버에 액세스했습니다."라는 경고를 표시합니다. 그렇다면 이것이 보안 위험인 이유는 무엇입니까? 다음은 설명할 예입니다.
using System; namespace VirtualDemo { class Program { static void Main(string[] args) { var test = new SubClass(); Console.ReadKey(); } } class BaseClass { protected virtual string VirtualProperty { get; set; } public BaseClass() { var p = VirtualProperty; VirtualMethod(); } protected virtual void VirtualMethod() { } } class SubClass : BaseClass { private MockClass _mockClass; public SubClass() { _mockClass = new MockClass(); } protected override string VirtualProperty { get { return _mockClass.MockProperty; } set { _mockClass.MockProperty = value; } } protected override void VirtualMethod() { var p = _mockClass.MockProperty; } } class MockClass { public string MockProperty { get; set; } } }
이 예는 매우 간단합니다. SubClass
기본 클래스 생성자가 하위 클래스 생성자보다 먼저 실행되고, 하위 클래스 생성자에서 멤버 클래스가 초기화되지만 기본 클래스 생성자가 가상 클래스에 액세스할 때 하위 클래스가 아직 생성되지 않았기 때문에 null 참조 오류가 보고됩니다. 멤버이므로 null 참조 오류가 발생합니다. 이러한 상황을 방지하는 방법은 여러 가지가 있습니다. 하위 클래스 필드를 초기화하여 멤버 클래스를 생성할 수 있습니다. 두 번째 방법은 하위 클래스 생성자에서 가상 초기화 메서드를 정의하는 것입니다. 이 메서드를 상속할 때 필요한 종속성을 초기화하기 위해 서브클래스를 호출합니다.
위 내용은 C# 생성자의 가상 멤버에 액세스할 때 어떤 문제가 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!