2009-07-08 5 views
5

생성자 외부에서 개체를 초기화하지 않아도 캡슐화가 중단됩니까?C# 개체 초기화 옵션

class MyClass 
{ 
    public string _aString; 
} 

가 _aString 회원이 개인 있어야하지 생성자를 호출 (생성자 생략)를 통해 인스턴스 :

이 주어

MyClass test = new MyClass("test"); 

대신 객체 초기화의 다른 방법 :

MyClass test = new MyClass { _aString = "Test" }; 
+0

와우! 빠른 시일 내에 5 개의 답변을드립니다! 고마워, 모두들. 이 코드는 C#에서 가져온 것입니다. 모범 사례인지 궁금했습니다. –

답변

6

"생성자 외부에서 개체를 초기화하지 않아도 캡슐화가 중단됩니까?"

음, 아니요. 이미 지적한대로 현재 범위에서 이미 액세스 할 수있는 속성 만 초기화 할 수 있습니다. (공개, 내부 등)

이러한 종류의 초기화는 실제로 클래스 생성과 속성 값 지정에 사용되는 문법적 설탕이며 익명 클래스 및 Linq select 절에 매우 유용합니다.

5

일반적으로 공용 fi를 노출하는 것은 나쁜 습관으로 간주됩니다. 예를 들어 필드가 readonly으로 표시되는 경우 (이는 생성자에서 설정되어야 함을 의미) 경우에 따라 허용 될 수 있습니다. 대신,이 필드는 비공개로하고 또는 목적에 따라, 읽기 전용하지 않을 수있는 속성을 통해 노출한다 : 그것은 변수의 목적에 따라

class MyClass 
{ 
    private string _aString; 
    public string AString 
    { 
     get { return _aString; } 
     // uncomment to make the property writable 
     //set { _aString = value; } 
    } 
} 
0

. 프로그래머가 초기화시 변수를 설정할 수 있어야합니다. 그런 다음에 변수에 액세스 할 수 없으면 private 변수를 사용합니다. 클래스 사용자가 언제든지 변수를 설정/읽을 수 있도록하려면 공개로 설정하십시오.

0

당신이
public string _aString;
있을 때이 이미 노출되어 있기 때문에이 값을 초기화 할 때 정말 중요하지 않습니다. 그래서 우리가 초기화에 관해 이야기하기를 원하면이 문자열을 속성으로 옮겨야합니다. 캡슐화에 대한 이야기는 의미가 있습니다.
그래서 문자열이 있다고 상상해보십시오. 초기 착지에는 크게 두 가지 접근법이있다. 하나는 생성자 내부에서 수행하는 것이고, 두 번째는 지연 초기화 (일부는이 데이터를 요청할 때 초기화)입니다.

0

예, 생성자를 통해 초기화하고 속성에 데이터 액세스를 허용하거나 허용하지 않습니다.

class MyClass { 
private string _aString; 
string MyProperty { 
        get { return this._aString; } 
        // you can make this private or protected 
        set { this._aString = value; } 

        } 
} 
1

속성을 게터 및 설정자로 생각하면 캡슐화가 중단 될 것으로 생각하지 않습니다. 그러나 Property를 사용하지 않았 음을 알아야합니다. 인스턴스 변수를 사용했습니다. 사실, 나는 그것이 당신의 모범처럼 될 것이라고는 생각하지 않습니다. 이 항목을 확인하십시오 :

class MyClass { 
    private string aString; 

    public string AString { 
     get { return aString; } 
     set {aString = value; } 
    } 
} 
MyClass test = new MyClass { 
    AString = "test" 
}; 

이 경우 접근자를 통해 비공개 필드에 액세스하고 있습니다. 매개 변수없는 생성자를 사용하고 값을 나중에 설정하는 것과 같습니다.

+1

공용 필드를 직접 설정하는 것은 개체 이니셜 라이저 (언어 의미 관점에서 적절한 디자인이 아님)에서 a-ok입니다. –

+0

내가 몰랐던! 감사! = D – Fernando

0

새로운 개체 초기화 속기가 캡슐화를 중단하는지 묻는다면 대답은 아니오입니다. 새 메소드를 사용하여 공개적으로 범위가 지정된 멤버 만 설정할 수 있습니다.

MyClass test = new MyClass { _aString = "Test" }; 

는 C# 클래스의 객체 공개는 "객체 지향 프로그래밍"의 관점에서 "캡슐화"를 아프게하지 않습니다 보여하려면

MyClass test = new MyClass(); 
test._aString = "Test"; 
0

과 동일합니다.

"우수 사례"라는 관점에서 볼 때,이 값 (확인, ...) 업데이트 동작을 변경하면 외부 코드가이 클래스를 사용할 수 있으므로 Properties를 사용하는 것이 좋습니다.