如何优雅地写代码——C#篇(2)

本篇文章包含的内容有
  1. 快速从用户输入中获取枚举值
  2. 利用using定义长命名空间的别名
  3. 使用Dictionary解析命令行参数
  4. LINQ 和 LINQ for XML
  5. 使用ConditionalAttribute()
  6. 优雅地处理可空类型
1.快速从用户输入中获取枚举值 经常要用到枚举,并且常常要从用户输入的字符串中获取 = = 2B的写法是这样的 var userInput = "Monday"; var dayEnum = new DayEnum(); switch (userInput) { case "Monday": dayEnum = DayEnum.Monday; break; //... //etc. } 文艺的写法是这样的 var userInput = "monday"; var dayEnum = (DayEnum)Enum.Parse(typeof(DayEnum), userInput, true); 2.利用using定义长命名空间的别名 不解释了 using my = System.IO; 3.使用Dictionary解析命令行参数 用到了反射 看看栗子你就懂了 class Program { static void Main(string[] args) { var userInput = "a"; var argdict = new Dictionary { { "a", "Method1" }, { "b", "Method2" }, { "c", "Method3" } }; typeof(Program).InvokeMember(argdict[userInput], BindingFlags.Static | BindingFlags.InvokeMethod | BindingFlags.Public, null, null, null); } public static void Method1() { Console.WriteLine("m1"); } public static void Method2() { Console.WriteLine("m2"); } public static void Method3() { Console.WriteLine("m3"); } } 4.LINQ 和 LINQ for XML 这只是一个简单的LINQ实例 具体请百度 var list = new int[] { 5, 1, 2, 3, 5, 498, 87 }; var query = from x in list where x > 2 //条件 orderby x //从小到大排序 从大到小为 orderby x descending select x; //结果返回x foreach (var i in query) { Console.WriteLine(i); } Console.ReadKey(); var xdoc = XDocument.Parse( "" + "George" + "John" + "Reminder" + "Don't forget the meeting!" + ""); var query = xdoc.Descendants().Select(x => { var xTo = x.Element("to"); var xFrom = x.Element("from"); if (xTo != null && xFrom != null) return new { _to = xTo.Value, _from = xFrom.Value }; return null; }); foreach (var i in query) if (i != null) Console.WriteLine(i); Console.ReadKey(); 5.使用ConditionalAttribute创建代码 先说明这个ConditionalAttribute是做什么用的 ConditionalAttribute位于System.Diagnostics中 当有预定义常量时就编译这个Attribute附着的东西 例子 static void Main() { Method1(); Method2(); Console.ReadKey(); } [Conditional("DEBUG")] static void Method1() { Console.WriteLine("m1"); } [Conditional("ELSE")] static void Method2() { Console.WriteLine("m2"); } 当用debug编译配置编译时 输出为 m1 当用release编译配置编译时 没有输出 6.优雅地处理可空类型 可用类型是指除了值类型外 还可以有null值 比如 int? i = null; //i = null i = 123; //现在i = 123 那么应该怎样处理可空类型呢? 法一 强制转换 (不推荐) int? i = null; var a = (int)i;//WRONG!! 值类型不能为null 法二 判断 (太长了 不够优雅 不推荐) 请原谅我复制了MSDN的实例 int? x = 10; if (x.HasValue) { System.Console.WriteLine(x.Value); } else { System.Console.WriteLine("Undefined"); } //或者 int? x = 10; if (x != null) { System.Console.WriteLine(x.Value); } else { System.Console.WriteLine("Undefined"); } 法三 使用??运算符 int? i = null; var a = i ?? 0;//明显比前面的帅多了 等价于 法二中的第二种 先这样吧
posted @ 2014-06-06 17:52  fuis  阅读(285)  评论(0)    收藏  举报