• FrameWork各个版本常用特性整合


    FrameWork2.0特性

     

    · 代码段。这个功能很早就知道了,Framework已经提供了很多代码段,我们也可以自定义代码段,不过之前一直没有用过,今天实践了一下,还是挺有意思的,这种代码自动生成的思想其实挺有用的。另外发现一点,Framework中提供的代码段中,关于C#和VB的数量明显不一样,不知道为啥C#要少呢?上网查了一下,说MSDN中提供了对C#代码段的扩展,可以下载下来试验一下。

    · 重构。之前通过IDE进行重构时,一直是在Eclipse中用,感觉非常方便。现在VS2005也加上这个功能了,感受了一下,和Eclipse差不多,一个比较好的地方是通过VS2005进行重构时,可以对同一个解决方案中不同的项目保持同步,这一点非常有用。

    · 调试。VS2005可以支持Debug时对代码进行修改,这个特性已经用得非常频繁了。

    · 可空类型对于布尔类型,可以给他指定turefalse。请看如下代码

    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关键字,用于表示隐式类型化的变量,varnew关键字一起使用时候,可以创建匿名类型。匿名类型只是一个继承自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,完结了。这些东西都是楼主边工作边学习边自己总结的,拿出来有些寒碜,不过毕竟是自己一点点积累的。当然有缺漏的,也恳请大家补充,相互交流。

     

     

     

     

  • 相关阅读:
    OVS local network 连通性分析
    再部署一个 instance 和 Local Network
    ARM Linux系统调用的原理
    Linux内存管理中的slab分配器
    浅析基于ARM的Linux下的系统调用的实现
    分享一个查看十六进制的位的小程序
    mokoid 源代码下载
    shell中eval的使用问题
    批量去掉文件中的^M
    基于TINY4412的Andorid开发-------简单的LED灯控制
  • 原文地址:https://www.cnblogs.com/_popc/p/2823695.html
Copyright © 2020-2023  润新知