2016-10-14 2 views
1

내가 참조하고 값을 변경하더라도 Class1.a가 여전히 null 인 이유는 무엇입니까? 문자열은 참조 유형이므로 값을 변경하면 참조에 영향을 미칠 것이라고 생각하지만 사실이 아닙니다. 왜 누군가가 나를 설명 할 수 있니? 그것은 정적 선언자를위한 것입니까?설명 정적 멤버

class Class1 
{ 
    public static string a; 
} 
void Main() 
{ 
    string a = Class1.a; 
    a = "hello"; 
    MessageBox.Show(Class1.a); 
} 

출력 : Main()에서

+0

'MessageBox.Show (A)' –

+0

Class1.a = "안녕하세요"; –

+0

두 문자열 모두 다른 문자열이므로 –

답변

6

값을 변경하지 않았습니다. 방금 로컬 변수에 null 참조의 사본을 만들었으므로 새 문자열을 참조하도록 로컬 변수를 설정했지만 모든 경우 null을 제외한 다른 참조를 원래 참조로 변경하지 않았습니다.

문자열이 참조 유형이지만 참조 유형을 사용하더라도 참조 자체를 변경하는 것은 참조되는 객체의 속성을 변경하는 것과 다릅니다. 예를 들어

: 시간 A와 B에 동일한 객체를 참조 때문에이 예에서는

Foo a = new Foo(); 
Foo b = a; 
b.Bar = 7; 
b = new Foo(); 
b.Baz = 12; 

는 a.Bar는 7 일 것이다. 그러나 b가 다른 대상을 참조하도록 변경 되었기 때문에 a.Baz는 12로 설정되지 않았습니다. 변수 a는 여전히 생성 된 첫 번째 객체를 나타내며 두 ​​번째 객체는 참조하지 않습니다.

문자열은 추가적으로 객체를 수정하지 못하지만 (변경 불가능), 이는 객체를 수정하지 않고 참조를 수정했기 때문에 코드가 작동하지 않는 이유입니다.

0

널 (null), 당신이 a = "hello"; 쓸 때, 다른 문자열을 참조 로컬 참조 변수 a을 말하고있다. (이전에 귀하의 서면 string a = Class1.a;에 그것은 Class1.a과 같은 문자열을 말하고있었습니다).

a의 새 값은 일반적으로 static 구성원에 대해 참조 된 값과 다른 문자열이됩니다. Class1입니다.

-1

정적 필드는 객체가 아닌 유형과 연결되어 있기 때문에 다중 인스턴스 인 경우에도 동일한 저장소를 공유합니다. 즉, 생성 한 객체의 수와 혼동되기 쉽습니다. 에 관계없이 정적의 그것의 참조가

을 어떻게 작동하는지 더 많은 그래서 string a = Class1.a; 즉 과제 정당한는 데이터 "hello"에있는 기준점 뭔가 다른 것을 변화 a = "hello"; 그러나 두 번째 줄에 널 Class1.a에서 참조의 값이 하지만 여기서 Class1.a는 여전히 null을 참조합니다.

하지 직접하지만 간접적으로이 참조 당신을 도울 수 있습니다 http://jonskeet.uk/csharp/parameters.html

+0

이렇게하면 로컬 편집이 정적 필드에 영향을 미치지 않는 이유가 무엇인지에 대해 설명하지 않습니다. 이는 질문에서 묻는 것입니다. – Servy

+0

@Servy 만약 그렇다면, 정적 필드를 갖는 목적을 무효화 할 것입니다. – brykneval

+0

여러 인스턴스가 그것에 영향을 줄 수 있다면 공유 스토리지가있는 목적을 무효화 할 수 있습니까? 아니, 그게 어떻게 작동하는지 아니야.정적 필드의 별명을 지정하는 로컬 변수를 작성해도 정적 필드를 갖는 목적을 상쇄하지는 않습니다. 이것은 그렇게하지는 않지만, 결코 그렇게하지 않는 이유 * 왜 * 그렇게하지 않습니다. – Servy