C#语言发展历程(1-7)

一、类型发展

C#1中是没有泛型的 在C#2中在逐渐推出泛型。C#2还引入了可空类型。

示例:C#泛型(详解)-CSDN博客

1 C#3:引入了匿名类型、和隐式的局部变量(var)

匿名类型:我们主要是使用在LINQ查询语句。就算没有LINQ查询语句我们在一种类型只在一个方法中,我们创建数据类型供单一方法的使用,的这种方式也不可取。不过需要注意匿名类型的作用域只在声明的局部作用域中能使用。

示例:高级C#技术(二)-CSDN博客

2 C#7中可以采用Readonly Struct 自定义结构

举个例子:

public readonly struct Point
{public int X { get; }public int Y { get; }public Point(int x, int y){X = x;Y = y;}
}
Point p1 = new Point(2, 3);
Console.WriteLine($"p1: ({p1.X}, {p1.Y})");// 尝试修改结构的属性值,将会引发编译错误
// p1.X = 5;
// p1.Y = 10;Point p2 = new Point(5, 10);
Console.WriteLine($"p2: ({p2.X}, {p2.Y})");// 结构的属性值无法修改,因此下面的赋值操作是创建了一个新的Point实例
Point p3 = p2;
Console.WriteLine($"p3: ({p3.X}, {p3.Y})");

示例解释:
         上述代码中,我们创建了一个Point对象,打印了它的坐标,并尝试修改它的属性值。由于Point是不可变的结构,所以修改属性值的操作会导致编译错误。然后,我们创建了另一个Point对象p2,并将其赋值给p3。由于结构是不可变的,所以赋值操作实际上是创建了一个新的Point实例。 

 3 C#7中引入了元组:

        元组可以替代我们前面提到的匿名类型。其中不同的是元组可以用于方法的返回类型,和参数。建议放在内部的API中不对外暴露。因为元组只是对简单的值组合进行一个赋值。并没有对其封装。

举个例子:

你可以使用如下的语法来创建一个元组:

var myTuple = (value1, value2, value3);

你还可以给元组的成员命名,以增加代码的清晰度:

var myNamedTuple = (Name: "John", Age: 30, City: "New York");

也可创建匿名类型 任何类型都可以创建

怎么使用?

 var myTuple = (45, 88, 99);Console.WriteLine(myTuple.Item1);//代表第一个元素   结果 45

如果您给元组的成员命名了 那么就可以使用名称来输出

 var myNamedTuple = (Name: "John", Age: new { maximum = "100", minimum = "10" }, City: "New York");Console.WriteLine(myNamedTuple.Name);

当需要访问元组的成员时,你可以使用点符号或者解构语法来拆包:

var myNamedTuple = (Name: "John", Age: new { maximum = "100", minimum = "10" }, City: "New York");
Console.WriteLine(myNamedTuple.Name);
var (name, age, city) = myNamedTuple;
Console.WriteLine(name);
Console.WriteLine(age.maximum);  // 访问嵌套匿名类型的属性
Console.WriteLine(city);

下面是一个示例,展示了如何在方法的返回类型和参数中使用元组:

public static (int, string) GetPerson()
{int age = 25;string name = "John Doe";return (age, name);
}public static void PrintPerson((int, string) person)
{Console.WriteLine("Name: " + person.Item2);Console.WriteLine("Age: " + person.Item1);
}// 使用示例
var person = GetPerson();
PrintPerson(person);

C#8中引入了可空引用类型:C#8假设没有使用任何显示声明的返回值、参数、属性、全局或局部变量都是默认为为空类型的。

二、代码更简洁

1 C#1中,需要先写一个委托可以指向方法,然后再写一大段代码来创建委托。

举个例子:

class Myeven
{public delegate void MyAction(object sender, ElapsedEventArgs e);public event MyAction myeven;Timer Timer;public Myeven(){Timer ??= new Timer();Timer.Elapsed +=  new  ElapsedEventHandler(DLonti);}private void DLonti(object sender, ElapsedEventArgs e){}
}

2 C#2引入方法组转换和匿名方法后就可以采用以下形式,匿名方法没有参数列表则可以忽略

class Myeven
{public delegate void MyAction(object sender, ElapsedEventArgs e);public event MyAction myeven;Timer Timer;public Myeven(){Timer ??= new Timer();Timer.Elapsed += delegate (object L, ElapsedEventArgs elapsedEventArgs){//方法体};}
}

提示:在匿名方法当中您必须显示指定参数类型。 

3 C#3推出Lambda表达式几乎具备了匿名函数的所有优点而且它的语法更简洁

class Myeven
{public delegate void MyAction(object sender, ElapsedEventArgs e);public event MyAction myeven;Timer Timer;public Myeven(){Timer ??= new Timer();Timer.Elapsed += (obj, e) => { //隐式声明参数列表//方法体};//Timer.Elapsed += (object obj, ElapsedEventArgs e) => {//显示声明参数列表//    //方法体//};}
}

4 C#3引入了对象初始化和集合初始化。

示例:高级C#技术(一)-CSDN博客

5 C#3推出了自动属性

举个例子:

class Myeven
{//自动属性 C#3中引人的public int MyProperty { get; set; }private int myVar;//传统属性public int MyProperty2{get { return myVar; }set { myVar = value; }}}

6 C#6引入了表达式主体成员

在上面的示例中,我们可以将 MyProperty2 属性改写为使用表达式主体成员的形式,

如下所示:

public int MyProperty2
{get => myVar;set => myVar = value;
}

示例解释:

        我们使用 => 箭头运算符来定义属性的读取和写入逻辑。对于 get 访问器,我们直接返回 myVar 字段的值;对于 set 访问器,我们将属性的值赋给 myVar 字段。 

三、字符串处理

1 C#4引用了动态类型

示例:高级C#技术(二)-CSDN博客

2 C#5引入了调用方法信息特性

举个例子:

using System;
using System.Runtime.CompilerServices;public class Program
{public static void Main(string[] args){LogMessage("Hello, world!");}public static void LogMessage(string message,[CallerFilePath] string filePath = "",[CallerLineNumber] int lineNumber = 0,[CallerMemberName] string memberName = ""){Console.WriteLine($"Message: {message}");Console.WriteLine($"File Path: {filePath}");Console.WriteLine($"Line Number: {lineNumber}");Console.WriteLine($"Member Name: {memberName}");}
}

示例解释:

        在上面的示例中,我们定义了一个名为 LogMessage 的方法,并将其标记为使用了 "调用方信息特性"。在 LogMessage 方法的参数中,我们使用了 CallerFilePathCallerLineNumberCallerMemberName 属性。这些属性会自动获取调用方的文件路径、行号和成员名称。

Main 方法中调用 LogMessage 方法时,会将参数传递给 LogMessage。当执行到 LogMessage 方法时,你将看到输出的结果如下:

 输出结果:

3 C#6引入了nameof 运算符用于获取变量类型方法和成员的名字

举个例子:

class Myeven:INotifyPropertyChanged
{private int myVar;public int MyProperty{get { return myVar; }set { myVar = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(myVar))); }//nameof(myVar)替代原来的 "myVar"}public event PropertyChangedEventHandler PropertyChanged;
}

4 C#6引入了内插字符串字面量

举个例子:

class Myeven
{private int name;public int Name{get { return name; }set { name = value; }}public Myeven(){Console.WriteLine("姓名"+Name);Console.WriteLine($"姓名{Name}");}
}

 只是部分内容分享其实还有很多我没有提及到

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/310253.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP序列化总结3--反序列化的简单利用及案例分析

反序列化中生成对象里面的值,是由反序列化里面的值决定,与原类中预定义的值的值无关,穷反序列化的对象可以使用类中的变量和方法 案例分析 反序列化中的值可以覆盖原类中的值 我们创建一个对象,对象创建的时候触发了construct方…

中间人攻击是什么,会产生哪些危害,如何有效防止中间人攻击

简介 中间人攻击(Man-in-the-Middle Attack,简称MITM攻击)是一种网络攻击,其原理是攻击者通过各种技术手段将受攻击者控制的一台计算机虚拟放置在网络连接中的两台通信计算机之间,这台计算机称为“中间人”。在攻击过…

Spark编程实验四:Spark Streaming编程

目录 一、目的与要求 二、实验内容 三、实验步骤 1、利用Spark Streaming对三种类型的基本数据源的数据进行处理 2、利用Spark Streaming对Kafka高级数据源的数据进行处理 3、完成DStream的两种有状态转换操作 4、把DStream的数据输出保存到文本文件或MySQL数据库中 四…

NModbus-一个C#的Modbus协议库实现

NModbus-一个基于C#实现的Modbus通信协议库 最近在学习C#的时候,因为之前做过环保设备时使用C做过环保设备采集使用到了Modbus协议,当时看了一下基于C语言开发的libmodbus库。所以特意搜索看了一下C#下有什么Modbus协议库,在Github上面找了一…

[蓝桥杯2020国赛]答疑

答疑 题目描述 有 n 位同学同时找老师答疑。每位同学都预先估计了自己答疑的时间。 老师可以安排答疑的顺序,同学们要依次进入老师办公室答疑。 一位同学答疑的过程如下: 首先进入办公室,编号为 i 的同学需要 si​ 毫秒的时间。然后同学问…

After Effects 2021 for Mac(AE 2021)

After Effects 2021是一款由Adobe公司开发的视频特效和动态图形制作软件,它主要用于电影、电视和网络视频的后期制作。该软件可以帮助用户创建各种令人惊叹的视觉效果,包括动态图形、文字特效、粒子系统、3D渲染等。 After Effects 2021提供了数百种特效…

dash 中的模式匹配回调函数Pattern-Matching Callbacks 8

模式匹配 模式匹配回调选择器 MATCH、ALL 和 ALLSMALLER 允许您编写可以响应或更新任意或动态数量组件的回调函数。 此示例呈现任意数量的 dcc. Dropdown 元素,并且只要任何 dcc. Dropdown 元素发生更改,就会触发回调。尝试添加几个下拉菜单并选择它们的…

TCP/IP的五层网络模型

目录 封装(打包快递) 6.1应用层 6.2传输层 6.3网络层 6.4数据链路层 6.5物理层 分用(拆快递) 6.5物理层 6.4数据链路层 6.3网络层 6.2传输层 6.1应用层 封装(打包快递) 6.1应用层 此时做的数据…

Android Studio配置国内镜像源和HTTP代理/解决:Android Studio下载gradle速度慢的问题

(方案一)Android Studio配置国内镜像源和HTTP代理 一、配置国内镜像源/依赖库 1.1 打开项目的setting.gradle.kts文件 配置进去 pluginManagement {repositories {maven { urluri ("https://www.jitpack.io")}maven { urluri ("https:…

【C语言】分支与循环语句

什么是语句? C语句可分为以下五类: 表达式语句函数调用语句控制语句 (本篇重点介绍)复合语句空语句 控制语句用于控制程序的执行流程,以实现程序的各种结构方式。C语言支持三种结构: 顺序结构选择结构循…

第一讲:BeanFactory和ApplicationContext

BeanFactory和ApplicationContext 什么是BeanFactory 它是ApplicationContext的父接口它才是Spring的核心容器,主要的ApplicationContext实现都组合了它的功能 BeanFactory能做什么? 表面上看BeanFactory的主要方法只有getBean(),实际上控制反转、基…

产品经理学习-策略产品指标

目录: 数据指标概述 通用指标介绍 Web端常用指标 移动端常用指标 如何选择一个合适的数据指标 数据指标概述 指标是衡量目标的一个参数,指一项活动中预期达到的指标、目标等,一般用数据表示,因此又称为数据指标;…