이 질문 에서 다음을 배운 후에 이것은 내 마음에 왔습니다 .
where T : struct
C # 개발자는 모두 C #의 기본 사항을 알고 있습니다. 선언, 조건부, 루프, 연산자 등을 의미합니다.
우리 중 일부는 Generics , anonymous types , lambdas , LINQ 등과 같은 것들을 마스터했습니다 .
그러나 C # 팬, 중독자, 전문가조차 거의 알지 못하는 C #의 가장 숨겨진 기능이나 요령은 무엇입니까?
지금까지 공개 된 기능은 다음과 같습니다.
키워드
yield
작성자 : Michael Stumvar
작성자 : Michael Stumusing()
kokos의 진술readonly
에 의해 kokosas
에 의해 마이크 스톤as
/is
로 에드 Swangrenas
Rocketpants의 /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의 네임 스페이스 별명
- @로 패트릭 문자열 리터럴
enum
lfoust에 의한 값- marxidad의 @variablenames
event
marxidad의 운영자- Portman의 형식 문자열 대괄호
- xanadont의 속성 접근 자 접근성 수정 자
- JasonS의 조건부 (삼항) 연산자 (
?:
) checked
과unchecked
에 의해 운영 Binoj 안토니implicit and explicit
Flory의 운영자
언어 특징
- Brad Barker의 Nullable 유형
- Keith의 익명 유형
__makeref __reftype __refvalue
에 의해 유다 희망 고- lomaxx의 객체 이니셜 라이저
- Dakota에서 David의 문자열 형식화
- marxidad의 확장 방법
partial
Jon Erickson의 방법- John Asbeck의 전 처리기 지시문
DEBUG
Robert 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
에 의해 등록 RismoGetValueOrDefault
John 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의 관련 토론 과이 블로그 게시물 (및 가능한 단점) 도 참조하십시오 .
