2013-03-13 3 views
1

에서 개인 회원의 할당을 방지하는 방법 나는 종종 자신이이 일을 찾을 :생성자

class MyClass 
{ 
    public MyClass(int x) 
    { 
     this.x = x; 
    }   
    private int x; 

    ... 
} 

내가 구성의 새로운 개인 멤버 변수를 추가 할 때마다, 나는에, 생성자의 매개 변수 목록에 추가 할 필요를 생성자 본문 및 멤버로 클래스에 전달됩니다. 여분의 타이핑을 피할 수있는 좋은 프로그래밍 패턴이 있습니까?

+1

가 변경, 매크로,이 내 마음에 드는 중 하나입니다 – Servy

+1

등의 추가 기능을 코드 조각을 사용하는 것이 도움이 아니라 3 개 개의 다른 장소에 있는지 아니, 불행하게도 사실로 인해, 그렇게 생각하지 마십시오 Resharper의 특징. 생성자에 새 매개 변수를 추가하고 Alt-Enter를 누른 후 엔터를 입력하면 해당 매개 변수에 대한 새 필드가 초기화됩니다. – hometoast

답변

2

일반적으로 생성자에 전달해야하는 개인 멤버가 포함 된 클래스를 인스턴스화하면 이미 문제가있는 것입니다.

MyClass myClass = new MyClass(x, y, z, 7, 'c', someOtherClass) 

적절한 경우에, 당신은 구조체 정도

class MyClass 
{ 
    public MyClass(Coordinates coords) 
    { 
     this.coords = coords; 
    } 
    private Coordinates coords; 

} 

public struct Coordinates 
{ 
    public int X{get; set;} 
    public int Y{get; set;} 
    public int z{get; set;} 
} 

같은 다른 클래스로 관련 분야를 캡슐화 할 수 있습니다 그리고 당신은없이

MyClass myClass = new MyClass(new Coordinates() { X = 1, Y = 2, Z = 3 }); 

그것을 실체화 할 수 있습니다 특정 구현, 최적의 솔루션을 결정하는 것은 다소 어렵지만, 실제로 fi를 설정하지 않아도된다면 클래스 외부에서 필드들, 당신은 내가 내 목표를 달성하기 위해 상속을 남용 할 수 있음을 발견

class MyClass 
{ 
    public MyClass() 
    { 

    }   
    private int x = 2; 

    ... 
} 

또는

class MyClass 
{ 
    public MyClass() 
    { 
     this.x = 2; 
    }   
    private int x; 

    ... 
} 
+1

1) 이것은 실제로 질문에 답하지 않습니다. 2) 이것은 종종 가능하지 않습니다. 컴파일 타임에 값을 알고 있다면 분명히 하드 코딩 할 것입니다. 그러나 매개 변수로 받아 들일 필요가있는 것은 매우 일반적인 것입니다. – Servy

+0

구성 매개 변수를 사용하여 구조체 전달을 제안 해 주셔서 감사합니다. 나는이 문법을 더 좋아한다. 그러나 내부적으로이 구성 구조체의 멤버에 액세스 할 때마다 더 많은 타이핑을하기 때문에 이것이 도움이되는 것은 아닙니다. 결과는 하루가 끝날 때마다 더 많은 타이핑이 이루어집니다. –

+0

@ChrisMerck "더 많은 타이핑"은 당연히 걱정해야 할 문제가 아닙니다. 실제로 걱정해야 할 부분은 여러 장소에서 동일한 변경을해야하는 경우 (때로는 하나를 잊어 버릴 수도 있음)이며 자신의 코드 (또는 다른 사람도 읽을 수 있음)를 읽을 수 있다는 것에 대해 걱정해야합니다. 지금부터 한달. –

0

처럼 뭔가를 할 수 있습니다. 필자는 기본 클래스의 종속성을 연결하는 유일한 목적을 가진 "Loader"하위 클래스를 설정했습니다. 그런 다음 기본 클래스로 작업하고 로더를 잊어 버릴 수 있습니다.

다시 말하지만 기본 생성자에서 이러한 보호 된 멤버 변수를 사용하지 못하게하는 끔찍한 부작용이 있습니다. 대신 .Start() 함수 또는 이와 비슷한 것을 사용해야합니다. 따라서 키 스트로크를 절약 할 수 있지만 이는 매우 나쁜 해결책입니다.

public class MyClass 
{ 
    protected int param1; 
    protected int param2; 

    public void DoStuff() 
    { 
     Console.WriteLine(param1 + param2); 
    } 
} 


public class MyClassLoader : MyClass 
{ 
    public MyClassLoader() 
    { 
     param1 = 1; 
     param2 = 2; 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 

     MyClass myObj = new MyClassLoader(); 
     myObj.DoStuff(); 

     Console.WriteLine("Press any key to quit."); 
     Console.ReadKey(); 
    } 
}