이 질문 에서 다음을 배운 후에 이것은 내 마음에 왔습니다 .
where T : struct
C # 개발자는 모두 C #의 기본 사항을 알고 있습니다. 선언, 조건부, 루프, 연산자 등을 의미합니다.
우리 중 일부는 Generics , anonymous types , lambdas , LINQ 등과 같은 것들을 마스터했습니다 .
그러나 C # 팬, 중독자, 전문가조차 거의 알지 못하는 C #의 가장 숨겨진 기능이나 요령은 무엇입니까?
지금까지 공개 된 기능은 다음과 같습니다.
키워드
yield작성자 : Michael Stumvar작성자 : Michael Stumusing()kokos의 진술readonly에 의해 kokosas에 의해 마이크 스톤as/is로 에드 SwangrenasRocketpants의 /is(개선)default에 의해 deathofratsglobal::에 의해 pzycomanusing()AlexCuse의 블록volatile에 의해 야쿱 Šturcextern alias에 의해 야쿱 Šturc
속성
DefaultValueAttribute작성자 : Michael StumObsoleteAttribute에 의해 DannySmurfDebuggerDisplayAttribute에 의해 스투DebuggerBrowsable그리고 bdukes에DebuggerStepThrough의해ThreadStaticAttribute에 의해 marxidadFlagsAttribute에 의해 마틴 클라크ConditionalAttribute에 의해 AndrewBurns
통사론
??kokos의 (coalesce nulls) 연산자- Nick Berardi의 숫자 신고
 where T:new에 의해 라스 Mæhlum- Keith의 암시 적 제네릭
 - Keith의 1 파라미터 람다
 - Keith의 자동 속성
 - Keith의 네임 스페이스 별명
 - @로 패트릭 문자열 리터럴
 enumlfoust에 의한 값- marxidad의 @variablenames
 eventmarxidad의 운영자- Portman의 형식 문자열 대괄호
 - xanadont의 속성 접근 자 접근성 수정 자
 - JasonS의 조건부 (삼항) 연산자 ( 
?:) checked과unchecked에 의해 운영 Binoj 안토니implicit and explicitFlory의 운영자
언어 특징
- Brad Barker의 Nullable 유형
 - Keith의 익명 유형
 __makeref __reftype __refvalue에 의해 유다 희망 고- lomaxx의 객체 이니셜 라이저
 - Dakota에서 David의 문자열 형식화
 - marxidad의 확장 방법
 partialJon Erickson의 방법- John Asbeck의 전 처리기 지시문
 DEBUGRobert Durgin의 전 처리기 지시문- SefBkn에 의한 연산자 과부하
 - chakrit의 유형 유추
 - Rob Gough 가 다음 단계 로 가져 오는 부울 연산자
 - Roman Boiko의 boxing없이 value-type 변수를 인터페이스로 전달
 - Roman Boiko가 선언 한 변수 유형을 프로그래밍 방식으로 결정
 - Chris의 정적 생성자
 - roosteronacid에 의해 LINQ를 사용하여 눈에 쉽게 / 압축 ORM 매핑
 __arglist에 의해 자크 볼링
Visual Studio 기능
- Himadri의 에디터에서 텍스트 블록 선택
 - DannySmurf의 스 니펫
 
뼈대
TransactionScope에 의해 KiwiBastardDependantTransaction에 의해 KiwiBastardNullable<T>작성자 : IainMHMutex에 의해 DiagoSystem.IO.Path에 의해 ageektrappedWeakReference에 의해 후안 마누엘
방법 및 속성
String.IsNullOrEmpty()KiwiBastard의 방법List.ForEach()KiwiBastard의 방법BeginInvoke(),EndInvoke()에 의한 방법 윌 딘Nullable<T>.HasValue과Nullable<T>.Value에 의해 등록 RismoGetValueOrDefaultJohn Sheehan의 방법
팁 & 트릭
- Andreas HR Nilsson의 이벤트 핸들러를위한 멋진 방법
 - John의 대문자 비교
 - dp에 의해 반영되지 않은 익명 유형에 액세스
 - Will에 의해 컬렉션 속성을 느리게 인스턴스화하는 빠른 방법
 - roosteronacid의 JavaScript와 같은 익명 인라인 함수
 
다른
- kokos의 netmodules
 - LINQBridge 에 의해 던컨 스마트
 - 병렬 확장 에 의해 조엘 Coehoorn
 
답변
이것은 C # 자체는 아니지만 실제로 System.IO.Path.Combine()사용해야하는 사람을 보지 못했습니다 . 실제로 전체 Path 클래스는 실제로 유용하지만 아무도 사용하지 않습니다!
모든 프로덕션 앱에는 다음과 같은 코드가 있어야한다고 생각합니다.
string path = dir + "\\" + fileName;
답변
람다 및 형식 유추 가 과소 평가되었습니다. Lambdas는 여러 명령문을 가질 수 있으며 다음 과 같이 호환 가능한 대리자 객체로 자동으로 두 배가 됩니다 (서명이 일치하는지 확인).
Console.CancelKeyPress +=
    (sender, e) => {
        Console.WriteLine("CTRL+C detected!\n");
        e.Cancel = true;
    };
참고 나는이 없다고 new CancellationEventHandler도 내가의 유형을 지정해야 할 sender그리고 e그들이 이벤트에서 추론 가능한 것. 이것이 전체를 작성하는 데 덜 성가신 이유 delegate (blah blah)이며 매개 변수 유형을 지정해야합니다.
람다는 아무것도 반환 할 필요가 없으며 형식 유추는 이와 같은 맥락에서 매우 강력합니다.
그리고 BTW, 함수 프로그래밍에서 Lambdas를 만드는 Lambdas 를 항상 반환 할 수 있습니다 . 예를 들어, 다음은 Button.Click 이벤트를 처리하는 람다를 만드는 람다입니다.
Func<int, int, EventHandler> makeHandler =
    (dx, dy) => (sender, e) => {
        var btn = (Button) sender;
        btn.Top += dy;
        btn.Left += dx;
    };
btnUp.Click += makeHandler(0, -1);
btnDown.Click += makeHandler(0, 1);
btnLeft.Click += makeHandler(-1, 0);
btnRight.Click += makeHandler(1, 0);
연결에 유의하십시오. (dx, dy) => (sender, e) =>
이제 함수형 프로그래밍 클래스를 가져 가서 기쁘다. 🙂
C의 포인터 이외에, 당신이 배워야 할 다른 근본적인 것이라고 생각합니다 🙂
답변
에서 릭 Strahl :
당신은 체인 수 있습니다 ?? 연산자를 사용하여 많은 null 비교를 수행 할 수 있습니다.
string result = value1 ?? value2 ?? value3 ?? String.Empty;
답변
별명 제네릭 :
using ASimpleName = Dictionary<string, Dictionary<string, List<string>>>;
ASimpleName대신 을 사용할 수 있습니다 Dictionary<string, Dictionary<string, List<string>>>.
많은 장소에서 동일한 일반적인 크고 긴 복잡한 것을 사용할 때 사용하십시오.
답변
에서 C #을 통해 CLR :
문자열을 정규화 할 때는 Microsoft가 대문자 비교를 수행하기위한 코드를 최적화 했으므로 ToLowerInvariant 대신 ToUpperInvariant를 사용하는 것이 좋습니다 .
동료가 비교하기 전에 항상 문자열을 대문자로 변경 한 적이 있습니다. 나는 왜 그가 소문자로 변환하는 것이 더 “자연 스럽다”고 느끼기 때문에 왜 그렇게하는지 궁금했습니다. 지금 책을 읽은 후 왜 그런지 알고 있습니다.
답변
내가 가장 좋아하는 트릭은 null 병합 연산자 와 괄호를 사용하여 자동으로 컬렉션을 인스턴스화하는 것입니다.
private IList<Foo> _foo;
public IList<Foo> ListOfFoo
    { get { return _foo ?? (_foo = new List<Foo>()); } }
답변
null 이벤트 처리기를 확인하지 마십시오
선언시 이벤트에 빈 대리자를 추가하여 이벤트를 호출하기 전에 항상 null을 검사해야 할 필요성을 억제합니다. 예:
public delegate void MyClickHandler(object sender, string myValue);
public event MyClickHandler Click = delegate {}; // add empty delegate!
당신이 할 수 있습니다
public void DoSomething()
{
    Click(this, "foo");
}
이 대신
public void DoSomething()
{
    // Unnecessary!
    MyClickHandler click = Click;
    if (click != null) // Unnecessary! 
    {
        click(this, "foo");
    }
}
이 주제에 대한 Eric Lippert의 관련 토론 과이 블로그 게시물 (및 가능한 단점) 도 참조하십시오 .
