2009-09-07 2 views
5

정적 참조를 이해하는 데 다소 혼란이 있습니다. 인스턴스 참조 넣다정적 클래스 호출은 "주소의 내용"을 의미합니다.

내가

Car myCar = new Car(); 

Car yourCar = new Car(); 

---------------      -------------- 
stack         Managed Heap 
----------------      -------------- 
             ----- 
myCar   ------- > points to  Car 
             ----- 
YourCar  ------- > points to  Car 
             ----- 

-----------------      --------------- 

어떤 경우 정적 클래스의 경우를 선언 할 때 우리가 이해 할 수 있습니까? 내가

staticClass.MyMethod() 

----------------- 
Managed Heap 
---------------- 
staticClass 
(Memory Address) 
----------------- 

업데이트를 선언 할 때 나는 그것을 의미 할 수있다 : 클래스는 청사진이고 오브젝트의 물리적 개체이기 때문에, 정적 클래스의 경우;를 내가 staticClass.MyMethod 또는 staticClass.MyField = 값을 선언 할 때, 내가 직접 힙과 상호 작용하는 건가요? (정적 클래스에는 인스턴스가 허용되지 않으므로).

+0

다른 것들이 있습니까?당신은 내 대답을 받아 들일 수 없으므로 아마도 당신은 여전히 ​​의문을 가지고 있습니다. :) –

답변

11

아니요, C#의 static은 기본적으로 "유형 인스턴스가 아닌 유형과 관련이 있음"을 의미합니다.

모든 정적 메서드는 정적으로 해결 - 즉, 컴파일시에 - 그래서 그냥 전혀 관련없는 인스턴스와 정적 메소드의 호출로 확인

StaticClass.MyMethod() 

를 호출. 유형 자체 (암시 적으로 일종의 일종이다) 이외에는 가리킬 수있는 것이 없습니다.

정적 클래스 인 유형의 변수는 선언 할 수 없습니다.

편집 : 기본적으로 차이점은 정적 메서드와 인스턴스 메서드 사이에 있습니다. 너무 정적 클래스는 인스턴스 메소드가 할 수없는 일이, 당신은 인스턴스 메서드를 만들 수는 없지만, 사이에 차이가 없습니다 :

StaticClass.StaticMethod(); 

NormalClass.StaticMethod(); 

심지어

SomeValueType.StaticMethod(); 

편집 : 수정 사항에 응답하려면 :

  • 정적 필드를 설정하면 실제로 힙에 영향을 미치지 만 정상적인 gen0/gen1/gen2 힙보다 약간 다른 힙 메모리 영역이라고 생각됩니다. (나는 정적 변수에 대해 AppDomain 기본적으로 힙이 있다고 생각합니다.)
  • 정적 메서드를 호출하면 기본적으로 JITted 코드에서 특정 주소에 약간의 코드 호출로 끝날 것입니다. 즉, 실행 가능한 일부 메모리에는 있지만 인스턴스 데이터에 사용되는 메모리 영역에는 없을 것입니다.

편집 : "응용 프로그램 수준 범위"가 무슨 뜻인지 잘 모르겠지만 정적 변수는 AppDomain과 관련된 유형과 관련되어 있습니다. 변수는 AppDomain이로드되어있는 한 보존됩니다. 여러 가지 이유로 언로드 될 수 있습니다.

+0

예. 정적 인 클래스의 변수를 선언 할 수 없습니다. 제 의도는 내부적으로 힙으로 표현되는 방식입니다. – user160677

+0

존 (Jon) 나는 내 질문을 업데이트했습니다. 정확히 내가 원하는 것을 골라 내지 못해서 미안합니다. – user160677

+0

:) 그래, 정확히 내가 원하는 것을 얻는다. 누군가 내 업데이트를 삭제했다. 아무튼 나는 대답을 얻었다. – user160677

0

정적 클래스를 관련 메소드의 네임 스페이스로 생각하십시오. 객체를 생성하는 데 클래스가 사용되지 않기 때문에 기술적으로 객체 지향 프로그래밍이 아닙니다. 관련 메서드를 함께 결합하여 일부 OO 관련 기술을 클래스에 적용 할 수있는 방법 일뿐입니다. (상속, 무엇보다도.)