또 다른 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 인수가 항상 올바르게 가리킬 수 있습니다.
static은 개체에 적용될 때와 달리 멤버 함수에 적용될 때 정적 인 의미가 다르기 때문에 혼란스러워집니다. 메모리를 차지하는 회원. [Lippert의 인용문] (http://blogs.msdn.com/b/ericlippert/archive/2007/06/14/calling-static-methods-on-type-parameters-is-illegal-part-one .aspx)는 메서드에 대해서만 사용되었습니다. –
아무튼, 객체가 재배치되면, 그 객체 (그리고 그 안에 포함 된 객체들)에 대한 모든 참조도 또한 업데이트 될 것입니다. 주소가 아니라 참조 인 이유입니다. –