2013-10-29 8 views
1

나는 여러 개의 평면 멤버와 여러 개의 중첩 된 복합 유형이있는 복잡한 C# 클래스를 사용합니다."중첩 된"개체 초기화

일반적으로 데이터가없는 경우 "중첩 된"복합 유형을 초기화하지 않습니다. I 클래스

Public class Person 
{ 
public string FirstName{get;set;} 
public Address{get;set;} 
} 

이있는 경우 내가 그러나 Person p = new Person(){FirstName="Test", Address = new Address()};

하지 않을 것이다 예를 들어

는, 나는이해야 내 의견으로는, 비록 "모든 하위"복잡한 유형을 초기화하라고 해요 대소 문자를 구분하지 마십시오. 데이터가 없는데 왜 메모리를 할당해야합니까? 객체가 비어 있는지 여부는 어떻게 결정합니까? 모든 값을 비교합니까/일종의 지연을 정의하거나 빈 인스턴스를 나타 내기 위해 특수 하위 클래스를 정의 했습니까?

귀하의 의견은 높이 평가됩니다.

+2

은 어쩌면 당신은 canuse을을 NullObjectpattern : http://en.wikipedia.org/wiki/Null_Object_pattern – JleruOHeP

+0

참조 http://www.infoq.com/presentations/Null- References-The-billion-dollar-Mistake-Tony-Hoare 및 http://c2.com/cgi/wiki?PrematureOptimization, 필요하지 않은 공간을 예약해서는 안되는 직관력은 아마 조기 범주에 속할 것입니다 최적화, 부작용으로 인해 null 참조 예외가 발생할 가능성이 커지는 전화 코드가 많이 남습니다. –

답변

1

액세스하기 전에 null의 모든 속성을 검사하는 런타임에는 "빈"개체가있는 모든 필드를 초기화하는 것보다 높을 수 있습니다 (Null Object pattern 참조). 모든 객체에 대해 단일 읽기 전용 인스턴스를 공유하기 만하면 "비어있는"/ "null 객체"의 메모리 비용은 매우 적을 수 있습니다.

일부 개체의 일부를 초기화하지 않은 채로 유지하는 경우 개체에 액세스/사용하기 전에 null 확인이 필요한지 여부를 확인하기 위해 개발자에게 매우 높은 비용이 소요됩니다.

기본적으로 일부 필드를 초기화하지 않으면 몇 가지 이점을 얻을 수 있지만 속성에 대한 모든 액세스가 null 필드에 제대로 액세스하지 못하도록 많은 시간을 할애해야합니다.

0

간단한 유지하려면, 당신은 생성자 내에서 초기화 할 수 있습니다 :

public class Person 
{ 
    public Person() 
    { 
     this.Address = new Address(); 
    } 
    public string FirstName {get; set;} 
    public Address {get; set;} 
} 

합니다.

// Don´t need to do Person p = new Person(){ FirstName="Test", Address = new Address()}; 
Person p = new Person(); 

수백만 개의 개체가 있거나 그럴 것이라고 확신하지 않는다면 걱정할 필요가 없습니다.

당신은이 패턴을 사용할 수 있습니다
0

:

Public class Person 
{ 
    private Address address; 

    public Address Address 
    { 
    get 
    { 
     return address ?? (address = new Address()); 
    } 
    } 
} 
+0

문제는 "null"또는 "not"인 하위 유형을 기반으로하는 일부 논리가 있다는 것입니다. 예를 들어, Address가 null 인 경우 사용자가 화면에 입력 할 수있게하거나 그렇지 않으면 단지 읽기 전용으로 표시 할 수 있습니다. 그래서 우리는 하위 유형을 초기화하는 것이 더 낫다고 말하고 있습니까? 사용자가 메서드 호출을 시작하면 어떻게 될까요? 예측할 수없는 행동을 일으키지 않을까요? Atleast, 객체가 null 인 경우, 적어도 "Null 참조 예외"를 지속적으로 가져옵니다. –