2012-06-20 2 views
3

System.Xml.Serialization을 사용하여 객체를 XML로 직렬화하기 때문에 매개 변수없는 생성자가 필요합니다.생성자가 실행되기 전에 개체 초기화 구문을 사용하여 속성에 값을 할당 할 수 있습니까?

따라서 개체 초기화 구문을 사용하여 특정 속성에 값을 할당 한 다음 개체를 XML로 직렬화하기 전에 필요에 따라 생성자 논리를 사용하여이 값의 서식을 지정하려고합니다.

제 문제는 속성에 값이 할당되기 전에 생성자가 실행된다는 것입니다. 생성자 로직 실행을 볼 수 있듯이

Output

다음 속성 값을 할당됩니다

class Program 
{ 
    static void Main(string[] args) 
    { 
     Foo myFoo = new Foo() { HelloWorld = "Beer", HelloWorldAgain = "More beer" }; 

     Console.WriteLine(myFoo.HelloWorld); 
     Console.WriteLine(myFoo.HelloWorldAgain); 

     Console.ReadLine(); 
    } 
} 

public class Foo : Bar 
{ 
    public string HelloWorld { get; set; } 

    public Foo() 
    { 
     Console.WriteLine("Foo Was Initialized"); 
     Console.WriteLine(HelloWorld); 
    } 
} 

public abstract class Bar 
{ 
    public string HelloWorldAgain { get; set; } 

    public Bar() 
    { 
     Console.WriteLine("Bar was initialized"); 
     Console.WriteLine(HelloWorldAgain); 
    } 
} 

이 다음과 같은 출력 결과 : 단순화 된 예는 다음과 같습니다. 나는 다른 방향으로 일할 필요가있다.

이것이 가능합니까?

+0

어떤 종류의 사전 직렬화 형식을 사용하려고합니까? –

+0

ID를 전달한 다음 데이터베이스에 대한 쿼리를 실행하여 다양한 정보를 가져 와서 자동 속성에 이러한 정보를 할당하면 생성자 내에서이 작업을 수행하는 것이 더 편할 것이라고 생각했습니다 – JMK

답변

6

직렬화를 수행하려면 매개 변수없는 생성자가 필요하지만 해당 생성자로 제한되지는 않습니다.

비 직렬화를위한 인수가없는 생성자를 유지하면서 코드에서 클래스의 인스턴스를 생성해야 할 때 값을 취하고 필요한 초기화를 수행하는 다른 생성자를 추가하십시오.

개체 초기화 구문은 생성 후 속성을 설정하기위한 단순한 축약 형입니다.

2

아니요, 개체의 속성을 초기화 할 수 없으므로 개체가 이미 있습니다. 실존은 의 앞에의 앞에 다른 사람 달리기 ctor에 의해 guranteed이다.

우리는 개념적 질문처럼 "기본 생성자를 실행하지 않음"에 대해 이야기하고 있습니다. static 속성을 사용하여 수행 할 수 있습니다. 이 경우 Foo()는 호출되지 않습니다. 그러나 그것은 자연스럽게 현재의 문제 주제에서 벗어났습니다.

5

아니요. 개체 초기화 구문은 바로 가기입니다. 당신이 쓸 때 :

Foo foo = new Foo { HelloWorld = "Beer" }; 

컴파일러 그냥 당신이 쓰는 경우 발생하는 매우 가까운 일이를 다시 작성합니다

Foo foo = new Foo(); 
foo.HelloWorld = "Beer"; 

매개 변수가 존재하는 개체에 대한 위해 필요한 경우, 당신은 넣어한다 그것들을 생성자의 인자로 사용한다.

+0

XML serialization이 수행합니다 매개 변수없는 public 생성자가 필요하지만 API 소비자에게 제안 할 때 다른 생성자 오버로드를 가질 수 있습니다. –

+6

@ 리트, pedantic, [그것은 정확히 * 동일하지 않습니다] (http://stackoverflow.com/questions/1679780/when-using-object-initializers-why-does-the-compiler-generate-an- extra-local-va)로 작성했습니다. –

+0

@KirkWoll 매우 사실입니다 - 언어를 편집했습니다 - 개념적으로는 정신적 인 모델과 비슷하지만 그렇습니다. 정확하게 동일하지는 않습니다.) –

1

아마도 구문은 기만적입니다. 여기서 무슨 일이 일어나고있는거야?

var myFoo = new Foo(); 
myFoo.HelloWorld = "Beer"; 
myFoo.HelloWorldAgain = "MoreBeer"; 

그건 두렵습니다. 생성자가 실행되기 전에 속성을 초기화하는 것은 불가능합니다. 생성자는 객체에 대한 메모리가 할당되고 기본값이 필드에 할당 된 후 '발생'하는 첫 번째 작업입니다.

현재로서는 개체 초기화 구문을 사용하여 괄호가 필요하지 않습니다.이것은 단지 좋은 (그러나 더 거짓)이 될 것입니다 :

var myFoo = new Foo { HelloWorld = "Beer", HelloWorldAgain = "MoreBeer" }; 

당신의 질문을 보면, 당신이 생성자에 속하지 않는 (직렬화하기 전에 속성을 수정) 뭘 하려는지 것 같습니다.

관련 문제