필드 디자인
업데이트: 2007년 11월
필드는 개체와 연결된 데이터를 보관합니다. 대부분의 시나리오에서는 라이브러리의 일반 필드가 개발자에게 표시되지 않습니다. 다음 지침은 라이브러리 디자인에서 필드를 올바로 사용하는 데 도움이 됩니다.
공용 또는 보호된 인스턴스 필드를 제공하지 않습니다.
공용 및 보호된 필드는 버전을 지정하지 않고 코드 액세스 보안 요청으로 보호되지 않습니다. 공개적으로 표시되는 필드를 사용하는 대신 전용 필드를 사용하여 속성을 통해 노출합니다.
변경되지 않는 상수에는 상수 필드를 사용합니다.
예를 들어, Math 클래스는 E 및 PI을 정적 상수로 정의합니다.
컴파일러는 const 필드의 값을 호출 코드에 직접 삽입하며 이 경우 const 값을 변경하면 호환성 문제가 발생할 수 있습니다.
미리 정의된 개체 인스턴스에는 공용 정적 읽기 전용 필드를 사용합니다.
예를 들어, DateTime 클래스는 최대 또는 최소 시간 값으로 설정된 DateTime 개체를 가져오는 데 사용할 수 있는 정적 읽기 전용 필드를 제공합니다. MaxValue 및 MinValue을 참조하십시오.
변경 가능한 형식의 인스턴스를 읽기 전용 필드로 지정하지 않습니다.
변경 가능한 형식을 사용하여 만든 개체는 수정할 수 있습니다. 예를 들어, 배열과 대부분의 컬렉션은 변경 가능한 형식이지만 Int32, Uri 및 String은 변경할 수 없는 형식입니다. 변경 가능한 참조 형식이 있는 필드의 경우 읽기 전용 한정자가 필드 값을 덮어쓰지 않도록 막지만 변경 가능한 형식이 수정되지 않도록 보호하지는 않습니다.
다음 코드 예제에서는 읽기 전용 필드를 사용하는 데 따른 문제를 보여 줍니다. 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"를 참조하십시오.