2009年2月6日

关键字

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

如:

yield return expression;
yield break;

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

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

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

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

T temp = default(T);

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

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

class TestClass : global::TestApp { }

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

public volatile int i;

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类型。

 

语法

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

 int y = x ?? -1;

同时这里也是null运算符:

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

我们知道可以用where关键字来对泛型定义进行约束,比如:

public class MyClass<T, U>
    where T : class
    where U : struct
{}

同时我们可以对泛型定义中包含构造函数的约束,new()约束告诉编译器提供的任何类型的参数都含有一个无参数的(默认)构造方法。

public class MyGenericClass<T> where T : IComparable, new()
{
    T item = new T();
}

语言特性

当我们要描述一个值类型可以不存在的的时候,使用nullable类型取代值类型。

使用?修饰符来声明一个nullable类型,比如:

int? a = 1;

C#通过Nullable类和Nullable结构体来支持nullable类型,Nullable结构体含有两个有用属性HasValueValue来判断和获取当前类型是否还有值。

这个名词对.NET的朋友可能有点生疏,wikipedia给的翻译是“柯里化”- 个人不太喜欢这个名字,英文是currying。curry化是函数式编程的一种实现技术。大致过程,就是把本来接受多个参数的函数,变成只有第一个参数的函数,然后返回新函数接受余下的参数。有点拗口,而且对函数式编程或curry化介绍的中文资料也相对较少,我读过一篇对函数式编程和curry化解释的比较清楚的文章还有这篇英文的博客,推荐大家看看。

所有能实现闭包的语言都可以实现curry化。在C#2.0中可以通过匿名委托来实现,在3.0中curry化相对简单一些:

static class Program
{
  static Func<TArg1, Func<TArg2, TResult>> Curry<TArg1, TArg2, TResult>(this Func<TArg1,
TArg2, TResult> f) { return a1 => a2 => f(a1, a2); } static void Main() { Func<int, int, int> add = (x, y) => x + y; var curriedAdd = add.Curry(); Console.WriteLine(curriedAdd(13)(29)); } }

最后,如果大家对用C#实现函数式编程有兴趣,可以在MSDN Code中找到更多的代码实现

匿名类型可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型。类型名称由编译器生成,并且不能在源代码级使用,类型也由编译器推断决定。常和LINQ查询表达式的select子句结合使用,初始化其他类型的属性组成的对象。

var productQuery = 
    from prod in products
    select new { prod.Color, prod.Price }; //创建由Color和Price属性组成的新对象
foreach (var v in productQuery) { Console.WriteLine("Color={0}, Price={1}", v.Color, v.Price); }
  • 扩展方法

    C#3.0中可以对CLR扩充类型,比如,你可能需要得到一句英文字符串中有多少个单词,以往可以写一个处理string的方法,现在你可以直接为string类型添加一个计算单词数量的方法:
namespace ExtensionMethods
{
    public static class MyExtensions
    {
        public static int WordCount(this String str)
        {
            return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length;
        }
    }   
}

 

通过this我们把这个WordCount方法扩充到了CLR内置类型,你可以直接像用普通方法一样使用它:

using ExtensionMethods;
//...

string s = "Hello Extension Methods";
int i = s.WordCount();

更多介绍可以参考MSDN或者ScottGu的博客。

 

方法和属性

Array或List有个很实用的ForEach方法,可以直接传入一个方法对集合中元素操作。如:

List<String> names = new List<String>();
names.Add("Bruce");
names.Add("Alfred");


names.ForEach(Print); 
names.ForEach(delegate(String name)
{
    Console.WriteLine(name);
});

private static void Print(string s)
{
    Console.WriteLine(s);
}
	

对于nullable类型的对象,除了Value和HasValue两个常用属性外,还可以使用GetValueOrDefault方法来获得当前值或者默认值:

float? mySingle = 12.34f;
float? yourSingle = -1.0f;

yourSingle = mySingle.GetValueOrDefault(-222.22f); // yourSingle=12.34

mySingle = null; 
yourSingle = mySingle.GetValueOrDefault(); // yourSingle=0

 

技巧

  • 使用大写字母比较字符串

摘自CLR via C#:

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

 

编注:

本文源自 CNProg 一则提问“你知道哪些C#的"隐藏"功能?”,从中挑选并分类了实用却被忽略的一些C#语言特性和技巧。

访问原文查看更多其他特性的介绍,内容持续增添中。

posted @ 2009-02-06 06:28 Chagel 阅读(4374) 评论(34) 推荐(0) 编辑

2009年2月1日

摘要: 最近在论坛闲逛,先后参与了两题算法趣味题目。 题目1是要求算一任意长度字符串中不同的字符以及它的个数。 题目2是把一段字符串用“右起竖排”的古文格式输出。 题目难度不大,都是针对字符串的操作,逻辑比较简单,灵活在对不同语言、语法的掌握程度。(原文分别在:1,2。) 看了大家用C++、C#、Java等语言的实现,总感觉牛刀杀鸡太麻烦,有兴趣的朋友可以自己写写看或者直接看原文的网友回复。我最近一段时间Python写的比较多,读到这些题目时候,就有一种跃跃欲试的冲动。因为我知道用Perl,Python,Ruby等动态语言来做这类题目,会是非常理想的。后来我做了这两道题目,结果也令人满意,代码之简洁保持在所有答案的前列。 阅读全文

posted @ 2009-02-01 07:01 Chagel 阅读(9255) 评论(23) 推荐(0) 编辑

2007年4月5日

摘要: 微软上个月收购了devBiz公司,TFS终于有了Web访问的应用程序-TeamPlain。而且好消息是该程序是完全免费提供给具有license的TFS客户。 阅读全文

posted @ 2007-04-05 20:59 Chagel 阅读(1309) 评论(2) 推荐(0) 编辑

2006年10月20日

摘要: String类的Format重载方法,用来格式化需要的字符串非常方便。常用的重载方法原型有:Format(String, Object)Format(String, Object, Object)Format(String, Object, Object, Object)Format(String, Object[])它们都调用了另外一个重载方法:Format(IFormatProvider, S... 阅读全文

posted @ 2006-10-20 01:10 Chagel 阅读(2823) 评论(10) 推荐(0) 编辑

2006年7月21日

摘要: Scott Mitchell关于ASP.NET 2.0三层架构的数据教程第22,23篇翻译已经完成,欢迎大家指正![翻译]Scott Mitchell 的ASP.NET 2.0数据教程之二十二:为删除数据添加客户端确认[翻译]Scott Mitchell 的ASP.NET 2.0数据教程之二十三:基于用户对修改数据进行限制 翻译目录 | 原文目录 阅读全文

posted @ 2006-07-21 23:37 Chagel 阅读(3799) 评论(3) 推荐(0) 编辑

2006年7月15日

摘要: Download source files (351Kb)In this article, we will discuss the internationalization of web application using ASP.NET 2.0 and SQL Server 2005. Through the given solution, we can achieve the scenario... 阅读全文

posted @ 2006-07-15 16:54 Chagel 阅读(2650) 评论(1) 推荐(0) 编辑

摘要: CLR提供了可以区分类型的Equality 和Identity能力。l Equality:如果两个对象是相同的类型,并且它们各自带有相同和等值的属性。(They are instances of the same type and if each of the fields in one object matches the values of the fields in the other ob... 阅读全文

posted @ 2006-07-15 16:44 Chagel 阅读(1189) 评论(1) 推荐(0) 编辑

摘要: 自从微软对IE6的ActiveX更新后,每次用IE打开带有ActiveX控件的页面时,必须要进行控件激活操作(点击相关控件),否则该控件将无法正常工作。如果在页面上使用ActiveX控件不多的话,每次多点一下也就算了,不过一旦要频繁操作或者控件很多,每次要做这个重复劳动时,客户肯定会疯掉了。MSDN提供了相应的解决办法,可以不需要手工激活,回到以前一样的操作。下面三种办法,关键是把传统页面和控件输... 阅读全文

posted @ 2006-07-15 16:37 Chagel 阅读(3197) 评论(4) 推荐(0) 编辑

2006年4月6日

摘要: 迁移其实以及完成一段时间了, 项目成功的关键在于从DSO到AMO的切换根基于业务逻辑,而非代码本身. 下面的图是前几天做项目回顾时候总结的, 只是涉及一些模块分层和访问接口. 图中显示了从旧框架到新框架的迁移, 我们提供了一个MSAS2005的访问层, 类似Facade模式, 里面包装了旧版本的业务逻辑, 而非一开始欲对DSO所有对象的Wrapper. 阅读全文

posted @ 2006-04-06 19:23 Chagel 阅读(379) 评论(0) 推荐(0) 编辑

2005年11月16日

摘要: 自从体会到DSO在SQL Server2005 中的险境以来,这一个多月的工作都围绕着它所进行着。不知道是不是因为国内做基于Analysis Services的产品较少的缘故,似乎对DSO之类的讨论非常少。但是对于我们Team现在,DSO十足是一个心病。大家都认识到微软的SQL Server 2005发布的重要性,如果我们的产品不能及早支持这个平台,很快将会在队伍中消亡。DSO之所以是个心病,是因... 阅读全文

posted @ 2005-11-16 20:37 Chagel 阅读(1429) 评论(8) 推荐(0) 编辑

本作品采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。

©2005-2009. Chen Gang
点击右上角即可分享
微信分享提示