다음을 통해 공유


필드 디자인

업데이트: 2007년 11월

필드는 개체와 연결된 데이터를 보관합니다. 대부분의 시나리오에서는 라이브러리의 일반 필드가 개발자에게 표시되지 않습니다. 다음 지침은 라이브러리 디자인에서 필드를 올바로 사용하는 데 도움이 됩니다.

공용 또는 보호된 인스턴스 필드를 제공하지 않습니다.

공용 및 보호된 필드는 버전을 지정하지 않고 코드 액세스 보안 요청으로 보호되지 않습니다. 공개적으로 표시되는 필드를 사용하는 대신 전용 필드를 사용하여 속성을 통해 노출합니다.

변경되지 않는 상수에는 상수 필드를 사용합니다.

예를 들어, Math 클래스는 EPI을 정적 상수로 정의합니다.

컴파일러는 const 필드의 값을 호출 코드에 직접 삽입하며 이 경우 const 값을 변경하면 호환성 문제가 발생할 수 있습니다.

미리 정의된 개체 인스턴스에는 공용 정적 읽기 전용 필드를 사용합니다.

예를 들어, DateTime 클래스는 최대 또는 최소 시간 값으로 설정된 DateTime 개체를 가져오는 데 사용할 수 있는 정적 읽기 전용 필드를 제공합니다. MaxValueMinValue을 참조하십시오.

변경 가능한 형식의 인스턴스를 읽기 전용 필드로 지정하지 않습니다.

변경 가능한 형식을 사용하여 만든 개체는 수정할 수 있습니다. 예를 들어, 배열과 대부분의 컬렉션은 변경 가능한 형식이지만 Int32, UriString은 변경할 수 없는 형식입니다. 변경 가능한 참조 형식이 있는 필드의 경우 읽기 전용 한정자가 필드 값을 덮어쓰지 않도록 막지만 변경 가능한 형식이 수정되지 않도록 보호하지는 않습니다.

다음 코드 예제에서는 읽기 전용 필드를 사용하는 데 따른 문제를 보여 줍니다. BadDesign 클래스는 읽기 전용 필드를 만들고 읽기 전용 속성을 사용하여 노출합니다. 이렇게 하면 ShowBadDesign 클래스가 읽기 전용 필드의 내용을 수정할 수 없습니다.

Imports System

Namespace Examples.DesignGuidelines.Fields

    Public Class BadDesign

        Public Readonly dataValues as Integer() = {1,2,3}

        Public ReadOnly Property Data as Integer ()

            Get 
                Return dataValues
            End Get
        End Property

        Public Sub WriteData()

            For Each i as Integer In dataValues

                Console.Write ("{0} ", i)
            Next i
            Console.WriteLine()
        End Sub
    End Class

    Public Class ShowBadDesign

        Public Shared Sub Main()

            Dim bad as BadDesign = new BadDesign()
            ' The following line will write: 1 2 3
            bad.WriteData()

            Dim badData as Integer() = bad.Data
            For i as Integer  = 0 To badData.Length -1

                badData(i) = 0
            Next i

            ' The following line will write: 0 0 0
            ' because bad's data has been modified.
            bad.WriteData()
        End Sub
    End Class
End Namespace
using System;

namespace Examples.DesignGuidelines.Fields
{
    public class BadDesign
    {
        public readonly int[] data = {1,2,3};

        public int [] Data
        {
            get {return data;}
        }
        public void WriteData()
        {
            foreach (int i in data)
            {
                Console.Write ("{0} ", i);
            }
            Console.WriteLine();
        }
    }
    public class ShowBadDesign
    {
        public static void Main()
        {
            BadDesign bad = new BadDesign();
            // The following line will write: 1 2 3
            bad.WriteData();

            int[] badData = bad.Data;
            for (int i = 0; i< badData.Length; i++)
            {
                badData[i] = 0;
            }
            // The following line will write: 0 0 0
            // because bad's data has been modified.
            bad.WriteData();
        }
    }
}

Portions Copyright 2005 Microsoft Corporation. All rights reserved.

Portions Copyright Addison-Wesley Corporation. All rights reserved.

디자인 지침에 대한 자세한 내용은 2005년에 Addison-Wesley에서 책으로 출간한 Krzysztof Cwalina와 Brad Abrams의 "Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries"를 참조하십시오.

참고 항목

기타 리소스

멤버 디자인 지침

클래스 라이브러리 개발을 위한 디자인 지침