当前位置: 首页 > news >正文

初探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在对匿名委托的处理上提供了更清楚的实施方式。例如我们可以写这样的代码:

ContractedBlock.gif ExpandedBlockStart.gif Code
public class Example
{
   
public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      Func
<stringstring> convert = delegate(string s)
         { 
return s.ToUpper(); };

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

在 C# 中将 Func<(Of <(T, TResult>)>) 委托与匿名方法一起使用。

在3.0中,我们可以使用Lambda来更清楚的进行参数的传递:

ContractedBlock.gif ExpandedBlockStart.gif Code
public class Example
{
   
public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      Func
<stringstring> 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对象:

ContractedBlock.gif ExpandedBlockStart.gif 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简单的数据查询例子:

ContractedBlock.gif ExpandedBlockStart.gif 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中,介绍了一种很快捷的扩展功能的方法。

ContractedBlock.gif ExpandedBlockStart.gif 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方法:

ContractedBlock.gif ExpandedBlockStart.gif Code
Student stu2 = new Student
            {
                StuName 
= "Brian",
                StuAge 
= "12",
                StuClass 
= "1班"
            };
            Console.WriteLine(stu2.GetPersonInformation());

 

小结:初学了下C#3.0,感觉带来了不少惊喜,其中有很多新的特性是以前所未知的。C#3.0的新特性应该还不止这些,还需继续学习研究。

 

相关文章:

  • (6)设计一个TimeMap
  • 20190218日记
  • Cisco路由器上配置DHCP全程详解
  • App的登录注册相关接口
  • LINQ : 在LINQ TO SQL中关闭ObjectTrackingEnabled提高性能
  • pat乙级 1031-1035
  • ISA的学习体会一:ISA设置的指导思想
  • luogu P4848 崂山白花蛇草水
  • idou老师教你学Istio 26:如何使用Grafana进行可视化监控
  • RHEL4- WEB服务(十一)apache服务器日志的压缩、回滚
  • 你的知识,价值几何?
  • os.path.dirname使用方法
  • NetBeans 时事通讯(刊号 # 66 - Jul 30, 2009)
  • Android Studio Fragment 无法获取 id的方法
  • 信息安全的理解和全局对策转
  • SegmentFault for Android 3.0 发布
  • C++类中的特殊成员函数
  • CODING 缺陷管理功能正式开始公测
  • ComponentOne 2017 V2版本正式发布
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • express + mock 让前后台并行开发
  • go append函数以及写入
  • MD5加密原理解析及OC版原理实现
  • October CMS - 快速入门 9 Images And Galleries
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Promise面试题,控制异步流程
  • Redis在Web项目中的应用与实践
  • webpack+react项目初体验——记录我的webpack环境配置
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 记一次删除Git记录中的大文件的过程
  • 解决iview多表头动态更改列元素发生的错误
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 关于Android全面屏虚拟导航栏的适配总结
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​力扣解法汇总946-验证栈序列
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (图)IntelliTrace Tools 跟踪云端程序
  • (转)Oracle存储过程编写经验和优化措施
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET Remoting学习笔记(三)信道
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .net解析传过来的xml_DOM4J解析XML文件
  • .Net中wcf服务生成及调用
  • .考试倒计时43天!来提分啦!
  • @RunWith注解作用
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • [ 云计算 | AWS ] 对比分析:Amazon SNS 与 SQS 消息服务的异同与选择