2011-01-06 4 views
0

우선, 천 번이 요청하면 사과드립니다. 나는 C# 서적을 읽었는데, 나는 그것을 봤지만 내가 찾고있는 답을 찾을 수없는 것 같아. 아니면 중요한 순간을 놓치고있다.C#에서 형식화 된 변수에 대한 포인터 : 인터페이스, 일반 개체 또는 클래스? (복싱/언 박싱)

저는 전체 권투/언 박싱 문제와 매우 혼동합니다. 모두 다른 유형의 입력란 (예 : 'double')을 반환하는 입력란이 있고이 입력란 중 하나에 변수 지점을 지정하고 싶습니다. 보통 오래된 CI에서 같은 일을 할 것입니다 :

ChartPlotData(*newVar); 

내가 포인터를 찾고 있어요 이유가 있기 때문입니다 :

double * newVar; 
newVar = &oldVar; 
newVar = &anotherVar; 
... 

나는 타이머 함수를 호출하고 참조 된 변수의 값을 전달해야 newVar는 런타임에 이벤트에 링크되어 변경됩니다.

public void checkbox_Clicked(object sender ...) 
    if (sender == checkbox1) value = &object1.field1; 
    if (sender == checkbox2) value = &object2.field1; 

어떻게 C#에서이 작업을 수행 할 수 있습니까?

EDIT1 : 설명의 목적을 설명했습니다.

EDIT2 : 몇 가지 잘못된 문장을 작성하고 삭제 한 다음 질문을 짧게합니다.

+2

이러한 참조의 목적은 무엇입니까? – Schultz9999

+0

이 문장의 의미는 무엇입니까?"C#에서는 인터 프레이즈를 수행 할 수 있지만 모든 필드가 속성이어야하며 동일한 이름이 필요합니다. 속성 중 하나가 이름이 같지 않거나 속성이 아닐 때 분리됩니다." – Amy

+0

개체를 강제로 인터페이스를 구현할 수는 있지만 이는 의미가없는 모든 개체에 공통된 속성을 만들어야한다는 것을 의미합니다. 예를 들어 'Car'클래스에는 'NrWheels'속성이 있고 'Boat'클래스에는 'NrPropellers'속성이 있습니다. 런타임에 Plot (NrRotatingDevices)을 호출하고 싶다면 'NrRotatingDevices'인터페이스를 만들 수 있지만이 인터페이스를 구현하거나 NrPropellers 및 NrWheels의 이름을 NrRotatingDevices로 바꾸려면 두 클래스를 모두 수정해야합니다. – PaulG

답변

1

편집에 제안 된대로 클릭 이벤트를 가질 수 있으며 대리인을 사용하여 컨트롤에 전달할 데이터를 선택할 수 있습니다. 비록 당신의 성능 요구 사항을 충족시킬 지 모르겠습니다.

ChartPlotData(valueSelector()); 

// ... 

Func<double> valueSelector; 

protected void Checkbox_Click(object sender /* ... */) 
{ 
    if (sender == checkbox1) valueSelector =() => object1.field1; 
    if (sender == checkbox2) valueSelector =() => object2.field1; 
    // ... 
} 

(당신이 선호하는 경우, 당신은, 당신은 방법 내부가 아닌에서 유유히 선택 대리자를 일반 double보다는 Func<double>를 허용하도록 ChartPlotData 방법 과부하, 다음 호출 할 수 있다면 전화 사이트)

0

간단한 유형과 구조체는 C#의 값 유형입니다. 안전하지 않은 수식어를 사용하지 않는다면 아무 것도 할 수 없습니다. 그런데, 당신의 선택은 제한되어 있습니다.

  1. 기본 유형 대신 객체를 사용하십시오.
  2. 크기 1의 배열을 사용하십시오.
  3. 위에서 요약 한 사용자 지정 제네릭 프록시 클래스.
  4. ???
+0

일반 프록시 클래스를 사용하려는 경우 효과적으로 값을 상자에 넣거나 값을 unbox해야합니다. – Amy

+0

@ yodaj007 : 오른쪽, 프록시가 값 유형을 저장하고 있습니다. 그러나 이제는 클래스이므로 참조로 전달할 수 있습니다. VTP d = 새 VTP (1.2); VTP d1 = d; petro.sidlovskyy의 답변을보세요. d1.Value = 3.1; 어설 션 (d.value == 3.1); – Schultz9999

0

ref keyword을 사용하여 기존 값 유형을 참조 할 수 있습니다.

public static void ModifyNumber(ref int i) 
{ 
    i += 1; 
} 

static void Main(string[] args) 
{ 
    int num = 4; 
    ModifyNumber(ref num); 
    ModifyNumber(ref num); 
    ModifyNumber(ref num); 
    ModifyNumber(ref num); 


    // num now equals 8 


} 
+0

C에서는 Function (& variable1)과 같지만 variable2를 가리 키려면 Function (& variable2)을 호출해야합니다. Function (pVariable)을하고 싶습니다. 여기서 'double * pVariable'과 변수는 런타임에 할당됩니다. – PaulG

+0

폴, 이젠 C가 아니야. 이것은 C#입니다. 상황은 여기서 다르게 수행됩니다. – Amy

+0

요다 (Yoda), 그래서 여기에 내가 어떻게하는지 묻습니다. 죄송합니다. 설명이 명확하지 않지만 답변이 도움이되지 않습니다. – PaulG

0

왜 변수 주소가 필요한지 잘 모르겠습니다. Double은 값 유형이며 스택에 저장됩니다. 메서드에 대한 설명으로 전달하려면 C# ref 키워드 만 사용하십시오. 당신은 내가 개인적으로 이런 식으로 뭔가를 선호 언급 한 사례에서
는 :

class Program 
{ 
    public class Refferenced<T> where T : struct 
    { 
     public T Value { get; set; } 
    } 

    static void Main(string[] args) 
    { 
     Refferenced<double> x = new Refferenced<double>(); 
     Refferenced<double> y = new Refferenced<double>(); 
     y.Value = 2; 
     x = y; 
     x.Value = 5; 
     Console.WriteLine(x.Value); 
     Console.WriteLine(y.Value); 
     y.Value = 7; 
     Console.WriteLine(x.Value); 
     Console.WriteLine(y.Value); 

     Console.ReadKey(); 
    } 


는 C# nullable 형식과 유사하다.

+0

그 이유는 차트 작성 도구에서 최대 속도를 얻으 려하고 런타임에 변경 내용을 그려야하는 입력 된 값을 참조하기 때문입니다. 나는 플롯 함수를 호출 할 때마다 boxing/unboxing 객체의 오버 헤드를 피하려고 노력하고있다. – PaulG

+0

'double'의 인스턴스가 스택에 저장되지 않을 수 있습니다. – jason

+0

@ PaulG : 제네릭을 사용하는 경우 권투/복싱을하지 않아도됩니다. 또한 propety getter 또는 setter가 메소드 호출이기 때문에 최상의 성능이 필요한 경우 속성 (값)을 간단한 필드로 바꿀 수 있습니다. 또한이 일반 클래스를 봉인 할 수도 있습니다. –

관련 문제