在我从这个问题中了解到以下内容后,我想到了这一点:

where T : struct

我们,C#开发人员,都知道C#的基础知识。我指的是声明、条件、循环、运算符等。

我们中的一些人甚至掌握了Generics、匿名类型、lambdas、LINQ等等。。。

但是,即使是C#的粉丝、瘾君子和专家也几乎不知道C#最隐藏的功能或技巧是什么?

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

关键词

迈克尔·斯图姆的产量Michael Stum的varkokos的using()语句kokos只读由Mike Stone作者:Ed Swangren由Rocketpants改进因死亡而违约全球::由pzycomanAlexCuse的using()块Jakubšturc的挥发性Jakubšturc的外部别名

属性

Michael Stum的DefaultValueAttributeDannySmurf的ObsoleteAttribute调试器DisplayAttribute(按Stu)bdukes提供的DebuggerBrowseble和DebuggerStepThroughmarxidad的ThreadStaticAttributeMartin Clarke的FlagsAttributeAndrewBurns的ConditionalAttribute

语法

?? kokos的(合并空值)运算符Nick Berardi的数字标记其中T:Lars Mæhlum的新Keith的隐式泛型Keith的单参数lambdas基思汽车财产Keith的命名空间别名Patrick的带@的逐字字符串文字按lfoost列出的枚举值@marxidad的variableamesmarxidad的事件运算符由Portman设置字符串括号格式xanadot的属性访问器可访问性修饰符JasonS的条件(三元)运算符(?:)Binoj Antony检查和未检查操作员Flory的隐式和显式运算符

语言功能

Brad Barker的可空类型Keith的匿名类型__由Judah Himango制作的makeref __reftype __refvaluelomaxx的对象初始化器达科他州David的字符串格式marxidad的扩展方法Jon Erickson的部分方法John Asbeck的预处理器指令Robert Durgin的DEBUG预处理器指令SefBkn导致操作员过载通过chakrit推断类型Rob Gough将布尔运算符提升到下一级通过Roman Boiko将值类型变量作为不带装箱的接口传递由Roman Boiko编程确定声明的变量类型Chris的静态构造器使用LINQ by roosteronacid更容易进行眼睛/精简ORM映射__Zac Bowling的arglist

Visual Studio功能

Himadri在编辑器中选择文本块DannySmurf的片段

框架

KiwiCastard的TransactionScopeKiwiAstard的从属事务IainMH的<T>可为空迪亚戈的Mutex按ageektrapped列出的System.IO.PathJuan Manuel的WeakReference

方法和财产

KiwiAstard的String.IsNullOrEmpty()方法KiwiCastard的List.ForEach()方法Will Dean的BeginInvoke()、EndInvoke(()方法Nullable<T>。HasValue和Nullable<T>。Rismo的Value财产John Sheehan的GetValueOrDefault方法

提示和技巧

Andreas H.R.Nilsson的事件处理程序的好方法John的大写比较访问匿名类型而不通过dp进行反射Will延迟实例化集合财产的快速方法chosteronacid提供的类似JavaScript的匿名内联函数

另外

kokos的netmodulesDuncan Smart的LINQBridgeJoel Coehorn的并行扩展


当前回答

不知道这本身是否是秘密,但我喜欢System.Linq中添加的Enumerable(添加到IEnumerable)类。

http://msdn.microsoft.com/en-us/library/system.linq.enumerable_members.aspx

而yield关键字已列出。迭代器块非常惊人。我用它们来构建列表,这些列表将被测试,以确定它们是否是联合素数。它基本上允许您遍历一个逐个返回值的函数,并随时停止。

哦,当你不能再优化它时,我几乎忘记了世界上最好的课程。后台工作人员!!!!

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

其他回答

外部别名关键字引用具有相同完全限定类型名称的两个版本的程序集。

我只是想复制没有注释的代码。因此,诀窍是只需按下Alt按钮,然后突出显示您喜欢的矩形。(例如下文)。

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        //if (e.CommandName == "sel")
        //{
        //    lblCat.Text = e.CommandArgument.ToString();
        //}
    }

在上面的代码中,如果我想选择:

e.CommandName == "sel"

lblCat.Text = e.Comman

然后,我按下ALt键并选择矩形,无需取消注释线条。

看看这个。

在lambda发挥作用之前,它是匿名委托。这可以用于与Ruby的blockgiven类似的总括代码。但我还没有测试lambda的工作原理,因为到目前为止我想坚持使用.NET2.0。

例如,当您希望确保记住关闭HTML标记时:

MyHtmlWriter writer=new MyHtmlWriter();
writer.writeTag("html", 
  delegate ()
  { 
    writer.writeTag("head", 
       delegate() 
       { 
           writer.writeTag("title"...);
       }
    )
  })

我确信,如果lambda是一个选项,那么会产生更干净的代码:)

@lainMH,

当从可为null的数据库中检索值以及将值放回数据库时,可为null布尔值非常有用。有时您想知道字段尚未设置。

我还不能发表评论,但请注意,默认情况下,VisualStudio2008会自动跳过财产,因此在这种情况下不再需要DebuggerStepThrough属性。此外,我还没有注意到有人展示如何声明无参数lambda(对于实现Action<>很有用)()=>DoSomething(x);

你还应该仔细阅读闭包——我不够聪明,无法正确解释它们。但基本上,这意味着编译器做了一些聪明的事情,这样即使在创建lambda之后“超出范围”,这行代码中的x仍然可以工作。

我最近还发现,可以假装忽略lambda参数:(e,_)=>DoSomething(e)

它并不是真的忽略它,只是_是一个有效的标识符。所以你不能像那样忽略这两个参数,但我认为这是一种很好的方式来表明我们不关心这个参数(通常是EventArgs,它是.Empty)。