2010-02-25 1 views
1

하여 C# 1 패스를 수행하는 통해 나는 상위 형태에서 하위 형태로 속성을 통해 파라미터를 전달하고있는 경우는 C#을 VS2008를 사용하여 값 또는 REF

또는 가리키고를 윈폼 속성을 모든 클래스에 추가하고 C#에서 전달하는 매개 변수 인 im은 부모 폼에서 만들어진 참조 형식 인 이 기본값으로 참조 또는 값으로 전달됩니까?

예 : 속성을 통해 데이터 집합을 전달하면 예. 그리고 값으로 전달되면 속성을 통해 ref로 전달할 수 있습니까? 아니면 그냥 매개 변수를 매개 변수로 전달해야하나요?

Basicaly 상위 폼으로 채워진 개체를 다시 검색하고 부모 폼에서 만들어진 개체를 ref로 전달하는 것이 좋습니다.

답변

5

참조 유형의 경우 변수에 대한 참조가 값으로 전달됩니다. 물론, C#에서 ref 또는 out 키워드를 사용하여 해당 동작을 변경하지 않는 한.

즉, DataSet 값 속성은 실제로 사실 DataSet 인스턴스에 대한 참조를 전달하고 값으로 전달합니다.

Jon Skeet's "C# in Depth"은 이러한 문제에 대한 훌륭한 참고 자료입니다.

+0

그래서 데이터 집합을 속성 매개 변수로 자식 폼에 전달한 다음 데이터 집합의 내용을 변경 한 다음 속성 반환 값을 검색하지 않고 자식 폼을 닫으면 만든 데이터 집합 개체의 변경 사항을 찾아야합니다. 부모 폼 권리 ? – Spooky2010

+0

절대적으로 옳습니다. :-) – CesarGon

+0

@Jon : 죄송합니다! 수정 해 주셔서 감사합니다! – CesarGon

0

C#은 C++과 동일한 방식으로 참조를 전달하지 않습니다. 참조 값에 따라 전달된다고 말하는 것이 더 정확합니다 (참조 유형의 경우).

Read this by Jon Skeet

2

C#의 참고 문헌으로 그 패스를 주목하는 것이 중요하다 특정한 의미를 갖는다. 속성의 경우 속성은 설정 한 개체의 주소와 동일한 주소를 가리 키도록 끝납니다. 함수에 개체를 전달하는 경우 C#은 값 의미에 따라 전달 참조를 사용합니다. 즉, 참조 자체가 복사되므로 새 포인터가 전달 된 객체와 동일한 주소를 가리 킵니다. 이렇게하면 함수가 매개 변수를 null로 설정하여 함수가 원래 포인터를 무효화하는 것을 방지 할 수 있습니다. 실제로 원래 기준을 통과하기 위해, "REF"키워드가 사용되어야

class SomeClass 
{ 
    public object MyObjectProperty { get; set; } 
} 

var someClass = new SomeClass(); 
object someObject = new object(); 

someClass.MyObjectProperty = someObject; // Makes MyObjectProperty point to the same location as someObject 

를 다음의 경우에, 값 의미론 기준이 사용된다 :

void MyMethod(object someObject) 
{ 
    someObject = null; 
} 

object someObject = new object(); 
MyMethod(someObject); 
Console.WriteLine(someObject == null); // Prints false 

를 다음의 경우에, 실제의 통과에 의해 참조 시멘틱스가 사용된다

void MyMethod(ref object someObject) 
{ 
    someObject = null; 
} 

object someObject = new object(); 
MyMethod(ref someObject); 
Console.WriteLine(someObject == null); // Prints true 
+0

"pass by reference"는 특별한 의미가 있습니다 - "class '인 모든 것이"참조로 전달되었습니다 "라는 첫 번째 문장이 틀린 이유입니다. 인수 *는 참조로 전달되지 않습니다. * 값으로 전달되었지만 값은 참조입니다. "가치에 의한 참조 전달"을 의미 할 때 "참조로 전달"을 피하는 것이 좋습니다. –

+0

그건 정확히 내 대답을 설명했다 .... 당신은 실제로 그것을 읽었습니까? – jrista

+0

네, 제가 읽었습니다 - 그래서 나는 downvoting하지 않게되었습니다. 그러나 당신의 첫 번째 문장은 여전히 ​​오해의 소지가 있습니다. 나는 그것이 시정되어야한다고 생각합니다. –

1

이해 제일 먼저 .NET에서 가변 될 수 있다는 것이다 어느 값 유형 (예 INT) 또는 참조 형식 (클래스). 값 유형 변수는 메모리의 값을 직접 가리키는 반면 참조 유형 변수는 메모리 위치를 가리 킵니다.

기본적으로 매개 변수는 값으로 전달됩니다. 그러나 참조 유형의 '값'은 실제로 메모리에있는 위치라는 점을 기억하십시오. 따라서 값으로 전달되는 경우에도 실제로 특정 클래스에 대한 참조를 전달합니다.