2013-12-13 1 views
-1

그래서 최근에 변수를 다른 클래스 객체에 전달하여 변수를 변경할 수 있다는 것을 알았습니다. 그런 다음 새로받은 값을 변경하면 초기 값이 변경됩니다. 나는 이것을 매우 잘 설명하지 못했기 때문에 사과해야합니다. 여기에 제 테스트가 효과가 있었는지 여부를 확인할 수있었습니다.참고로 문제 전달

클래스 프로그램 { static objectA; 정적 객체 B b;

static void Main(string[] args) 
    { 
     a = new objectA(); 
     b = new objectB(a); 

     Console.WriteLine(a.v + "\n"); 
     Console.WriteLine(b.b.v + "\n"); 

     a.v = 5; 

     Console.WriteLine(a.v + "\n"); 
     Console.WriteLine(b.b.v + "\n"); 

     b.b.v = 7; 

     Console.WriteLine(a.v + "\n"); 
     Console.WriteLine(b.b.v + "\n"); 

     Console.ReadLine(); 
    } 
} 

class objectB 
{ 
    public objectB(objectA b) 
    { 
     this.b = b; 
    } 

    public objectA b; 
} 

class objectA 
{ 
    public objectA() 
    { 
     v = 0; 
    } 

    public int v; 
} 

나는 입자와 입자 엔진을 갖춘 프로젝트에서이 약 연주하며 훌륭하게 일했다, 그러나 나는 다른 무언가를 시도하고 좀 잃었어요.

은 내가 편집 할 때, 메인 클래스는 클래스 A가 초기화

추상 클래스 C.에게 상속 그것을 내 테스트와는 달리

클래스 C에 저장하는 값을 전달 클래스 B를 상속 클래스 A가 메인 클래스의 값은, 값이 지금은 그것이 추상적 아니다 참조 내 입자 엔진에서 찾고 클래스 C.

class MainExample { 
private vector2 position = new vector2(175, 135); 
private ship_ShipName ship_(); 
... 
    public MainExample() 
    { 
      ship_ = new ship_ShipName(position); 
      ... 

     } 
} 

class ship_ShipName : Ship 
{ 
    public ship_ShipName(vector2 position) 
    { 
      this.position = position; //this.position being the position from Module.cs 
    } 
} 

class Ship : Module { ... } 
abstract class Module { vector2 position; } 

변경되지 않기 때문에 문제는 관련이 있어야합니다. 어떤 통찰력이라도 극명하게 평가되며, 내가 말하는 것은 '지나가는 참조'라고 생각하는 것이 옳다. 감사.

+0

위의 코드에서 값으로 모든 것을 전달하고 있습니다. –

+0

우리가 왜 프로그램이 무엇을하고 있는지 분석하고 싶다면, 우리에게 보여주십시오. 자신이하는 일을 보지 않고서는 왜 기대하지 않은 결과를보고 있는지에 대해서만 추측 할 수 있습니다. – Servy

답변

6

게시 한 샘플 코드의 아무 곳에서나 통과 참조가 없습니다. 두 개의 별개의 오브젝트 인 ab을 작성 중입니다. 이러한 객체는 독립적이며 하나의 속성/필드에 대한 변경 사항은 다른 객체에 반영되지 않습니다.

이 라인에 대한 참조를 만드는 것으로 생각 될 수있다

b = new objectB(a); 

그것은 아니다. 새로운 객체를 만들고, objectB의 생성자를 호출하여 a을 인자로 전달합니다 (값으로 전달됩니다).

편집은 영업 설명

에 따라 나는 당신의 테스트 프로그램 및 게시 실제 코드의 차이가 실제 코드에서 vector2struct이라고 생각합니다. 구조체는 참조 형식 인 클래스와 달리 C#의 값 형식입니다. 테스트 코드에서에 대한 생성자에 a을 전달하면 인수는 클래스이므로 참조 형식은 참조로 전달됩니다. 실제 코드에서는 vector2 사본을 만들고 있습니다.

ref 키워드를 추가하여 참조로 생성자에 값을 전달할 수 있습니다. 그러나 복사본을 로컬 필드에 할당하면 복사본이 만들어집니다. 이 문제를 쉽게 해결할 수있는 방법은 없습니다. 가장 좋은 방법은 벡터를 포함하는 class 래퍼 유형을 작성한 다음 모든 당사자가 래퍼 오브젝트의 단일 인스턴스에 대한 참조를 보유하는 것입니다.

+0

'b'의 생성자에서 'a'에 대한 참조 값을 전달합니다. 이것은 아마도'objectA' 타입의'b'라는 내부 변수에 최상위 레벨'a'의 값을 할당하고'a'의'v'를 변경할 것입니다. 이것은'b.b.v'에 반영됩니다. –

+0

가능합니다. OP가 클래스'objectA'와'objectB'에 대한 코드를 게시하지 않는 한 확실한 방법은 없습니다 ... – TypeIA

+0

OP를 전체 코드로 업데이트했습니다. 혼란을 가져 오게해서 죄송합니다. 도움을 주신 모든 분께 감사드립니다. – Anthony

-2

클래스는 참조에 의한 것입니다. 그것들은 그 클래스에 대한 포인터입니다. 클래스 매개 변수는 복사되지 않습니다. 따라서 매개 변수 클래스 '필드를 변경하면 외부 클래스'필드가 변경됩니다. 클래스의 단일 인스턴스가 있습니다.

복제는 클래스를 복사하는 것입니다 (두 개의 다른 클래스 생성).

+0

Nope. 매개 변수가'ref' 또는'out'가 아닌 한 "pass-by-reference"는 없습니다. – newacct