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.mzph.cn/news/586978.shtml

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

相关文章

openGauss学习笔记-179 openGauss 数据库运维-逻辑复制-发布订阅

文章目录 openGauss学习笔记-179 openGauss 数据库运维-逻辑复制-发布订阅179.1 发布179.2 订阅179.3 冲突处理179.4 限制179.5 架构179.6 监控179.7 安全性179.8 配置设置179.9 快速设置 openGauss学习笔记-179 openGauss 数据库运维-逻辑复制-发布订阅 发布和订阅基于逻辑复…

大模型推理部署:LLM 七种推理服务框架总结

自从ChatGPT发布以来,国内外的开源大模型如雨后春笋般成长,但是对于很多企业和个人从头训练预训练模型不太现实,即使微调开源大模型也捉襟见肘,那么直接部署这些开源大模型服务于企业业务将会有很大的前景。 本文将介绍七中主流的…

【eclipse】eclipse开发springboot项目使用入门

下载eclipse Eclipse downloads - Select a mirror | The Eclipse Foundation 安装eclipse 其他一步一步即可 我们是开发java web选择如下 界面修改 Window->Preferences-> 修改eclipse风格主题 Window->Preferences->General->Appearance 修改字体和大小…

基于 CefSharp 实现一个文件小工具

I’m not saying you can’t be financially successful I’m saying have a greater purpose in life well beyond the pursuit of financial success Your soul is screaming for you to answer your true calling You can change today if you redefine what success is to …

深度强化学习DQN训练避障

目录 一.前言 二.代码 2.1完整代码 2.2运行环境 2.3动作空间 2.4奖励函数 2.5状态输入 2.6实验结果 一.前言 深度Q网络(DQN)是深度强化学习领域的一项革命性技术,它成功地将深度学习的强大感知能力与强化学习的决策能力相结合。在过…

Kafka集群详解

Kafka介绍Kafka集群介绍Kafka集群特点Kafka集群搭建在这里插入图片描述Kafka集群如何进行故障切换Kafka集群Leader的选举Kafka集群如何快速横向拓展Kafka集群搭建最佳实践Kafka集群可以使用单节点Zookeeper吗Kafka集群的消费者信息保存在那里Kafka集群的Topic的分区数的设置规则…

YOLOv8改进 添加可变形注意力机制DAttention

一、Deformable Attention Transformer论文 论文地址:arxiv.org/pdf/2201.00520.pdf 二、Deformable Attention Transformer注意力结构 Deformable Attention Transformer包含可变形注意力机制,允许模型根据输入的内容动态调整注意力权重。在传统的Tra…

鸿蒙 Window 环境的搭建

鸿蒙操作系统是国内自研的新一代的智能终端操作系统,支持多种终端设备部署,能够适配不同类别的硬件资源和功能需求。是一款面向万物互联的全场景分布式操作系统。 下载、安装与配置 DevEco Studio支持Windows系统和macOS系统 Windows系统配置华为官方推…

小程序面试题 | 17.精选小程序面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

Nmap使用

Nmap 文章目录 Nmap端口扫描及其原理端口扫描用法Zenmap配置说明 Nmap 是一款开源免费的网络发现(Network Discovery)和安全审计(Security Auditing)工具官网为:www.nmap.org。 一般情况下,Nmap用于列举网…

从0开始界面设计师 Qt Designer

QT程序界面的 一个个窗口、控件,就是像上面那样用相应的代码创建出来的。 但是,把你的脑海里的界面,用代码直接写出来,是有些困难的。 很多时候,运行时呈现的样子,不是我们要的。我们经常还要修改代码调整界…

day12--java高级编程:网络通讯

5 Day19–网络通信(Socket通信) 说明: io流是跟本地的文件进行数据的传输,读或者写。网络通信:数据在网络中进行的传输。 本章专题与脉络 1. 网络编程概述 Java是 Internet 上的语言,它从语言级上提供了对网络应用程序的支持&…

Maven项目提示Ignored pom.xml问题

1 环境 (1)IDEA开发工具:2022.2.1 (2)JDK:Java17(Spring6要求JDK最低版本是Java17) (3)Spring:6.1.2 (4)Maven 3.8.8 2 …

react+redux+antd-mobile 之 记账本案例

1.环境搭建 //使用CRA创建项目,并安装必要依赖,包括下列基础包 //1. Redux状态管理 - reduxjs/toolkit 、 react-redux //2. 路由 - react-router-dom //3. 时间处理 - dayjs //4. class类名处理 - classnames //5. 移动端组件库 - antd-mobile //6. 请…

linux常见基础指令

入门常见基础指令 ls、stat、 pwd 、cd、tree、 whoami、 touch、 mkdir、 rm 、 man、 cp、mv、cat、tac、echo、>、 >>、 < 、more、 less、 head、 tail、date、 cal、 find、 which、alias、whereis、grep、zip与unzip、 tar、bc、uname、xargs... 热键Tab、…

【信息安全原理】——期末复习(冲刺篇)

&#x1f4d6; 前言&#xff1a;快考试了&#xff0c;做篇期末总结&#xff0c;都是重点与必考点。 题型&#xff1a;简答题&#xff08;45分&#xff09;、协议分析题&#xff08;210分&#xff09;&#xff08;给一个报文或工作流程&#xff0c;分析存在的问题&#xff09;、…

操作系统:linux(在虚拟机上详细步骤安装)Centos

文章目录 前言&#xff1a;一、如何在自己的电脑上安装centos?二、在虚拟机上安装centos2.1安装步骤&#xff1a; 前言&#xff1a; 操作系统有&#xff1a;windows server 不开源的收费的、linux 开源的免费的&#xff0c;精简安装&#xff08;没有UI)。国产的操作系统有&am…

Pytest框架 —— 用例标记和测试执行篇!

pytest用例标记和测试执行篇 上一篇文章入门篇咱们介绍了pytest的前后置方法和fixture机制&#xff0c;这个章节主要给大家介绍pytest中的标记机制和用例执行的方法。pytest可以通过标记将数据传入于测试函数中&#xff0c;也可以通过标记中对执行的用例做筛选&#xff0c;接下…

『亚马逊云科技产品测评』活动征文|云服务器如何快速搭建个人博客(图文详解)

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 文章目录 引言一、前期准备步骤1.1 准备一个亚马逊 EC2 服务器1.2 进入控…

过年过节通过html+css+js代码实现:超级好看的放烟花效果(含背景音乐)

文章目录&#xff1a; 一&#xff1a;放烟花 1. 运行效果 2.代码 二&#xff1a;新年快乐 1.运行效果 2.代码 一&#xff1a;放烟花 1. 运行效果 效果图◕‿◕✌✌✌ 过年过节通过htmlcssjs实现放烟花效果代码(含背景音乐) 2.代码 修改后缀为".html"的格式…