문제

이 질문은 Jon Skeet의 답변에서 영감을 얻었습니다.C ++의 액세스 모디퍼 영역에 해당하는 AC#가 있습니까?

그는 파일의 필드의 순서가 중요하다고 언급했다. 나는 이것이 필드가 초기화 된 순서와 관련이 있다고 생각하지만,이 부작용을 기반으로 코드가 자신의 질문과 토론을 보증하는 것이 위험하다고 생각합니다.

코드 파일 내 필드 순서가 어떻게 조작 될 수 있는지에 대한 다른 생각이 있습니까?

도움이 되었습니까?

해결책

다음은 C# Language Spec (섹션 10.5.5)의 전형적인 예입니다.

class Test
{
    static int a = b + 1;
    static int b = a + 1;
    static void Main() {
        Console.WriteLine("a = {0}, b = {1}", a, b);
    }
}

이것은 완전히 유효한 프로그램이며 서면으로 (a = 1, b = 2). 그러나 필드의 순서를 바꾸면 값을 바꾸게됩니다.

다른 팁

예, 관리되지 않는 코드와 인터페이스 할 때 중요합니다.

나는 주로 초기화 순서, 예 - 특히 정적 필드에 대해 생각하고있었습니다. 예를 들어 (데모의 단순성을 위해 공공 분야가 포함되어 있음) :

using System;

class First
{
    static int a = 10;
    public static int b = CalculateB();
    static int c = 5;

    static int CalculateB()
    {
        return a*c;
    }
}

class Second
{
    static int a = 10;
    static int c = 5;
    public static int b = CalculateB();

    static int CalculateB()
    {
        return a*c;       
    }
}

class Test
{
    static void Main()
    {
        Console.WriteLine("First.b: {0}, Second.b: {1}",
                          First.b, Second.b);
    }
}

초기화 순서는 사양에서 변수가 선언 된 텍스트 순서로 정의되지만 두 개의 변수가 부분 클래스에 기여하는 파일에있는 경우 정의되지 않습니다.

메르다드의 대답 또 다른 좋은 것입니다 : 물리적 레이아웃이 중요한 곳은 선언 순서의 영향을받을 수 있습니다.

필드가 선언의 일부로 초기화되면 파일에 표시된 순서대로 생성자 (인스턴스 또는 정적)에 추가됩니다.

반사를 통해 읽는 것보다 클래스의 메타 데이터로 필드의 순서를 사용할 수 있습니다 (남용?).

예를 들어, 해당 순서대로 필드 ID, 포트 및 XOR이있는 네트워크 프로토콜을 나타내는 클래스가있는 경우 다음과 같이 정의 할 수 있습니다.

class MyProtocol {
    int ID;
    int PORT;
    int XOR;
}

이제 반사를 사용하여 프로토콜의 필드를 반복하여 와이어를 전송한다고 가정 해 봅시다. GetProperties가 반환 한 주문은 귀하가 정의한대로 이루어지며 추가 메타 데이터를 명시 적으로 작성할 필요가 없었습니다.

이에 의존하는 것이 좋은 생각인지 확실하지 않습니다.

XMLSerializer는 소스 파일에 표시된 순서대로 멤버를 연속화한다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top