C#的隐藏特性?

在我从这个问题中得知以下内容后,我想起了这件事:

where T : struct

我们,C#开发人员,都知道C#的基础知识。 我的意思是声明,条件,循环,操作符等。

我们中的一些人甚至掌握了泛型,匿名类型,lambda,LINQ等...

但是C#中最隐藏的特性或技巧是什么?甚至连C#粉丝,瘾君子,专家都不知道?

以下是迄今为止显示的功能:


关键词

  • Michael Stum的yield
  • var by Michael Stum
  • using() kokos的using()语句
  • readonly由kokos
  • as迈克斯通
  • as / is由Ed Swangren
  • as / is (改善)由Rocketpants
  • 由deathofrats default
  • global::由pzycoman
  • using()由AlexCuse块
  • 由JakubŠturc volatile
  • extern alias由JakubŠturc
  • 属性

  • 由Michael Stum创建的DefaultValueAttribute
  • 由DannySmurf ObsoleteAttribute的属性
  • Stu的DebuggerDisplayAttribute
  • DebuggerBrowsableDebuggerStepThrough by bdukes
  • ThreadStaticAttribute由marxidad提供
  • FlagsAttribute由Martin Clarke完成
  • 由AndrewBurns提供的ConditionalAttribute属性
  • 句法

  • ?? (coalesce nulls)运营商kokos
  • 尼克贝拉尔迪号码旗帜
  • where T:new的LarsMæhlum
  • Keith的隐式泛型
  • Keith的单参数lambdas
  • Keith的汽车性能
  • Keith的命名空间别名
  • 逐字字符串由@ Patrick提供
  • enum值由lfoust
  • 由marxidad提供的@variablenames
  • marxidad的event操作员
  • 由Portman格式化字符串括号
  • xanadont提供的属性访问器可访问性修饰符
  • 由JasonS提供的条件(三元)运算符( ?: :)
  • 经Binoj Antony checkedunchecked操作员
  • Flory的implicit and explicit操作符
  • 语言功能

  • Brad Barker的可空类型
  • Keith的匿名类型
  • Judah Himango的__makeref __reftype __refvalue __refvalue
  • 由lomaxx提供的对象初始值设定项
  • 由David在达科他州格式化字符串
  • 通过marxidad扩展方法
  • Jon Erickson的partial方法
  • John Asbeck的预处理指令
  • Robert Durgin的DEBUG预处理器指令
  • 运营商由SefBkn重载
  • 键入由chakrit推理
  • 布尔运算符由Rob Gough带到下一个层次
  • 通过价值类型的变量作为接口没有罗马Boiko拳击
  • 通过编程方式确定Roman Boiko声明的变量类型
  • Chris的静态构造函数
  • 使用LINQ by roosteronacid更容易在眼睛/浓缩ORM映射
  • __arglist by Zac Bowling
  • Visual Studio功能

  • Himadri编辑器中选择文本块
  • DannySmurf的片段
  • 骨架

  • KiwiBastard的TransactionScope
  • KiwiBastard的DependantTransaction交易
  • IainMH的Nullable<T>
  • Diago的Mutex
  • System.IO.Path通过ageektrapped
  • WeakReference by Juan Manuel
  • 方法和属性

  • 由KiwiBastard提供的String.IsNullOrEmpty()方法
  • List.ForEach()方法
  • Will Dean的BeginInvoke()EndInvoke()方法
  • Nullable<T>.HasValueNullable<T>.Value属性由Rismo
  • John Sheehan的GetValueOrDefault方法
  • 提示与技巧

  • 事件处理程序的好方法由Andreas HR Nilsson提供
  • 约翰的大写比较
  • 通过dp访问匿名类型而不反射
  • 一种快速的方式来延迟Will实例化集合属性
  • roosteronacid提供的类似JavaScript的匿名内联函数
  • 其他

  • kokos的netmodules
  • Duncan Smart的LINQBridge
  • 并行扩展由Joel Coehoorn

  • 这不是C#本身,但我没有看到任何真正使用System.IO.Path.Combine()的人。 实际上,整个Path类非常有用,但没有人使用它!

    我敢打赌,每个生产应用程序都有以下代码,即使它不应该:

    string path = dir + "" + fileName;
    

    lambdas和类型推理被低估。 Lambdas可以有多个语句,并且它们自动加入兼容的委托对象 (只要确保签名匹配),如下所示:

    Console.CancelKeyPress +=
        (sender, e) => {
            Console.WriteLine("CTRL+C detected!n");
            e.Cancel = true;
        };
    

    请注意,我没有new CancellationEventHandler也不需要指定sendere类型,它们可以从事件中推导出来。 这就是为什么编写整个delegate (blah blah)不那么麻烦,这也需要您指定参数类型。

    Lambdas不需要返回任何东西 ,类型推断在这种情况下非常强大。

    顺便说一下,你总是可以返回使Lambdas处于函数式编程意义上的Lambdas 。 例如,下面是一个使lambda处理Button.Click事件的lambda:

    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中的指针,我认为这是你应该学习的另一个基本的东西:-)


    来自Rick Strahl:

    你可以链接? 运算符,以便您可以执行一堆空比较。

    string result = value1 ?? value2 ?? value3 ?? String.Empty;
    
    链接地址: http://www.djcxy.com/p/1519.html

    上一篇: Hidden Features of C#?

    下一篇: How to exit in Node.js