2008-10-18 7 views

답변

13

얼마나 많은 개발자가 ref/out을 정말로 이해하지 못하는지 보셨습니까?

나는 정말 필요한 곳에서 사용하지만 그렇지 않은 곳에서는 사용합니다. 일반적으로 두 개 이상의 값을 효과적으로 반환하려는 경우에만 유용합니다.이 경우 적어도 을 생각하면으로 생각하면 메소드가 하나만 수행됩니다. 때로는 ref/out을 사용하여 입니다. 가장 적합한 방법은 다양한 TryParse 메서드입니다.

+1

아멘. 몇 년 전 C# 교육 과정을 밟았으며, 그룹에 "개발자"가되어 심판/퇴사를 당부하지 못했습니다. –

+0

"개발자"는 포인터가 무엇인지 이해하지 못했을 것입니다. –

+0

주로 성능을 위해 ref/out을 사용합니다. 256 바이트 구조를 초당 105840000 번 복사 할 수있는 방법이 없습니다.) – TraumaPony

2

ref/out은 자동으로 변경 가능성을 의미하며 변경 불가능한 값을 사용하는 함수형 프로그래밍은 요즘 큰 일입니다. Dictionary.TryGetValue에 대한 호출을 LINQ 쿼리에 삽입 해보십시오. API는 변수를 선언하고 API에서 '유창함'을 파기해야합니다.

"이것이 이유"라고하지는 않지만 "이유"의 예입니다.

(예 : API를 다루는 방법 함수형 언어에 대한 논평에 대해서도

http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!181.entry

를 참조하십시오.)

+0

ref/out은 변수의 변경 가능성을 의미하지만 반드시 데이터 유형은 아닙니다. (나는 보통 로컬 변수와 함께 사용합니다.) 유창함은 흥미 롭습니다 - TryXXX는 다른 분기를 위해 다른 동작을 요구하는 경향이 있습니다. 실제로는 유창하지 않습니다. ( –

1

심판 인/아웃도 "FUNC"대표하므로 이러한 스타일의 API를 사용하여 작동하지 않습니다 델리게이트를 사용하는 다른 API로는 작성하기 쉽고 재사용 할 수 없습니다.

2

아마 가장 좋은 이유입니다. 혼란이란 유지 보수가 줄어들고 미묘한 버그가 발생할 가능성이 커짐을 의미합니다. 나는 그것들을 "goto"제어 흐름 문장과 비슷한 관점에서 본다. 자체적으로 나쁘지는 않지만, 수십 년 동안 많은 프로그램을 읽거나 이해하는 것이 불가능합니다.

코드를 혼란스럽게 만들 수있는 것이 무엇이든 떨어져 있어야합니다.

그렇다고해서 프레임 워크 개발자가 이러한 키워드를 필요로했기 때문에 그러한 키워드가 존재했을 가능성이 높습니다. 적절한 해결 방법이 없으면 사용하십시오. 가능한 경우 사용하지 마십시오.

5

제 생각에는 일반적으로 훨씬 좋은 옵션 인 객체를 반환하기 때문에 코드 냄새라고 생각합니다. 당신이 발견하는 경우

, 닷넷 라이브러리에 그들은 단지, 특별한 경우, 즉 tryparse -like 시나리오에 사용됩니다 값 형식 권투 의미

  • 클래스를 반환을
  • 방법의 계약은 빨리해야하므로 복싱/언 박싱은 실행 가능한 옵션이 아닙니다.
-2

코드 복잡성의 이유가 충분하지 않습니까?비교 :

int myValue; 
ReadFromSomewhere(ref myValue); 

에 :

int myValue = ReadFromSomewhere(); 
+0

2 개의 값을 반환하려는 경우는 어떻습니까? byref 인자를 사용하여 2 개의 값을 리턴하는 것이 더 쉽다. 하나의 함수를 호출하는 목적으로 만 사용되는 객체/구조체를 생성하는 것이다. – Kibbee

+0

사실,하지만 다중 인수를 언급하지는 않았다. 그 함수의 사용자라면 구조체를 선호 할 것입니다. –

+0

어떻게 복잡합니까? – TraumaPony

-1

당신은 객체를 반환해야하는 것은 아마 그들이 밖으로 심판 또는 사용하지 않는 것이 좋습니다 것이 가장 가능성있는 이유입니다.

"ref"는 실제로 스칼라 값을 전달할 때만 사용해야하지만 사람들이 참조로 전달되는 객체에 자주 사용하는 것을 볼 수 있습니다.

1

그냥 생각, 반환 된 데이터를 캡처하는 대신 인수가 실행 상태를 캡처 할 때 유용 할 것이라고 생각했습니다. 고객 개체를 반환하는 서비스에서 오류 메시지를 가져 오려는 경우를 생각해보십시오.

Customer GetCustomerById(int id, out string errorMessage); 

이 메서드가 실패하면 null Customer 개체를 반환하거나 예외를 throw 할 수 있습니다. 그러나 오류의 원인 (유효성 검사 - 데이터베이스)을 알고 싶다면 인수를 사용합니다. errorMessage 인수는 데이터와 아무런 관련이 없습니다. 단순히 메소드 실행의 잘못된 점을 파악하는 데 사용됩니다.

개인적으로 두 개 이상의 필수 데이터/값을 반환 할 것으로 예상되는 메서드가있는 경우 코드 디자인을 다시 생각해 보겠습니다.

0

ref/out을 사용할 때 1.0 GC에 문제가 있다는 말을 들었습니다. 2.0의 GC (그리고 아마도 1.1도 아님)에는 이러한 문제가 없으므로 일반적으로 유용하지 않은 유산이라고 생각합니다.

0

@TraumaPony 이 .NET 프레임 워크 guidlines에 소스 (URL 또는 무언가)를 제공하면 문제가 없습니다.

+0

내 추측은 TraumaPony가이 책 (또는 전임자)을 언급 한 것입니다. http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321545613/ref=pd_bbs_sr_1?ie=UTF8&s=books&qid= 1224484809 & sr = 8-1 –