2013-08-27 5 views
2

다음 코드를 얻고 싶습니다. 기본적으로 객체를 인스턴스화하고 클래스의 newTask 변수에 할당 한 다음 Button2Click 메서드에서 동일한 변수 이름 newTask에 동일한 작업을 수행 할 수 있는지 알고 싶습니다.객체의 수명 (클래스 및 메소드)

public partial class MainForm : Form 
{ 
    TaskTypes.Task newTask = new TaskTypes.Task(); 

    void Button1Click(object sender, EventArgs e) 
    { 
     newTask.setName("Clean the toilet"); 
     textBox2.Text = newTask.getName(); 

    } 

    void Button2Click(object sender, EventArgs e) 
    { 
     newTask = new TaskTypes.Task("Why isnt this part failing?"); 
     textBox2.Text = newTask.getName(); 
    } ... 
+1

이들은 동일한 변수입니다. 왜 그들이되지 않았을까요? 단일 변수 (클래스 멤버 필드) 만 선언했습니다. –

+0

'Button1Click' 안에'TaskTypes.Task newTask'를 선언하면 컴파일 오류가 발생합니다. 그러나 클래스 수준에서 선언 했으므로 클래스 내의 비 정적 메서드 나 이벤트에서 사용할 수 있습니다. –

+1

언급 할 또 다른 사항은 :'newTask''readonly'을 만들었다면, 당신은 그것을 재 할당 할 수 없을 것입니다.클래스의 생성자를 제외하고는 물론입니다. –

답변

3

여기에 두 가지 개념이있다 : 변수

  • 메모리 참조 범위와
    1. 범위는, 모든 것이 분명하다 - 클래스에 선언 된 변수는 클래스 멤버 및 액세스 수업 중 어디서나.

      이제 개체의 새 인스턴스에 변수를 할당하면이 변수가 해당 변수를 참조하고 있습니다. 새 인스턴스를 원하는만큼 여러 번 지정할 수 있습니다. 이전 인스턴스는 참조를 잃어 버리기 때문에 기술적으로 말하면 더 이상 뿌리를 내리지 않으며 가비지 수집에 사용할 수 있습니다. 한 번만 할당 할 수있는 읽기 전용 변수 (클래스 멤버)의 경우가 있습니다.

      추가 답변 : - 예 = 객체

      내가 인스턴스와 객체 사이에 정말 혼란 스러워요 생각합니다. .net에서 모든 것이 유형입니다. 모든 유형은 "객체"유형에서 파생됩니다. 일반적으로 힙 메모리에 저장된 객체는 참조 유형 또는 "객체"라고합니다. value-types 라 불리는 스택 저장 프리미티브.

      1. 개체는 작업 유형입니다. 예. TextBox도 객체 즉, 컨트롤

      2. 인스턴스를 만들고 "화장실 청소" - 예. 인스턴스 - 코드가 메모리에로드되었습니다.

      3. 변수는 newtask입니다 -

      4. 그래 난 다음 변수는 newtask에 새로운 인스턴스를 할당 - 예.

      5. 가비지 컬렉터가 "화장실 청소"라는 원본 인스턴스를 수집 했습니까? - 즉시. 가비지 수집기가 실행될 수있는 특정 조건이 충족 될 때

    +0

    그래서 - 명확하게 설명하기 위해 (나는 실제로 인스턴스와 객체 사이에서 혼란 스럽다고 생각합니다). 1. 객체는 TaskType입니다. 2. 인스턴스를 생성하고 "화장실 청소"라는 문자열을 전달했습니다. 3. 변수는 newTask입니다. 4. 새 인스턴스를 변수 newTask에 지정했습니다. 5. 원래 인스턴스 인 "화장실 청소" 쓰레기 수집가가 수집 했습니까? – Alpotato

    +0

    알기! 정말 고마워요 :) – Alpotato

    2

    이것은 스코프라고 불리며 변수가 표시되는 위치를 정의합니다.

    동일한 선언 된 변수를 사용하지만 첫 번째 버튼에서 클래스 인스턴스를 클릭 한 다음 두 번째 버튼에서 새 인스턴스를 클릭하십시오.

    +0

    아 - 내가 인스턴스와 객체를 다시 읽도록하겠습니다. (감사합니다) – Alpotato

    +0

    범위와 가비지 수집 대상은 C#에서 동일하지 않습니다. 오브젝트는 더 이상 액세스하지 않는 즉시 수집 할 수 있습니다. 이는 참조의 범위와 매우 다를 수 있습니다. –

    +0

    브라이언을 붙잡아 주셔서 감사합니다. 나는 너무 빨리 타이핑을하고 생각을 완전히 잃어 버렸습니다. 답변을 업데이트 중입니다. –

    0

    클래스에서 선언 된 변수는 해당 클래스의 모든 구성원에게 사용할 수 있습니다 (범위 있음).