FrameWork各个版本常用特性整合
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FrameWork各个版本常用特性整合相关的知识,希望对你有一定的参考价值。
· 代码段。这个功能很早就知道了,Framework已经提供了很多代码段,我们也可以自定义代码段,不过之前一直没有用过,今天实践了一下,还是挺有意思的,这种代码自动生成的思想其实挺有用的。另外发现一点,Framework中提供的代码段中,关于C#和VB的数量明显不一样,不知道为啥C#要少呢?上网查了一下,说MSDN中提供了对C#代码段的扩展,可以下载下来试验一下。
· 重构。之前通过IDE进行重构时,一直是在Eclipse中用,感觉非常方便。现在VS2005也加上这个功能了,感受了一下,和Eclipse差不多,一个比较好的地方是通过VS2005进行重构时,可以对同一个解决方案中不同的项目保持同步,这一点非常有用。
· 调试。VS2005可以支持Debug时对代码进行修改,这个特性已经用得非常频繁了。
· 可空类型。对于布尔类型,可以给他指定ture或false。请看如下代码
public void test() { int? i = null; int? y = 4; int? x = i + y; Console.Write(x);//x为null }
· 空合并运算符。空合并运算符提供了一种快捷的表达方式,可以在处理可空类型和引用类型时表示null可能的值。
1). 如果第一个操作数不是null,那么整个表达式等于第一个操作数的值。
2).如果第一个操作数是null,那么整个表达式就等于第二个操作数的值。
int? a=null int b; b=a??10;//b=10; a=3; b=a??10//b=2;
如果第二个操作数不能隐含的转换为第一个操作数的类型,就会生成一个编译错误。
匿名类型
public object test() { return new { a="1",b="2"}; } dynamic dy = new ExpandoObject(); dy = test(); Response.Write(dy.b);
哈,dynamic类型2.0可没有。这里先借用着。
部分类(partial class)
这个没啥可说的,就是把一个类拆开为两个类而已,但是类名就得相同了。常见于.net的控件初始化都写到了部分类里边。
public partial class test { /// <summary> /// Head1 控件。 /// </summary> /// <remarks> /// 自动生成的字段。 /// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。 /// </remarks> protected global::System.Web.UI.htmlControls.HtmlHead Head1;//这行 }
将这行代码贴到.cs文件中,程序也将是一样运行。
FrameWork3.5特性
3.5的特性在日常工作中,有意/无意的也使用的比较多了。下面一一罗列
这是我在找版本特性时候找到的一个链接http://weblogs.asp.net/scottgu/archive/2007/11/19/visual-studio-2008-and-net-3-5-released.aspx。
里边介绍了3.5版本的新特性。
.LINQ
略,这个讨论的人太多了。到处都是
· Lambda
自C#3.0开始,就可以使用一种新语法把实现代码赋予委托:Lambda表达式。
只要有委托参数类型的地方,就可以使用Lambda表达式。
Lambda运算符"=>"的左边列出了需要的参数。Lambda运算符的右边定义了赋予Lambda变量的方法的实现代码.
public delegate string thisAction(string par); static void Main(string[] args) { thisAction lambda = a => {return a += "this is my test";}; //此处可以理解为使用了匿名函数? //一般而言,应该 为 thisAction lambda=functionName。 string aa = lambda("Hi, "); Console.Write(aa); }
下面这种:
public delegate string thisAction(string par); static void Main(string[] args) { // thisAction lambda = a => {return a += "this is my test";}; thisAction lambda=functionName; string aa = lambda("Hi, "); Console.Write(aa); } static string functionName(string par) { return par += "this is my test"; }
应该是这样吧,手敲的没有去测试呢。
只不过一个是把逻辑放到了Lambda中,一个用方法封装了下,然后直接将方法名赋给委托。哦,对了,哪个注释的地方,应该不是匿名函数了。只是lambda支持的一种写法而已。
所以从上面也可以看到很多人都采用第一种方法,把逻辑写到lambda中,而没有将该逻辑封装到一个方法中,然后调用方法名。 捋清思路就好看别人写的代码了。
(其实我一直理解是lambda是用在集合的地方。但是总是喜欢混淆。)
· Var 隐含类型变量
类型推断,编译器根据变量的初始值来“推断”变量的类型。
需要遵循的规则:
1)变量必须初始化。否则,编译器没有推断变量类型的依据。
2)初始化器不能为空。
3)初始化器必须房在表达式前。
4)不能把初始化器设置为一个对象,除非在初始化器中创建了一个新的对象。
· 自动属性,对象初始化器和集合初始值
以前:
private int property; public int Property { get { return property; } set { property= value; } }
现在可以简写了:
public int Property { get; set; } //(注:快速便捷方式 prop(propfull..)+Tab键+Tab键)
对象初始化:
UserInfo model = new UserInfo { id = Person.id, name =Person.name, age =Person.age };
(Person.Id是下面的匿名类型)
集合初始化:
List<UserInfo> list = new List<UserInfo> { new UserInfo{age=1,name="Name",id=1}, new UserInfo{age=2,name="Name",id=2}, };
· 扩展方法(Extension Method)
这个特性使用得好的话,能省很多代码。
定义:扩展方法,它允许改变一个类,但不需要该类的源代码。扩展方法是静态的,他是类的一部分,但实际上没有放在类的源代码中。(更多参考:http://www.cnblogs.com/ldp615/archive/2009/08/07/1541404.html )
Eg:
public static class Extention { public static MvcHtmlString WriteHtml(this HtmlHelper htmlHelpder, string html) { return new MvcHtmlString(html); } public static string toJsons(this object o) { javascriptSerializer serializer = new JavaScriptSerializer(); return serializer.Serialize(o); } }
调用:
var model = list[0]; string jsonStr = model.toJson(); //调用的扩展方法toJson()
结果:
{"id":1,"name":"Name","age":1}
注意:
1).如果扩展方法与该类型中定义的方法具有相同的签名,则扩展方法永远不会被调用。
2).扩展方法被在命名空间级别放入范围中。例如,如果您在同一个名为 Extensions 的命名空间中具有多个包含扩展方法的静态类,则这些扩展方法将全部由 using Extensions; 指令放入范围中。
总结:和普通的静态方法有何差别。在这个方法的第一个参数前面多了一个this关键字。扩展方法:
1).方法所在的类必须是静态的
2).方法也必须是静态的
3).方法的第一个参数必须是你要扩展的那个类型,比如你要给int扩展一个方法,那么第一个参数就必须是int。
4).在第一个参数前面还需要有一个this关键字。
匿名类型
Var关键字,用于表示隐式类型化的变量,var和new关键字一起使用时候,可以创建匿名类型。匿名类型只是一个继承自Object且没有名称的类。该类的定义从初始化中推断,类似于隐式类型化的变量。
Eg:
var Person = new { id = 1, name = "yourName", age = 22 }; UserInfo model = new UserInfo { id = Person.id, name =Person.name, age =Person.age };
(注意区分,匿名类型下与对象初始化赋值的区别)
· ASP.NET AJAX
略。
楼主吐槽下,8月份来的新公司,这公司项目也有价值吧,算是个电商企业(旅游块)的,可是项目里边全屏控件,超级无敌难维护,楼主几乎没用过控件写代码好反感啊,而且那个控件ajax 看不懂啊.. 编译项目各种报错.
FrameWork4.0特性
4.0伴随着mvc的火热,很多精品的内容,但是楼主没环境享受,扼腕叹息下。
推荐下参阅地址http://www.cnblogs.com/webabcd/archive/2010/06/29/1767212.html
上公司中楼主常用的特性列举下。
· 动态类型
创建自己的动态对象有两种方法:
1)从DynamicObject中派生。
2)使用ExpandoObject。使用DynamicObject需要做的工作比较多,因为必须重写几个方法,而ExpandoObject是一个可立即使用的密封类。
dynamic dyPerson = new ExpandoObject();//创建一个动态对象。
动态类型有两个限制。动态对象不支持扩展方法,匿名函数(lmabda表达式)也不能用做动态方法调用的参数
· 可选参数和命名参数
/* * 命名参数和可选参数 * 命名参数:调用方法时,可以不按位置传递参数,而是指定参数的命名来传值 * 可选参数:声明方法中的参数时,可以为其设置默认值,那么在调用该方法时,这种可选参数是可以忽略的 */
可以参考mvc3中,默认的路由中看到有使用。
eg:
public void FunctionNamedParam(int x, int y , int z=1)
在函数调用将是:
FunctionNamedParam(x:1, z:3, y:2); FunctionNamedParam(y:1, x:3);
ok,完结了。这些东西都是楼主边工作边学习边自己总结的,拿出来有些寒碜,不过毕竟是自己一点点积累的。当然有缺漏的,也恳请大家补充,相互交流。
以上是关于FrameWork各个版本常用特性整合的主要内容,如果未能解决你的问题,请参考以下文章
c# .net 3.5 4.0 4.5 5.0 6.0各个版本新特性战略规划总结转载
Microsoft.NET Framework 各个版本有啥区别
23.Flink-高级特性-新特性-Streaming Flie Sink介绍代码演示Flink-高级特性-新特性-FlinkSQL整合Hive添加依赖和jar包和配置
23.Flink-高级特性-新特性-Streaming Flie Sink介绍代码演示Flink-高级特性-新特性-FlinkSQL整合Hive添加依赖和jar包和配置
23.Flink-高级特性-新特性-Streaming Flie Sink介绍代码演示Flink-高级特性-新特性-FlinkSQL整合Hive添加依赖和jar包和配置