码迷,mamicode.com
首页 > 其他好文 > 详细

FrameWork各个版本常用特性整合

时间:2016-03-08 09:19:55      阅读:216      评论:0      收藏:0      [点我收藏+]

标签:

· 代码段。这个功能很早就知道了,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各个版本常用特性整合

标签:

原文地址:http://www.cnblogs.com/shouce/p/5252662.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!