void GenericMethod<T>( T input ) { ... } //Infer type, so GenericMethod<int>(23); //You don't need the <>. GenericMethod(23); //Is enough.
2) 매개변수가 하나인 간단한 람다:
x => x.ToString() //simplify so many calls
3) 익명 유형 및 이니셜라이저:
//Duck-typed: works with any .Add method. var colours = new Dictionary<string, string> { { "red", "#ff0000" }, { "green", "#00ff00" }, { "blue", "#0000ff" } }; int[] arrayOfInt = { 1, 2, 3, 4, 5 };
다른 것:
4) 자동 속성은 다른 범위를 가질 수 있습니다.
public int MyId { get; private set; }
상기시켜주신 @pzycoman님 감사합니다.
5) 네임스페이스 별칭(이 특정 구분이 필요할 가능성이 없음):
using web = System.Web.UI.WebControls; using win = System.Windows.Forms; web::Control aWebControl = new web::Control(); win::Control aFormControl = new win::Control();
Community Wiki
나는 꽤 오랫동안 "as" 키워드를 몰랐다.
MyClass myObject = (MyClass) obj;
대
MyClass myObject = obj as MyClass;
두 번째는 obj가 MyClass가 아닌 경우 클래스 캐스트 예외를 throw하는 대신 null을 반환합니다.
Community Wiki
내가 좋아하는 두 가지는 자동 속성이므로 코드를 훨씬 더 축소할 수 있습니다.
private string _name; public string Name { get { return _name; } set { _name = value; } }
이것을 명확히 하고 싶었습니다... 이스케이프 문자를 무시하라고 지시하는 것이 아니라 실제로 컴파일러에게 문자열을 리터럴로 해석하도록 지시합니다.
당신이 가지고 있다면
string s = @"cat dog fish"
실제로 다음과 같이 인쇄됩니다(들여쓰기에 사용되는 공백도 포함됨).
cat dog fish
Community Wiki
저는 C#(.NET 3.5)에서 가장 잘 알려지지 않고 잘 알려지지 않은 기능 중 하나가 특히 Generics 및 Lambda와 결합된 경우 Expression Trees라고 생각합니다. 이것은 NInject 및 Moq와 같은 최신 라이브러리에서 사용하는 API 생성에 대한 접근 방식입니다.
예를 들어 API에 메서드를 등록하고 해당 API가 메서드 이름을 가져와야 한다고 가정해 보겠습니다.
이 클래스가 주어졌을 때:
public class MyClass { public void SomeMethod() { /* Do Something */ } }
이전에는 개발자가 문자열과 유형(또는 주로 문자열 기반)을 사용하여 이 작업을 수행하는 것을 보는 것이 매우 일반적이었습니다.
RegisterMethod(typeof(MyClass), "SomeMethod");
글쎄, 그것은 강한 타이핑이 없기 때문에 짜증난다. "SomeMethod"의 이름을 바꾸면 어떻게 됩니까? 그러나 이제 3.5에서는 강력한 형식으로 이 작업을 수행할 수 있습니다.
RegisterMethod<MyClass>(cl => cl.SomeMethod());
RegisterMethod 클래스에서 다음 Expression<Action<T>> 사용합니다.
void RegisterMethod<T>(Expression<Action<T>> action) where T : class { var expression = (action.Body as MethodCallExpression); if (expression != null) { // TODO: Register method Console.WriteLine(expression.Method.Name); } }
이것이 제가 지금 Lambda와 Expression Tree를 사랑하는 큰 이유 중 하나입니다.
이는 제네릭 이전에 보다 효율적인 boxing/unboxing을 위해 추가된 문서화되지 않은 C# 키워드(Visual Studio에서도 인식합니다!)입니다. System.TypedReference 구조체와 함께 작동합니다.
가변 길이 매개변수 목록에 사용되는 __arglist도 있습니다.
사람들이 잘 알지 못하는 한 가지는 System.WeakReference 입니다. 개체를 추적하지만 여전히 가비지 수집기가 개체를 수집할 수 있도록 하는 매우 유용한 클래스입니다.
가장 유용한 "숨겨진" 기능은 yield return 키워드입니다. 딱히 숨겨져 있지는 않지만 많은 사람들이 그것에 대해 모르고 있습니다. LINQ는 이 위에 구축되었습니다. 후드 아래에 상태 머신을 생성하여 지연 실행 쿼리를 허용합니다. Raymond Chen은 최근에 내부의 껄끄러운 세부 사항 에 대해 게시했습니다.
Community Wiki
순수하고 안전한 C#의 공용체(C++ 공유 메모리 종류)
안전하지 않은 모드와 포인터에 의존하지 않고 클래스 멤버가 클래스/구조체에서 메모리 공간을 공유하도록 할 수 있습니다. 다음 클래스가 주어졌을 때:
[StructLayout(LayoutKind.Explicit)] public class A { [FieldOffset(0)] public byte One; [FieldOffset(1)] public byte Two; [FieldOffset(2)] public byte Three; [FieldOffset(3)] public byte Four; [FieldOffset(0)] public int Int32; }
Int32 필드를 조작하여 바이트 필드의 값을 수정할 수 있으며 그 반대의 경우도 마찬가지입니다. 예를 들어 이 프로그램은 다음과 같습니다.
static void Main(string[] args) { A a = new A { Int32 = int.MaxValue }; Console.WriteLine(a.Int32); Console.WriteLine("{0:X} {1:X} {2:X} {3:X}", a.One, a.Two, a.Three, a.Four); a.Four = 0; a.Three = 0; Console.WriteLine(a.Int32); }
다음을 출력합니다.
2147483647 FF FF FF 7F 65535
System.Runtime.InteropServices를 사용하여 추가하기만 하면 됩니다.
Community Wiki
키워드인 변수 이름에 @를 사용합니다.
var @object = new object(); var @string = ""; var @if = IpsoFacto();
Community Wiki
finally 블록이나 종료자를 호출하지 않고 프로그램을 종료하려면 FailFast를 사용하십시오.
Environment.FailFast()
Community Wiki
메서드에서 익명 형식을 반환하고 리플렉션 없이 멤버에 액세스합니다.
// Useful? probably not. private void foo() { var user = AnonCast(GetUserTuple(), new { Name = default(string), Badges = default(int) }); Console.WriteLine("Name: {0} Badges: {1}", user.Name, user.Badges); } object GetUserTuple() { return new { Name = "dp", Badges = 5 }; } // Using the magic of Type Inference... static T AnonCast<T>(object obj, T t) { return (T) obj; }