> 백엔드 개발 > C#.Net 튜토리얼 > C# 생성자의 가상 멤버에 액세스할 때 어떤 문제가 있나요?

C# 생성자의 가상 멤버에 액세스할 때 어떤 문제가 있나요?

零下一度
풀어 주다: 2017-06-24 09:51:10
원래의
1734명이 탐색했습니다.

C# 생성자의 가상 멤버에 액세스할 때 어떤 문제가 있나요?

클래스에 가상 속성이나 가상 메서드가 정의되어 있고 생성자에서 해당 가상 속성이나 메서드에 접근하면 이때 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿