2012-03-31 6 views
-1
public class Class1 
{ 
    public static string Name="foo"; 

    public void ChangeName(string _name) 
    { 
    Name=_name; 
    } 
} 

in some other class.. 

Class1 _c=new Class1(); 
_c.ChangeName("bar"); 

의 비 정적 메서드를 통해 간접적으로 클래스의 정적 멤버를 변경할 수 있으며 정적 멤버를 변경하는 인스턴스입니다.클래스 및 파생 클래스의 인스턴스는 C#

정적 멤버는 클래스에만 사용할 수 있다고 생각했습니다. 클래스가 원하는 경우 정적 멤버를 변경할 수 있습니다. 하지만 여기서 인스턴스는 인스턴스를 간접적으로 변경할 수 있습니다. 인스턴스를 변경할 수 없습니까? 인스턴스를 만들면 클래스의 정적 멤버에 액세스하지 않고 힙에서 자체 공간을 차지합니다. 그래서 여기서 정말로 일어나고있는 것이 무엇입니까?

+0

외부 구성 요소가 모두 정적 변수를 변경하고 클래스 인스턴스의 가능성을 제거 할 수있는 가능성을 어떻게 상상할 수 있습니까? –

+0

이것은 다중 스레드의 악몽입니다. ;) – Marc

+0

하우스 (인스턴스)와 같지 않습니까? 청사진 (하우스 클래스)의 운명과 다른 인스턴스를 결정하십시오. 청사진이 원할 경우 자체가 바뀔 수 있으며이 새로운 청사진으로 제작 된 주택에 영향을줍니다. 다른 집들의 모습을 결정하는 집이 아닙니다. 그것은 점이 아닌가요 ?? – singsuyash

답변

0

아니요, 인스턴스가 정적 멤버에 액세스하지 못하게합니다. 인스턴스는 서로 분리되어 있지만 정적 멤버는 정적 메서드와 인스턴스 메서드에 모두 사용할 수 있습니다.

공개 했으므로 액세스 할 수있는 클래스 자체의 메소드도 아닙니다. 당신은 어디에서 변경할 수 있습니다 :

in some other class... 

Class1.Name = "Albert"; 
+0

메소드가 정적 멤버를 "가져오고"설정하지 못하게해야합니다. 나는 이것이 어떻게 일어나는가를 안다. 그러나 나쁜 것이 아니다. 내 위의 코멘트에서이 시나리오는 어떻습니까? 하우스 (인스턴스)와 같지 않습니까? 청사진 (하우스 클래스)의 운명과 다른 인스턴스를 결정하십시오.청사진이 원할 경우 자체가 바뀔 수 있으며이 새로운 청사진으로 제작 된 주택에 영향을줍니다. 다른 주택의 모습을 결정하는 집이 아닙니다. – singsuyash

+0

@ 스와시 : 정적 멤버는 청사진의 일부가 아니며, 커뮤니티 건물과 같으며 모든 인스턴스에서 사용할 수 있으며 모든 인스턴스에서 공유합니다. 정적 멤버를 객체 지향 원칙의 일부로 생각하지 마십시오. 액세스 수정 자의 영향을 받지만 상속에 전혀 관여하지 않습니다. – Guffa

+0

이 의미가 있습니다. 하지만 여전히 개체가 다른 형제 자매의 운명을 결정할 수있는 시나리오를 생각할 수 없습니다 (액세스 권한은 설정되고 설정되지 않아야 함). 그런데 파생 된 클래스를 통해 액세스 할 수있는 클래스의 public 정적 멤버가있는 경우. 이것은 내 질문에 추가됩니다 .. 왜 개체 및 파생 된 클래스 부모 클래스의 정적 멤버를 변경할 수 있어야합니다. – singsuyash

0

MSDN 명확하게 진술 : 클래스의 인스턴스는 클래스의 모든 인스턴스 필드의 별도의 복사본을 포함하는 동안

는 각 정적 필드의 사본

"이 . "

1

중요한 부분은 변경 정적 속성을 생성

public static string Name="foo"; 

이다. 이

Class1.Name="bar" 
외부 에서

클래스뿐만 아니라 수 있습니다 내부 클래스에서 - 당신이

Name="bar" 

이 단축 될 수 있습니다 클래스 내에서 정확히 무슨 일이 ChangeName("bar")

를 통해이라고한다

(210)

편집

만 정적 메서드 내에서 값을 변경 할 수있게하려면, 게터 적절한 세터 논리 구성/세터를 사용하는 것이 좋습니다.

+0

하지만 정적 멤버를 여러 번 변경할 수있는 클래스가 필요합니다! 할 수 없다면 읽기 전용 – singsuyash

+0

글쎄, 그래서 뭐가 문제 야? 클래스 정적 속성을 변경할 수있는 경우 클래스 내에서 변경할 수도 있습니다 (예 : OQ 코드). –

관련 문제