2009-06-25 2 views
3

C에서 out 매개 변수를 사용하는 데별로 열렬한 팬이 아니지만 Java가 언어 구문에 포함하지 않기로 선택한 이유를 알고 싶습니다. 거기에 어떤 특별한 이유가 있을까요 아니면 사람이 단순히 매개 변수 유형으로 객체를 전달할 수 있기 때문일까요?C#이 수행하는 동안 Java가 언어 구문에서 out 매개 변수를 사용하지 않는 이유는 무엇입니까?

+0

많은 프레임 워크는 효과를 달성하기 위해 주석을 사용 - 인스턴스 wariables에있는 작업 - Seam의'@ Out'처럼. –

답변

8

자바는 매우 단순한 문법으로 매우 단순한 문법으로 설계되었는데, 컴파일러 구현자를 포함하여 누구도 거의 알지 못하고 이해할 수없는 풍부한 기능을 갖춘 C++와는 대조적으로 "Spartan OO programming language"입니다.

기본적으로 기능은 절대적으로 필요하지 않으면 생략되었습니다.

한편으로 목표는 달성되었습니다. Java의 동작을 이해하거나 예측하기가 거의 불가능한 영역은 거의 없습니다.

반면에 누락 된 기능을 해결해야 Java의 잘못된 표시가 발생합니다. C# 디자이너는이 경험을 쌓기 위해 노력했습니다.

그러나 저는 개인적으로 매개 변수를 큰 손실로 간주하지 않습니다.

+1

나는 매개 변수가 매우 제한된 가치를 지니고 있음에 동의한다. 대부분의 경우 필자는 사용 된 매개 변수를 보았습니다. –

2

기본적으로 out 매개 변수를 사용하면 메서드에서 두 개의 반환 값을 사용할 수 있습니다.

자바는 구문을 단순화하고 오용 및 프로그래밍 오류의 가능성을 제거하기 위해이 기능을 남겼습니다.

+6

함수를 호출 할 때 명시 적으로 입력해야 할 때 프로그래밍 오류를 만들기가 어렵습니다. – Blindy

+1

나는 그것에 동의했다고 말하지 않았다. 그러나 디자이너가 어디에서 왔는지 알 수 있습니다. – jjnguy

1

두 개 이상의 값을 반환하려면 메서드에서 개체 또는 개체 컬렉션을 반환하도록 할 수 있습니다. 따라서 메소드에서 반환되는 항목보다 많은 것을 반환하는 매개 변수가 반드시 필요하지는 않습니다.

+4

하지만 bool을 반환하고 구문 분석 된 값에 out 인수를 사용하는 TryParse와 같은 메서드에서는 편리합니다. –

+0

동의합니다. 어떤 경우에는 주장을하는 것이 더 편리 할 것이다. 언어 설계자는 아마도 편의성과 언어의 복잡성을 더하게 될 것입니다. 복잡한 개체를 반환하는 – neesh

+0

은 훌륭 할 수 있습니다. 그러나 시스템의 "out"과 "ref"에서 마지막 성능 비트를 드래그해야 할 때 매우 편리합니다. –

9

아마도 디자이너가 여러 가지 방법으로 개체를 반환 할 필요가 없다고 생각했기 때문일 수 있습니다.

같은 질문

대표, 일반,에 대해 질문 할 수있다 그러나 문제의 사실은 C#을 디자이너가 나는 C# .NET을 느끼는 이야기를 나눴습니다 왜 많은 인 자바의 실수/불편에서 배운 것입니다 함께 사용할 수있는 더 좋은 언어입니다.

1

자바와 C#이 같은 시간에 디자인 된 것처럼 들리네요. Java는 거의 15 년이 넘었습니다. 외 매개 변수가 부족한 경우 (부족이라고 할 수있는 경우) 누락이 가장 적은 매개 변수입니다.

+0

때로는 C#과 비교하여 기능이 "부족"하여 Java로 건너 뛰려는 충동에 시달리지 않습니다. Java 7에 대한 소식을 듣고 마침내 교환하게 될 것입니다. – Draco

+0

현재 스칼라에 관심이 많습니다. 자바 플랫폼의 모든 장점이 있지만 정적 인 유형의 현대적인 언어가 있습니다. 아름다운. Java 7은 점점 더 원격적이고 무분별하게 보입니다. – skaffman

+0

@Draco - Java 7은 분명히 따라 잡을 기회를 날려 버렸습니다. "커뮤니티 프로세스"에 목 졸라 죽었습니다. –

0

C#은 임의의 기능에 대한 입력에 훨씬 낮은 장벽을 갖습니다. "Out"매개 변수는 유용하지 않으며 남용되기 때문에 Java에서 지원되지 않습니다. JDK7을 위해 Project Coin에 제출 된 많은 기능이 있었지만 IIRC out 매개 변수는 그 중 하나가 아니 었습니다.

+0

@Tom : 'C#은 무작위 기능을위한 입력에 훨씬 낮은 장벽이 있습니다'라고 생각하는 것은 조금 불공평합니다. 읽기 : http://blogs.msdn.com/ericlippert/archive/2009/06/22/why-doesn-tc-implement-top-level-methods.aspx : "왜 C#이 기능 X를 구현하지 않습니까? ? " 항상. 응답은 항상 동일합니다. 아무도 그 기능을 설계, 지정, 구현, 테스트, 문서화 및 출하하지 않았기 때문입니다. 이러한 모든 여섯 가지 기능은 기능을 구현하는 데 필요합니다. –

+0

@Tom : 모두 엄청난 시간과 노력과 비용이 들었습니다. 기능은 저렴하지 않으며 제한된 시간, 노력 및 예산으로 인해 사용자에게 최대한의 혜택을 제공하는 기능을 선적하기 위해 최선을 다하고 있습니다. –

+0

@Tom : 다음은 있습니다 : http://blogs.msdn.com/ericgu/archive/2004/01/12/57985.aspx : 그래서 우리는 덧셈 접근법을 대신 결정하고 복잡성을 유지하기 위해 열심히 노력했습니다 하위. 이를 수행하는 한 가지 방법은 "마이너스 100 포인트"개념입니다. 모든 기능은 구멍에서 100 포인트 씩 시작됩니다. 즉, 언어로 변환하기 위해 패키지 전체에 상당한 긍정적 인 효과가 있어야합니다. –

0

내가 여기서 뭔가 빠진해야 같은 느낌, 그래서 망각을 downvoted 될 만반의 준비를 해요 ...

하지 않습니다 C++로 동등하게 많은 매개 변수 "밖으로"Java 지원? My C# -fu는 그다지 강력하지 않지만, out 키워드는 메서드 내에서 객체를 변경할 수 있도록 컴파일러에 알리는 방법 일뿐입니다. 내가 맞다면 Java와 C++ 둘 다 키워드 사용에 대한 설명 (그리고 IMHO의 좋은 구별)없이 이것을 지원합니다. C++에서는 포인터 또는 함수에 대한 참조를 전달할 수 있으며 함수는 원하는대로 객체를 수정할 수 있습니다. 아마도 포인터에 포인터를 전달하고 함수가 객체를 할당하도록 C#의 구현과 비슷할 것이다. Java에서는 모든 객체가 Java에서 참조이므로 C++에서 참조를 사용하는 것과 완전히 똑같이 수행 할 수 있습니다.

내 방식의 오류는 어디에 있습니까? 아무도 이것을 아직 언급하지 않은 이유가 있어야합니다. 나는 그것이 무엇인지를 배우기를 고대합니다.

+0

나는 그 접근법이 "아마도 사람이 단지 매개 변수 유형으로 객체를 전달할 수 있기 때문에 그 질문에 정의되어 있다고 생각합니다." – Yishai

+0

ref 및 out 키워드를 사용하면 메소드가 객체 참조를 덮어 쓸 수 있지만 일반 매개 변수는 덮어 쓸 수 없습니다 (참조를 통해 수정할 수는 있지만).차이점은 후자의 경우 객체가 초기화 될 필요가 없다는 것입니다 (out 매개 변수 이후) –

+1

- Foo (out x) 여기서 x는 어떤 객체에 대한 참조이고, 그 후에는 메서드 호출 변수 자체가 다른 개체를 가리 키도록 수정되었을 수 있습니다. 이것은 객체의 내용을 수정할 수있는 것과는 매우 다릅니다. –

3

out 매개 변수의 숫자 1 사용 사례는 네이티브 코드와 부드러운 상호 작용입니다.

Java는 원시 코드와 원활한 interop의 우선 순위를 지정하지 않으므로 특별히이 기능이 필요하지 않습니다.

출력 또는 참조 매개 변수가 논리적으로 필요하지 않습니다. 사용할 수있게되면 CLR 언어의 일반적인 관용구 인 메소드의 비 던진 버전에 대한 "TryXXX"관용구가되었습니다. 하지만 그 대신에 복합 값 형식 (C#에서 struct)를 반환하여 할 수 있었다 :

struct TryResult<T> 
{ 
    public T Result; 
    public bool Succeeded; 
} 

TryResult<int> Parse(string intString) 
{ 
    ... 
관련 문제