이전 버전과의 호환성이 필요하지 않다고 가정하는 C # 또는 .Net 기능? [닫은]


18

모든 제품 또는 프레임 워크가 진화합니다. 주로 사용자의 요구를 충족시키고 새로운 컴퓨팅 기능을 활용하며 단순히 개선하기 위해 수행됩니다. 때로는 기본 디자인 목표가 제품에 따라 변경 될 수도 있습니다. C # 또는 .net 프레임 워크도 예외는 아닙니다. 보시다시피, 현재의 네 번째 버전은 첫 번째 버전과 비교하여 매우 다릅니다. 그러나이 진화-후진 호환성에 장애물이됩니다.

대부분의 프레임 워크 / 제품에는 이전 버전과의 호환성을 지원할 필요가없는 경우 기능이 차단되었을 수 있습니다. C # /. net에서 이러한 기능은 무엇입니까?

답변 당 하나의 기능을 언급하십시오.



4
문제는 가이드 라인에 따라 명확하게 구성되지 않으며 환상적인 답변을 바탕으로 명확하게 구성됩니다. 재개 투표.
psr

1
부끄러운 줄 아세요, 아직도 에릭이 대답하지 않고 블로그에 올 것입니까?
jk.

답변:


35

익명의 방법 . C # 2.0에서 선택한 익명 메서드 구문이 C # 3.0에 추가 한 람다 구문과 비교할 때 엉성하고 어색하다는 데 모두가 동의한다고 생각합니다. 거의 같은 두 가지 구문을 사용하여 동일한 작업을 수행하는 것은 매우 유감입니다.


1
람다가 없었을 때 익명의 방법이 훌륭했습니다 ... 지금은 중복입니다.
Michael Brown

9
람다 식보다 훨씬 나은 익명 메소드의 한 가지 특별한 기능이 있습니다 .... 완벽한 이름 !!
탐험

1
이 시점에서 C #의 익명 메소드 구문을 기억하지 못합니다. 기괴한 이유로 람다 대신 하나를 사용해야하는 경우 찾아야합니다.
Kyralessa

33

비 제네릭 컬렉션을 제거합니다. 그들은 혐오입니다 ... 그리고 linq를 사용하고 있고 뭔가를 해야하는 경우가 너무 많습니다.

var customObjects = container.CustomObjects.Cast<CustomObject>();

그렇게해야 할 때마다 내 영혼의 작은 부분이 죽습니다.


너무 큽니다.

1
.NET의 모든 포트가 Generics를 지원하는 것은 아닙니다. .NET Micro가 그 예입니다. CustomObjects가이 플랫폼으로 이동하지 않으면 적용되지 않을 수 있습니다.
goodguys_activate

2
그것은 영혼이없는 것의 이점입니다.
CaffGeek

29

유형으로 void . 왜 지구상에서 유형이 "무효"입니까? 인스턴스가없고 값이 없으며 일반 유형 인수, 형식 매개 변수 유형, 로컬 유형, 필드 유형 또는 특성 유형으로 사용할 수 없습니다. 유형으로서의 의미는 없습니다. 오히려 메서드 호출이 가상 시스템의 스택어떤 영향을 미치는지 에 대한 사실 입니다. 그러나 가상 머신은 바로 가상 머신입니다. 실제 머신은 반환 된 값을 레지스터 (일반적으로 x86의 EAX)에 넣고 스택에 전혀 영향을 미치지 않습니다! 유형으로서의 무효는 단지 나쁜 생각입니다.

더 나쁜 : 같이 포인터 타입에 사용하면 void*뭔가 의미 완전히 다른 반환 유형으로 사용될 때 그것은 무엇을 의미하는지에 비해합니다. 이제 "알 수없는 유형의 저장 위치에 대한 포인터"를 의미하며, "값을 반환하지 않는 메소드"라는 의미와는 아무런 관련이 없습니다.

void*포인터 타입으로 대체 할 수 있습니다 IntPtr. (그리고 void**함께 IntPtr*등등.) 우리는 "단위", 단일 값, 즉, 널 (null)이있는 유형의 반환 형식으로 무효 교체 할 수 있습니다. CLR의 구현은 "반환되는"널이 안전하게 무시 될 수 있다는 것을 알면서 단위 유형 함수 호출이 레지스터 또는 스택의 사용을 적절하게 최적화 할 수 있다고 결정할 수 있습니다.

이러한 세계에서는 더 이상 분리 할 필요가 없다 Func<A, R>Action<T>위임한다. Action<T>그냥 Func<T, Unit>입니다.


4
... 그리고 Task단지 Task<Unit>. 비동기 CTP의 라이브러리 비트를 다시 구현하면이 점이 정말 좋았습니다.
Jon Skeet

24

빈 문장; . 오류가 발생하기 쉽고 거의 항상 오타이며 아직로 표현되지 않은 추가 의미는 제공하지 않습니다 {}.


7
64 비트 JIT </ snark>에서 큰 성능 저하를 언급하지 않아도됩니다.
Jesse C. Slicer

7
빈 성명서에 성능 불이익이 있습니까? 왜 그런 겁니까?
quentin-starin

22

참조 유형의 배열에서 안전하지 않은 공분산 . typesafe 공분산이 설정 IEnumerable<T>되면 배열 공분산에 대한 필요성이 사라졌습니다. (공변량 읽기 전용 목록 인터페이스가 있으면 전혀 필요하지 않습니다.)


당신이 :( 그것에 나를 이길 - 나는 질문 제목을 보았을 때 나는 절대적으로이 아래를 작성하려고 했어요
크리스 스미스

1
공변량 배열 참조를 수신하고 읽은 배열 참조에 안전하게 쓰는 기능 이 유용합니다. 제네릭이 아닌 제네릭 처럼 IList<T>상속 된 경우 정렬과 같은 것을 지원할 수 있지만 배열은 더 쉽게 지원합니다. IReadableList<out T>IPemutable
supercat

14

단항 플러스 연산자 . 역대 가장 유용한 연산자. 만약 우리가 이전 버전과의 호환성을 위해 그것을 유지할 필요가 없다면, 나는 그것을 심장 박동으로 꺼낼 것이다. 누가 이걸 사용합니까?

(설명 : 단항 더하기 연산자 +x는 사전 ++x증가 연산자가 아니며, 증가 후 연산자 x++가 아니며 2 진 덧셈 연산자가 아닙니다 x+y.)


1
for (int i = 0; i <ceiling; i ++)
Michael Brown

13
그는 사전 증분 및 사후 증분 연산자에 대해 이야기하고 있지 않습니다. 그는 단항 더하기에 대해 이야기하고 +1 == 1있습니다. 그것은 no-op에 가깝습니다.
Jesse C. Slicer

8
그것은 기계가 읽을 수있는 출력에 미치는 영향에 관한 것이 아니라 인간의 코드 모양을 향상시킬 수 있습니다 if(a == +1 || a == -1){...}.
토마스 브랫

5
@ ShuggyCoUK : 특히 기괴한 것은 과부하 가 걸린다는 입니다. 많은 일이 일어나기 때문입니다. JavaScript를 어떻게 작성하고 있고 사람 을 생각한다고 JS가 C #처럼 사용자 정의 단항과 연산자 의미를 만들 수 있기를 바랍니다 .
Eric Lippert

2
@ 에릭 나는 그것이 과부하 인 것을 몰랐다. 와우 당신은 :)와 성가신 난독을 할 수
ShuggyCoUk

12

숫자 리터럴을 기본값으로 double

대부분의 비즈니스 응용 프로그램의 decimal경우 어쨌든 더 적합합니다 ... 또는 기본 아이디어를 제거 하고 개발자가 실제로 선택하도록 강요하는 것이 좋습니다.

예를 들어, 나는 모든 사람들이 기본적으로 봉인되어야한다는 설득을 포기했지만 사람들이 생각 해야 한다고 설득하기가 더 쉽다고 생각 한다. 새 수업을 봉인해야하는지 여부를 명시 적으로 명시해야합니다.)


나는 정확하게 double / float로 표현 될 수없는 값을 암시하는 리터럴을 찾아 내고 싶을 것이다.
ShuggyCoUk

그들이 자바로 경우 - 여호수아 블로흐 "디자인이나 문서를 금지 상속 또는 다른"에 의해 신성한 텍스트로 참조 martinfowler.com/bliki/DesignedInheritance.html IIRC 코 틀린는 산업으로 이동하므로, 기본적으로 밀봉 클래스를 않습니다 이 점에서 더 나은 방향.
Elazar Leibovich

왜 수업을 봉인해야합니까?
James

@ 제임스 : 조쉬가 준 이유. 현명하고 일관된 방식으로 상속을 가능하게하는 클래스를 디자인하는 데는 시간이 걸리며 상속이 어떻게 사용 될지 알지 못하면 그렇게하는 것이 훨씬 더 나쁩니다.
Jon Skeet

1
@Pacerier : 예를 들어, 불변성에 대해 생각하십시오. 서브 클래스가 가변성을 도입 할 수 있으므로 봉인되지 않은 클래스는 변경할 수 없다고 주장 할 수 없습니다.
Jon Skeet

7

이것은 기능보다 지침이지만, 이미 사람들의 마음에 정식적이고 최상의 솔루션으로 너무 많이 뿌리 박혀 있기 때문에 중요하다고 생각합니다.

공식 패턴 구현 IDisposable.

번거롭고 더 좋은 방법이 있습니다.


6

내가 알고있는 다양한 타이머 클래스 사이에 큰 차이가 있습니다. 그러나 어쨌든 우리는 그것들 중 하나 나 둘을 제거 할 수 없었습니까?


4

Linq에서 사용되지 않는 방법 및 유형은 다음 ArrayList<T>같습니다.

  • Array.TrueForAll 로 교체 가능 Enumerable.All
  • Array.FindAll 로 교체 가능 Enumerable.Where
  • List<T>.ConvertAll 로 교체 가능 Enumerable.Select
  • Predicate<T> 로 교체 가능 Func<T, bool>
  • Converter<T,R> 로 교체 가능 Func<T, R>
  • IComparer<T> 정말 대리 자야 Func<T, T, int>

3
Predicate<T>함수 사용 방법에 대한 의도를 포착하고 약간의 타이핑을 저장하기 때문에 좋아합니다 .
Zebi

2

제네릭이 아닌 대표자 제네릭이 아닌 컬렉션들과 마찬가지로, 우리가 Func and Action 시리즈를 가지고 있기 때문에 제네릭이 아닌 대리인은 쓸모가 없습니다. 그리고 세 가지 매개 변수에서 변형을 차단했을 것입니다. 세 개 이상의 매개 변수가있는 경우 구조를 만들어 단일 매개 변수로 사용하십시오. 이벤트 처리를 위해 특정 델리게이트를 선언하는 것은 그리 건조하지 않습니다.


3
Action 또는 Func로 심판을 취하는 메소드에 대한 델리게이트를 어떻게 정의 하시겠습니까? 당신은 어떻게 정의 할 콤비 Func을 가진를? 즉, "대리인 DD (D d);"라고 말할 방법이 없습니다. Func와 함께.
Eric Lippert

2
흠… 그것이 내가 당신의 유능한 손에 사용하는 도구를 만드는 일을 떠나는 이유입니다.)
Michael Brown

@EricLippert : CLR 매직을 통해 "모든"arity의 대표자와 값 / 참조 매개 변수의 조합을 포함하는 특수 델리게이트 클래스를보고 싶습니다. 적절한 형식의 이름을 가진 매직 클래스에서 델리게이트를 검색하면 적절한 서명의 모든 대리자가 그로부터 상속 받게하십시오. 특정 대리자를 원하는 코드에는 여전히 정확한 유형이 필요하지만 특정 서명을 원하는 코드는 마법 이름을 사용할 수 있습니다.
supercat

-1

asmx 웹 서비스

요즘 WCF에서는 더 이상 쓸모가 없다고 생각합니다.


6
예, 그러나 때로는 더 쉽게 이해하기가 어렵습니다. . .
Wyatt Barnett

-2

Winforms
두 데스크탑 플랫폼 사이를 이동할 필요가없는 것이 좋습니다. WPF는 상황이 진행되는 곳이므로 플랫폼 수준의 이중화가 완전히 필요합니다.


Winforms는 WPF보다 훨씬 안정적이고 빠르며 버그가 적습니다 ...
Pacerier

작은 데스크탑 앱을 해킹해야 할 때 WPF는 과도합니다.
Kyralessa

WPF 사이에 WinRT에 유리하게 사용되지 않는 것 같습니다. 그러나 Winforms는 비즈니스 개발에서 WPF보다 더 살아 있습니다. 또한 참조 stackoverflow.com/questions/913417/...
닥 갈색
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.