IT

C # : 생성자와 인스턴스화를 통해 속성에 데이터 할당

lottoking 2020. 9. 16. 07:59
반응형

C # : 생성자와 인스턴스화를 통해 속성에 데이터 할당


Album수업 이 많은 가정합니다 .

public class Album 
{
    public string Name {get; set;}
    public string Artist {get; set;}
    public int Year {get; set;}

    public Album()
    { }

    public Album(string name, string artist, int year)
    {
        this.Name = name;
        this.Artist = artist;
        this.Year = year;
    }
}

유형의 객체에 데이터를 할당하고 싶을 때 Album다음 두 가지 방법의 차이점은 무엇입니까?

생성을 통해

var albumData = new Album("Albumius", "Artistus", 2013);

또는 인스턴스화 할 때

var albumData = new Album 
                    {
                         Name = "Albumius",
                         Artist = "Artistus",
                         Year = 2013
                    };

두 접근 방식 모두 생성 해 호출하고 다른 접근 방식을 호출합니다. 이 코드 :

var albumData = new Album 
                {
                     Name = "Albumius",
                     Artist = "Artistus",
                     Year = 2013
                };

이 동등한 코드의 구문 속기입니다.

var albumData = new Album();
albumData.Name = "Albumius";
albumData.Artist = "Artistus";
albumData.Year = 2013;

둘은 모두 동일합니다 . 따라서 매개 변수없는 생성자가 공개되지 않은 경우 :

public Album() { }

거의 모든 것이 이니셜 라이저를 전혀 사용할 수 없습니다. 따라서 주된 질문은 객체를 초기화 할 때 사용할 수있는 객체가 처음에 노출되는 생성자입니다. 두 가지의 생성 가능성이있는 노출하면 (예제에있는 것과 같은) 두 가지 방법이 생성되는 것과 같은 방식으로 유효합니다.

object-는 생성 때때로을 위해 특정 값이 필요 하기 때문에 매개 변수없는 생성자를 노출하지 않습니다 . 그런 경우에도 다른 값에 대해 이니셜 라이저 구문을 사용할 수 있습니다. 가정합니다.

private Album() { }
public Album(string name)
{
    this.Name = name;
}

매개 변수가없는 생성자는 비공개로 사용할 수 없습니다. 그러나 다른 하나를 사용하고 이니셜 라이저 구문을 사용할 수 있습니다.

var albumData = new Album("Albumius")
                {
                     Artist = "Artistus",
                     Year = 2013
                };

컴파일 후 결과는 다음과 동일합니다.

var albumData = new Album("Albumius");
albumData.Artist = "Artistus";
albumData.Year = 2013;

객체 이니셜 라이저는 클래스를 인라인으로 설정할 수 있기 때문에 멋집니다. 단점은 클래스를 변경할 수 없다는 것입니다. 중히 여기다:

public class Album 
{
    // Note that we make the setter 'private'
    public string Name { get; private set; }
    public string Artist { get; private set; }
    public int Year { get; private set; }

    public Album(string name, string artist, int year)
    {
        this.Name = name;
        this.Artist = artist;
        this.Year = year;
    }
}

클래스가 이런 방식으로 정의되면 클래스가 생성 된 후 클래스의 내용을 수정하는 쉬운 방법이 없다는 것을 의미합니다. 불변성은 이점이 있습니다. 어떤 것이 불변이면 그것이 옳다는 것을 결정하는 것이 훨씬 더 쉽습니다. 결국, 시공 후 수정할 수 없다면 '잘못'이 될 방법이 없습니다 (구조가 정확하다고 판단되면). 다음과 같은 익명 클래스를 만들 때 :

new { 
    Name = "Some Name",
    Artist = "Some Artist",
    Year = 1994
};

불변성이 유용하기 때문에 컴파일러는 자동으로 불변 클래스를 생성합니다 (즉, 익명 클래스는 생성 후에 수정할 수 없음). 대부분의 C ++ / Java 스타일 가이드는 이러한 이유로 인해 멤버 const(C ++) 또는 final(Java) 만들기를 권장 합니다. 더 큰 애플리케이션은 움직이는 부품이 적을 때 확인하기가 훨씬 쉽습니다.

즉, 클래스의 구조를 신속하게 수정할 수있는 상황이 있습니다. 설정하려는 도구가 있다고 가정 해 보겠습니다.

public void Configure(ConfigurationSetup setup);

다음과 같은 여러 멤버가있는 클래스가 있습니다.

class ConfigurationSetup {
    public String Name { get; set; }
    public String Location { get; set; }
    public Int32 Size { get; set; }
    public DateTime Time { get; set; }

    // ... and some other configuration stuff... 
}

객체 이니셜 라이저 구문을 사용하면 속성의 일부 조합 을 구성 할 때 유용 하지만 한 번에 모두 필요한 것은 아닙니다 . 예를 들어 나는 단지를 구성하려는 경우 NameLocation난 그냥 할 수 있습니다 :

ConfigurationSetup setup = new ConfigurationSetup {
    Name = "Some Name",
    Location = "San Jose"
};

그리고 이것은 가능한 모든 순열에 대해 새로운 생성자를 정의하지 않고도 몇 가지 조합 을 설정할 수있게 해줍니다 .

전반적으로 클래스를 불변으로 만들면 장기적으로 많은 개발 시간을 절약 할 수 있지만 객체 이니셜 라이저 구문을 사용하면 특정 구성 순열을 훨씬 쉽게 설정할 수 있습니다.


두 번째 접근 방식은 C #의 개체 이니셜 라이저입니다.

객체 이니셜 라이저를 사용하면 생성자를 명시 적으로 호출하지 않고도 생성시 객체의 액세스 가능한 필드 또는 속성에 값을 할당 할 수 있습니다 .

첫 번째 접근법

var albumData = new Album("Albumius", "Artistus", 2013);

생성자를 명시 적으로 호출하는 반면 두 번째 접근 방식에서는 생성자 호출이 암시 적입니다. 개체 이니셜 라이저를 사용하면 일부 속성도 생략 할 수 있습니다. 처럼:

 var albumData = new Album
        {
            Name = "Albumius",
        };

객체 이니셜 라이저는 다음과 같이 변환됩니다.

var albumData; 
var temp = new Album();
temp.Name = "Albumius";
temp.Artist = "Artistus";
temp.Year = 2013;
albumData = temp;

(디버그 모드에서) 임시 객체를 사용하는 이유 여기 Jon Skeet 가 답변 합니다 .

두 접근 방식의 장점에 관한 한 IMO, 객체 이니셜 라이저는 모든 필드를 초기화하지 않으려는 경우 특별히 사용하기가 더 쉽습니다. 성능 차이에 관한 한, 객체 이니셜 라이저가 매개 변수가 적은 생성자를 호출 한 다음 속성을 할당하기 때문에 어떤 것도 없을 것이라고 생각합니다. 성능 차이가있을지라도 무시할 만합니다.

참고 URL : https://stackoverflow.com/questions/19138195/c-sharp-assign-data-to-properties-via-constructor-vs-instantiating

반응형