1


3

当我学习到下面这个句型的时候,想起来这个问题:

where T : struct

我们C#程序员都知道C#的基础知识,声明,条件语句,循环语句,操作符等。 某些人也掌握了更高级的一些,如泛型、匿名类型、lambda、linq等等。 是不是在C#里面还有些隐藏的功能或知识点或窍门,包括C#的一些老手也不知道的呢?

垃圾帖? 社区Wiki
添加评论
1


第一个想到的是"yield"。有些属性比如 [DefaultValue()]我也比较喜欢使用。

var“ 关键字很多人知道在.net3.5可以和linq一起使用,可能很多人不知道如果用3.5的编译器编译后部署到2.0的框架中也是可以运行的。

??”也是一个不常用的C#操作符,这个符号Google搜索有困难(被过滤省略了),这里是MSDN的文档介绍:http://msdn.microsoft.com/en-us/library/ms173224.aspx

添加评论
1


摘自CLR via C#:

当比较字符串时候,推荐使用ToUpperInvariant 转换成大写而不是ToLowerInvariant 成小写。因为微软在比较大写字符串的时候对代码做了优化。

我记得有次发现我的同事在比较字符串时候通常先转换成大写字母,然后比较。我总是奇怪他为什么这么做因为我觉得转换成小写比较自然,当我读到书上这段的时候,我知道为什么了。

添加评论
0


这个不是C#特有的。见过很多代码在拼接一个本地路径的时候,用下面方法:

string path = dir + "\\" + fileName;

System.IO.Path.Combine() 这个方法才是推荐去使用的,它同时能够针对当前不同系统使用不同路径分隔符。Path类还有一些有用的方法值得去学习。

添加评论
0


yield

通常用于迭代器中,向IEnumerable对象提供值或者结束迭代。

如:

yield return expression;
yield break;
添加评论
0


var

用于定义隐式类型的变量。

var i = 5; 
var s = "Hello";

注意隐式类型(Implicitly typed)并不是“动态类型“,由编译器在编译时候决定具体类型。

添加评论
0


default

default除了在switch语句中提供默认的条件之外,还作为关键字用于泛型中。比如:

T temp = default(T);

由于事先不知道T类型是引用还是值类型,无法用于和null(只有引用类型可以)或者数字(值类型才能和其比较)进行比较。用default关键字,会确保如果是引用类型则返回null,如果是值类型则返回0。

添加评论
0


global::

关键字global::用于引用全局命名空间。

class TestClass : global::TestApp { }
添加评论
0


volatile

用于多线程中表示这个字段可以由多个同时执行的线程修改。更多有关如何使用volatile多线程的例子,可以参考如何:创建和终止线程

public volatile int i;
添加评论
0


extern修饰符extern别名关键字

C#中可以用extern修饰符声明外部实现的方法。常用于Interop服务使用非托管代码与DllImport属性一起使用(同时要声明static),如:

[DllImport("avifil32.dll")]
private static extern void AVIFileInit();

C#中可以同时引用两个类型名完全相同的程序集(常见同一控件的多个版本),这时候使用外部命令行指定别名引用,比如:

/r:GridV1=grid.dll 
/r:GridV2=grid20.dll

在程序中使用它们的时候,需要用关键extern来引用它们:

extern alias GridV1; 
extern alias GridV2;

GridV1和GridV2会被引用进和全局命名空间同级别的额外空间,使用GridV1::Grid或者GridV2::Grid可以得到不同版本的Grid类型。

添加评论
0


??操作符

null合并运算符,用于定义可以为null值的引用类型的默认值。如果左操作数不为null,则返回左操作数,反之返回右操作数。

 int y = x ?? -1;

同时这里也是null运算符:

static int? GetNullableInt()
{
    return null;
}
//... or
int? x = null;
添加评论




Made with Django.

当前版本: R-0127-20090523

cc-wiki