夜鹰教程网-程序员的加油站
 当前位置:文章中心 >> vs2022_vs2019_vs2017_vs2014_vs2012
浅析C#3.0 新特性
夜鹰教程网 来源:www.yyjcw.com 日期:2016-11-14 22:52:57
C#3.0已经推出好一段时间了,由于种种原因,一直没有去学习,这两天在园子中看到老赵的拯救C# 2.0,但是我们真做的到吗?。里面提到了些C#3.0的新特性和优势。勾起了我对3.0的兴趣,初探学习一下,分享给新手。

初探C#3.0 ,C#3.0新特性

C#3.0已经推出好一段时间了,由于种种原因,一直没有去学习,这两天在园子中看到老赵的拯救C# 2.0,但是我们真做的到吗?。里面提到了些C#3.0的新特性和优势。勾起了我对3.0的兴趣,初探学习一下,分享给新手。
在C#2.0中,微软给我们带来了一些新的特性,例如泛型,匿名委托等。然而,这些新的特性多多少少会给人一种从别的语言中“抄”来的感觉(例如泛型类似C++的模板,一些特性类似Java中的一些东西)。但是在C#3.0中,微软给我带来的一些新特性可能是以前所有开发语言都没有的特性。这无疑大大的体现了C#3.0在开发语言中强大的优势。
Lambda表达式
Lambda 表达式是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型。所有 Lambda 表达式都使用 Lambda 运算符 =>。关于Lambda更详细的讲解大家可以参看 MSDN。里面说的很清楚。
这里简单举个例子来说明Lambda的好处。Lambda在对匿名委托的处理上提供了更清楚的实施方式。例如在2.0中。我们可以写这样的代码:
Code
public
class Example
{
 
public
static
void Demo(System.Windows.Controls.TextBlock outputBlock)
  {
      Func
<string, string> convert =
delegate(string s)
        {
return s.ToUpper(); };

     
string name =
"Dakota";
      outputBlock.Text
+= convert(name) +
"\n";
  }
}

在 C# 中将 Func<(Of <(T, TResult>)>) 委托与匿名方法一起使用。
在3.0中,我们可以使用Lambda来更清楚的进行参数的传递:
Code
public
class Example
{
 
public
static
void Demo(System.Windows.Controls.TextBlock outputBlock)
  {
      Func
<string, string> convert = s => s.ToUpper();

     
string name =
"Dakota";
      outputBlock.Text
+= convert(name) +
"\n";
  }
}


Lambda 表达式的基础类型是泛型 Func 委托之一。这样能以参数形式传递 lambda 表达式,而不用显式将其分配给委托。尤其是,因为 System.Linq 命名空间中许多类型方法具有 Func<(Of <(T, TResult>)>) 参数,因此可以给这些方法传递 lambda 表达式,而不用显式实例化 Func<(Of <(T, TResult>)>) 委托。这样可以使我们的代码更加简洁,逻辑上更易于理解。
对象的初始化
在C#中,对象的初始化也做了一些改进。一个新的功能就是提供了更方便的语法规则来声明变量的值。
假如我们声明一个Student对象:
Code
public
class Student
{
   
private
string _stuName;
   
private
string _stuAge;
   
private
int _stuClass;

   
public Student() { }

   
public
string StuName
    {
       
get { return _stuName; }
       
set { _stuName = value; }
    }

   
public
string StuAge
    {
       
get { return _stuAge; }
       
set { _stuAge = value; }
    }

   
public
int StuClass
    {
       
get { return _stuClass; }
       
set { _stuClass = value; }
    }

}

在C#2.0中,我们是这样声明变量并赋值的:
Student stu =
new Student();
        stu.StuName
=
"Brian";
        stu.StuAge
=
"21";
        stu.StuClass
=
"1班";
而在C#3.0中,我们可以这样初始化对象:
Student stu2 =
new Student
        {
            StuName
=
"Brian",
            StuAge
=
"21",
            StuClass
=
"1班"
        };

从代码中不难看出,C#3.0给我们提供了很方便得方式来进行对象的初始化工作。
查询
这个想必大家都应该有所耳闻,那就是鼎鼎大名的Linq。这是C#3.0中最独特好用的新特性之一。Linq改变了我们写数据应用程序的方式,先前,开发人员需要考虑并编写不用的代码来处理不同数据源中的数据(SQL Server ,XML ,Memory....)。LINQ很好的帮我们解决了这个烦人的问题。同时借助Lambda,我们可以更方便准确的查询我们想要的数据。
使用Linq简单的数据查询例子:
Code
private
void BindGridView(string criteria)
    {
       
string strConn = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString;
        NorthwindDb db
=
new NorthwindDb(strConn);

        IEnumerable
<Employee> results;

       
if (criteria ==
string.Empty)
        {
            results
=db.Employee.ToArray();
        }
       
else
        {
            results
= (from c in db.Employee
                         
where c.FirstName.Contains(criteria)
                          select c).ToArray();
           
        }
        GridView1.DataSource
= results;
        GridView1.DataBind();
    }


变量声明
这里要说的是var。var是C#3.0中提供的用于声明变量的关键字,开发人员可以不考虑变量的类型就可以对变量进行声明(这一点用法非常类似Javascript)。但是两者还是有些差异。
相同点:用var来声明任何类型的局部变量。
不同点:它仅仅负责告诉编译器,该变量需要根据初始化表达式来推断变量的类型,而且只能是局部变量。
我们可以这样声明变量:
var i=
10;
var name
=
"edisundong";
var numbers
=
new
int[] { 1, 2, 3 };

var仅仅是个关键字,它并不是C#3.0中的一种新的类型,而是负责告诉编译器,该变量需要根据初始化表达式来推断变量的类型,上面的语句相当于
int i=
10;
string name =
" edisundong ";
int[] numbers =
new
int[] { 1, 2, 3 };
这里还需要注意几点:
1.在声明时必须同时赋值。
2.在使用var声明一个局部变量后,他仍然具备强类型。
var integer = 10;
integer = " edisundong ";
编译时会报Cannot implicitly convert type string to int错误。
3. 初始化器表达式的编译期类型不能够是空(null)类型。
4. var的声明仅限于局部变量
扩展方法
以前如果我们想扩展一个类的功能必须直接源自于它并且从学其中的方法,在C#3.0中,介绍了一种很快捷的扩展功能的方法。
Code
public
static
class StudentExtensionMethods
    {
       
public StudentExtensionMethods()
        {
           
//
           
//TODO: 在此处添加构造函数逻辑
           
//
        }
       
public
static
string GetStudentInformation(this Student stu)
        {
           
return
string.Format("Name: {0} {1} Age: {2}", stu.StuName,
            stu.StuAge, stu.StuClass);
        }
    }

定义一个类,其中定义一个方法,注意:这个类和方法都是static的,并且方法的参数是类Student。这样,Student类就可以扩展GetStudentInformation方法:
Code
Student stu2 =
new Student
            {
                StuName
=
"Brian",
                StuAge
=
"12",
                StuClass
=
"1班"
            };
            Console.WriteLine(stu2.GetPersonInformation());


小结:初学了下C#3.0,感觉带来了不少惊喜,其中有很多新的特性是以前所未知的。C#3.0的新特性应该还不止这些,还需继续学习研究。
复制链接 网友评论 收藏本文 关闭此页
上一条: 据说这套.net面试题很多网络公司都…  下一条: .net开发技巧篇三
夜鹰教程网成立于2008年,目前已经运营了将近 13 年,发布了大量关于 html5/css3/C#/asp.net/java/python/nodejs/mongodb/sql server/android/javascript/mysql/mvc/easyui/vue/echarts原创教程。 我们一直都在坚持的是:认证负责、一丝不苟、以工匠的精神来打磨每一套教程,让读者感受到作者的用心。我们默默投入的时间,确保每一套教程都是一件作品,而不是呆板的文字和视频! 目前我们推出在线辅导班试运营,模式为一对一辅导,教学工具为QQ。我们的辅导学科包括 java 、android原生开发、webapp开发、商城开发、C#和asp.net开发,winform和物联网开发、web前端开发,但不仅限于此。 普通班针对的是国内学员,例如想打好基础的大学生、想转行的有志青年、想深入学习的程序员、想开发软件的初学者或者业余爱好者等。 就业办针对即将毕业上岗的大四学生,或者打算转行的初级开发工程师。 留学生班针对的是在欧美、加拿大、澳洲、日本、韩国、新加坡等地留学的中国学子,目的是让大家熟练地掌握编程技能,按时完成老师布置的作业,并能顺利地通过考试。 详细咨询QQ:1416759661   夜鹰教程网  基于角色的权限管理系统(c-s/b-s)。
  夜鹰教程网  基于nodejs的聊天室开发视频教程
  夜鹰教程网  Git分布式版本管理视频教程
  夜鹰教程网  MVC+EasyUI视频教程
  夜鹰教程网  在线考试系统视频教程
  夜鹰教程网  MongoDB视频教程。
  夜鹰教程网 Canvas视频教程
  夜鹰教程网 报表开发视频教程
  热点推荐
一个关于天气预报的WebService【C…
VS2010最大的新特点是并行编程的进…
TextBox控件:asp.net中如何为密码…
Web服务调用实例:实现天气预报的…
ASP.NET程序员面试试题(130道题)
ASP.NET教程:调用WebService的源码…
网站开发全程设计
据说这套.net面试题很多网络公司都…
考考你:C#常见题型及部分答案
原创:.net读取数据库sql2000
伪静态URL重写配置
配置web.config代码asp.net3.5个性…
使用线程池提高性能 Socket网络编…
ASP.NET(C#)GridView表头的增加…
如何找到正确的学习方向【.NET版】…
  最近更新
C#修改注册表demo
一个获取内容中的图片地址的方法
ASP.NET 4.0尚未在 Web 服务器上注…
四大作用域:application,session…
ConfigurationManager不存在的解决…
vs2012_vs2013_vs2015没有Web Dep…
vs2015禁用解决方案中单击打开文件…
微软为Visual Studio 2015新增安卓…
C#如何实现搜索引擎网络爬虫程序
C#中正则表达式的用法
用C#抓取需要登录的页面数据
VS2015新功能
VS2015安装图解教程
vs2015新功能介绍
vs2015安装图解

关于我们 | 网站建设 | 技术辅导 | 常见问题 | 联系我们 | 友情链接

夜鹰教程网 版权所有 www.yyjcw.com All rights reserved 备案号:蜀ICP备08011740号3