C#에서 AddressOf 대안




address-operator (3)

Anyboby VB6에서 AddressOf 연산자에 관한 C #의 대체 솔루션을 도와 줄 수 있습니까? AddressOf는 long 값을 반환합니다. 어떤 방법으로 C #에서 결과를 얻을 수 있습니까?


C #에는 대리자 / 이벤트에 함수를 할당하는 특수 구문이 있습니다. 그냥 <delegate> += <function>;

실제로 다른 용도로 사용할 주소를 얻으려고한다면 운이 없다. 관리 코드에 관한 한 가지는 이러한 주소가 반드시 고정되어 있지 않다는 것입니다. 대부분의 기능이 변경 될 가능성은 거의 없지만 가능한 경우 상황이 있습니다.


Harper Shelby의 대답을 확장하면 가능하지만 일반적으로 .NET에서 코드 냄새가납니다.

C #에서 변수의 주소를 얻으려면 C 스타일 포인터 (*) / 주소 (&) / dereference (->) 구문을 사용할 수 있습니다. 이렇게하려면 메모리 주소를 직접 다루기 시작하자마자 관리 코드의 안전망 밖으로 튀어 나와 있기 때문에 / unsafe 컴파일러 스위치로 앱을 컴파일해야합니다.

MSDN의 샘플은 대부분의 이야기를 말해줍니다.

int number;
int* p = &number;
Console.WriteLine("Value pointed to by p: {0}", p->ToString());

이것은 number 변수의 주소를 int-to-int p 할당합니다.

이것에 몇 가지 걸림돌이 있습니다 :

  1. 가져 오는 주소의 변수를 초기화해야합니다. 기본값 인 값 유형에는 문제가되지 않지만 참조 유형에는 문제가 있습니다.
  2. .NET에서 변수는 사용자가 모르게 메모리에서 이동할 수 있습니다. 변수의 주소를 처리해야하는 경우에는 fixed 를 사용하여 변수를 RAM에 fixed 해야합니다.
  3. &는 상수 나 값이 아닌 변수에만 적용될 수 있습니다. 즉, int* p = &GetSomeInt(); 와 같은 구문을 사용할 수 없습니다 int* p = &GetSomeInt();
  4. 다시 말하지만 코드는 관리 코드 "안전망"외부의 기능을 사용하게 될 CLR에 플래그를 지정하는 안전하지 않은 모드로 컴파일해야합니다.

일반적으로이 세상에서 내 조언은 진지하게 당신이 .NET 세계에서 이것을해야한다고 생각 하는지 고려하는 것입니다. .NET의 임무 중 하나는 개발자가 금속에 대항하는 것을 막는 것이 었습니다.이 기능은 해당 사명과 반대입니다. 그것은 필요한 희귀 한 시나리오를 위해 존재합니다. 만약 당신이 할 수 있기 때문에 당신이 경솔하게 이것을 사용한다면, 아마 당신은 그것을 잘못 사용하고 코드 냄새를 맡을 것입니다.

가능하다면 피하십시오. 그러나 꼭해야한다면 그것을 사용하는 방법을 알아 두십시오.


EventHandler handler1 = this.button1_Click;
EventHandler handler2 = new EventHandler( this.button1_Click );
...
...
...
void button1_Click( object sender, EventArgs e ){
    // ....
}

두 표기법은 동일합니다.





address-operator