2013-02-22 2 views
2

알고있는 한 ClassObject은 참조 유형입니다.개체는 실제로 참조 유형입니까?

은 내가 값

var myClass=new MyClass(); 
int myNumber = 10; 
myClass.Number = myNumber; 
ChangeValue(myClass); 

을 두 배로 메소드를 호출 값

public void ChangeValue(MyClass classobj) 
{ 
    classobj.Number = classobj.Number*2; 
} 

을 변경하는 방법은 아래에 있습니다 그리고 그것은 당신이 그것을 해석 할 수있는 때와 같이 미세 인 20를 반환 될 것입니다 클래스의 객체를 만든 다음 메서드에 대한 참조를 전달하면 참조 값이 업데이트됩니다.

하지만 내 질문에 왜 개체 유형에 대한 일이되지 않습니다. 내가 객체를 만들고

object myObject = new object(); 
string sometext = "Some object value"; 
myObject = sometext; 
ChangeValue(myObject) 

그것이

public void ChangeValue(object objectValue) 
{ 
    objectValue = null; 
} 

나는 방법의 매개 변수를 알고있는 방법을 실행 한 후 값을 변경 실 거예요 아래처럼 일부 값을 할당 값 유형하지만 할 수있는 이유 즉 두 가지 참조 유형에 대해 다른 동작을한다는 것을 이해하지 못합니다.

+1

다음을 읽으십시오 : http://www.yoda.arachsys.com/csharp/parameters.html 메소드 매개 변수 전달에 대한 설명. –

+0

그냥 rememboer :'object'는 클래스이고 참조 유형임을 의미하는 별칭'System.Object'입니다. –

+1

기타 : http://stackoverflow.com/questions/3272861/reference-and-value-types-scenario http://stackoverflow.com/questions/1658985/what-is-a-value-class-and-what- is-a-reference-class-in-c –

답변

0

그것은 다른 행동, 당신이하고있는 아니에요 여러 가지

이것은 당신의 object 예를 정확히 작동합니다

public void ChangeValue(MyClass classobj) 
    { 
     classobj = null; 
    } 

그리고 이것은 첫 번째 예로서 작동합니다 (당신이 MyClass을 통과한다고 가정 인스턴스) :

public void ChangeValue(object objectValue) 
    { 
     ((MyClass)objectValue).Number *= 2; 
    } 

여기서 실제로 발생하는 것은 매개 변수 (속성 또는 필드가 아닌)를 할당 할 때 발생합니다. 매개 변수의 값을 변경하는 경우에만 해당). 원래 값과 호출 코드의 변수는 그대로 유지됩니다.

동일한

여기서 발생 :
MyClass a = new MyClass(); 
MyClass b = a; 
a = null; 
// b still contains the value created in the first line 

단순히 실제 값의 기준 변수 포인터 (메모리 어드레스)를 누르고 말하기. 변수 값을 변경하면 다른 객체 또는 null을 가리키게됩니다. 그러나 a.field=2을 수행 할 때 이것은 a이 참조하고있는 개체 값을 field 구성원 값으로 변경한다는 것을 의미합니다.

1

objectValueChangeValue(object objectValue)에 전달하고이 값은 참조입니다. 그런 다음이 값을 변경하지만 myObject 값은 변경하지 않습니다.

참조로 값을 실제로 전달하려면 ChangeValue(ref object objectValue)으로 전달해야합니다.

+0

myclass 객체에 동일한 작업을 수행 한 다음 객체를 만들어 Changevalue (MyClass objClass)로 전달하고이 값은 참조 유형입니다. 그럼 난 20 값을 변경하고 그것은뿐만 아니라 내 발신자 개체 값을 반영합니다. 그렇다면 왜 myClass 객체에서 작동 했습니까? – wikinevis

+0

@wikinevis, myClass의 값을 실제로 변경하지 않았으므로 (myClass 값은 참조 임) myClass에서 참조하는 객체의 값을 변경했습니다. – aush

2

실제로 여기서 두 가지 작업을 수행하고 있습니다. ObjectMyClass은 실제로 참조 유형이므로 실제 객체에 대한 참조를 ChangeValue 메소드로 전달해야합니다. 그러나 메서드 내부에 나타나는 참조는 복사본입니다.그들은 같은 객체를 가리 키므로, 메소드의 객체를 조작 할 때 메소드의 호출자는 변경 사항을 볼 수 있지만 메소드의 실제 참조를 변경하면 메소드 자체에만 영향을줍니다. 요약하려는 시도가

, 오브젝트 참조 로 전달되지만, 이들 참조 값에 의해 전달된다. 당신의 방법에서

public void ChangeValue(object objectValue) 
{ 
    objectValue = null; 
} 

는 당신이 실제로하는 일은 참조 objectValue를 재 할당하고, 해당 참조는 호출자가있다 myObject라는 기준의 복사본입니다. 메서드는 복사본 만 있기 때문에 호출자의 참조에는 전혀 영향을 미치지 않습니다.

이 방법을 만드는 방법은 참조로 참조를 전달해야합니다. 항상 두통을 안겨주지만, 그게 바로 ref 키워드입니다.

public void ChangeValue(ref object objectValue) 
{ 
    objectValue = null; // this is the SAME reference as the caller has, so the caller will see this change 
} 

그러나 그것은 또한 그런 식으로 호출 할 수 있습니다

ChangeValue(ref myObject); 

을 그래서 그것이 다른 객체를 가리키는 다시 올 수있는 콜 현장에서 분명있다. 그것은 참조를 다른 개체를 예기치 않게 가리키는 경우 당신이 여전히 오래된 값에 의존하고 끔찍한 혼란에 혼란에 빠지게 될 수도 있으므로 그것을 아는 것이 중요합니다.

+0

나는 당신이 실제로 옳은 것이 무엇을 의미하는지 볼 수 있습니다. My Question의 해석은 "myClass의 값이 ChangeValue (MyClass classobj)에서 변경되는 이유는 무엇입니까?" 메서드에 오는 myclass 참조의 복사본을 상상해보십시오. classobj.Number = 0; 이 변경에 대해 호출자에게 어떻게 알릴 것인가? – wikinevis

+0

발신자에게 변경 사항을 알리는 것은 아닙니다. 호출자와 메서드는 둘 다 참조를 가지고 있기 때문에 동일한 개체를보고 수정합니다. 메소드가 실행 된 후에 호출자가 객체를 보면 메소드가 동일한 객체를 변경했기 때문에 변경 사항이 표시됩니다. –