[C#] C #의 숨겨진 기능? [닫은]

질문 에서 다음을 배운 후에 이것은 내 마음에 왔습니다 .

where T : struct

C # 개발자는 모두 C #의 기본 사항을 알고 있습니다. 선언, 조건부, 루프, 연산자 등을 의미합니다.

우리 중 일부는 Generics , anonymous types , lambdas , LINQ 등과 같은 것들을 마스터했습니다 .

그러나 C # 팬, 중독자, 전문가조차 거의 알지 못하는 C #의 가장 숨겨진 기능이나 요령은 무엇입니까?

지금까지 공개 된 기능은 다음과 같습니다.

키워드

속성

통사론

언어 특징

Visual Studio 기능

뼈대

방법 및 속성

팁 & 트릭

  • Andreas HR Nilsson의 이벤트 핸들러를위한 멋진 방법
  • John의 대문자 비교
  • dp에 의해 반영되지 않은 익명 유형에 액세스
  • Will에 의해 컬렉션 속성을 느리게 인스턴스화하는 빠른 방법
  • roosteronacid의 JavaScript와 같은 익명 인라인 함수

다른



답변

이것은 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의 관련 토론 과이 블로그 게시물 (및 가능한 단점) 도 참조하십시오 .