2011-07-31 6 views
2

또 다른 topic에서 좋은 사람은 에릭 리 퍼트 (Eric Lippert)의 말을 인용하여 다음과 같이 말했습니다 : 정적의 중요성은 컴파일러가 특정 클래스/구조체/필드를 컴파일 할 때 갖는 지식과 확실성과 관련이 있습니다. 메모리 위치와 관련이 없거나 고정되어 있지 않습니다.정적 멤버가 이동 가능하거나 고정되어 있습니까?

컴파일러가 아래에 표시된 것을 허용하기 때문에 그러나 아직 확실하지 않습니다.

 struct MyStruct 
     { 
      public static int[] Arr = {1,3,5}; 
     } 
     static void Test<T>(ref T t) where T:struct 
     { 
      Console.WriteLine (t); 
     } 
     void Main() 
     { 
      Test(ref MyStruct.Arr[2]);//output: as expected 5 
     } 

는 심판 인수가 완전히 다른 것들 ++ 참조를 C 비교, 아니면 현장 핀 뒤에 어떤 인수가 심판에 의해 전달 될 때마다 어떻게됩니까? 정적 멤버가 움직일 수있는 경우 런타임은 호출 된 함수의 실행 중에 배열 요소의 주소가 변경되지 않는다는 것을 어떻게 보장합니까? 나는 실험을 통해 '배열 이외의 Item prop'객체의 반환 값이 byRef를 전달할 수 없다는 것을 배웠다. 나는 배열 요소가 연속적인 메모리 덩어리로 할당 되었기 때문에 그런 생각을했습니다. 그러나 전체 배열이 움직일 수 있다면, 어떻게 요소의 주소를 취할 수 있을까요?

나는이 불확실성에 다소 집착하고 있습니다. 누군가가 어떤 답을 줄 수 있다면 정말 고맙겠습니다. 미리 감사드립니다!

그것을 이해하려고 노력 ~~~~~~~~~~~~~~~~~~ :

을 따라서, 어느 한 컴파일러는 우리 일이 허용하는 작업을 관리 그것을 땀을 흘려서는 안된다, 그렇지? 나는 C/C++ 배경을 가지고 있는데, 나는 C++에 대한 "정적"의 의미를 꽤 잘 이해하고 있다고 생각한다. 관리 된 코드의 움직일 수있는 점만이 나를 모호하게 만든다. 모든 관리 객체는 스택이나 관리 힙에 상관없이 항상 ref 인수가 항상 올바르게 가리킬 수 있습니다.

+0

static은 개체에 적용될 때와 달리 멤버 함수에 적용될 때 정적 인 의미가 다르기 때문에 혼란스러워집니다. 메모리를 차지하는 회원. [Lippert의 인용문] (http://blogs.msdn.com/b/ericlippert/archive/2007/06/14/calling-static-methods-on-type-parameters-is-illegal-part-one .aspx)는 메서드에 대해서만 사용되었습니다. –

+0

아무튼, 객체가 재배치되면, 그 객체 (그리고 그 안에 포함 된 객체들)에 대한 모든 참조도 또한 업데이트 될 것입니다. 주소가 아니라 참조 인 이유입니다. –

답변

4

C# ref 인수는 C++ 참조와 완전히 다르지 않지만이 점에서 다릅니다.

# ref 인수는 가비지 수집기에 알려져 있으며 개체가 다른 세대로 승격되면 조정됩니다.

.NET 가비지 수집기에서는 C++ 참조가 보이지 않으며 대상이 고정되어 있고 가비지 수집기가 실행되면 중단됩니다.

은 정적 멤버가 이동하는 경우 어떻게 런타임이, 배열 요소의 주소가 실행하는 동안 변경되지 않습니다 보장 않습니다

(C++/CLI는 .NET 참조 및 기본 참조를 모두 지원) 라는 함수?

은하지 않습니다. 그러나 .NET 코드이기 때문에 함수는 업데이트 된 주소를 사용합니다.

그리고 배열을 참조하는 정적 필드가 있는지 여부에 따라이 변경 사항이 없습니다. 실제로 배열 자체는 정적이 아니며 참조하는 필드 만 의미가 있습니다.이 사실은 모든 질문을 무의미하게 만듭니다.)

+0

참조 된 객체가 이동 될 때마다 조정됩니다. 내가 제대로하고 있니? 감사! – Need4Steed

+0

@ Need4Steed : 맞습니다. –