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}");
    }
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

宠物救助上门喂养系统宠物领养宠物寄养寻宠小程序宠物社区系统宠物托运宠物殡葬源码

后端php 前端uniapp mysql数据库 主要功能介绍: 1.根据当前位置 支持多城市切换 2.支持首页公告实时显示 3.支持 宠物救助,上门喂养,宠物领养,宠物寄养,寻宠,宠物社区,宠物托运&#xff…

SpringAMQP的使用方式

MQ介绍 MQ,中文是消息队列(MessageQueue),字面来看就是存放消息的队列。也就是事件驱动架构中的Broker。 比较常见的MQ实现: ActiveMQ RabbitMQ RocketMQ Kafka 几种常见MQ的对比: RabbitMQActiveM…

django基础学习

django基础学习 文章目录 django基础学习django框架urls.py将请求发送到正确的视图views.py处理请求models.py定义数据模型根据models查询数据HTML模板呈现数据 Django项目结构创建虚拟环境下载django创建站点创建应用settings.py项目设置 通用类别视图会话框架身份验证视图使用…

探索 Pinia:简化 Vue 状态管理的新选择(上)

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

项目中使用Java中List.subList()的注意事项

使用介绍 在Java中&#xff0c;subList是List接口的一个方法&#xff0c;用于获取原始列表的子列表 方法的声明如下 List<E> subList(int fromIndex, int toIndex);fromIndex&#xff1a;起始索引&#xff08;包括&#xff09;toIndex&#xff1a;结束索引&#xff08…

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

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

Java项目:101SpringBoot仓库管理系统

博主主页&#xff1a;Java旅途 简介&#xff1a;分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 仓库管理系统基于SpringBootMybatis开发&#xff0c;系统使用shiro框架做权限安全控制&#xff0c;超级管理员登录系统后可根据自己的实际需求配角色&…

(四)开启定时器2中断

文章目录 定时器2中断的开启借用isp软件生成代码下面进行定时器2中断开启 最终开启定时器2中断的代码定时器2中断服务函数的编写查手册得到定时器2中断查询次序号查手册得次序号为12通过公式计算 中断服务函数编写 结合之前学的点亮LED现象演示 定时器2中断的开启 借用isp软件…

【开源】基于Vue+SpringBoot的二手车交易系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 二手车档案管理模块2.3 车辆预约管理模块2.4 车辆预定管理模块2.5 车辆留言板管理模块2.6 车辆资讯管理模块 三、系统设计3.1 E-R图设计3.2 可行性分析3.2.1 技术可行性分析3.2.2 操作可行性3.2.3 经济…

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

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

git基础概念和常用命令(日常开发收藏备用)

目录 ### 常用命令 ### 远程仓库与克隆 ### 分支管理 ### 子模块&#xff08;Submodule&#xff09; ### 其他高级操作 ### 交互式暂存&#xff08;Interactive Staging&#xff09; ### cherry-pick ### rebase ### reflog与reset ### 子树合并&#xff08;Subtree …

Linux操作系统( YUM软件仓库技术 )

镜像文件的回环挂载&#xff08;把iso镜像文件释放成系统安装光盘&#xff09;foundation0上操作 回环挂载的用法&#xff1a; du -sh 对象名 //估算文件&#xff08;一切对象皆文件&#xff09;大小 !$ //上一条命令的最后一个参数 新创建的挂载点目录是空白目录 挂载&#xf…

【OpenCV】OpenCV 4.9.0 正式发布

​ 开源计算机视觉库 OpenCV 4.9.0 已于2023年12月29日正式发布。 此次发布有DNN模块对ONNX Attention、Einsum等层的支持、新的fastGEMM实现、transformers的实验性支持等诸多亮点。 OpenCV 4.9.0 更新内容&#xff1a; &#xff08;来自OpenCV中国团队以及中国社区的贡献…

【Web】vulhub-httpd apache解析漏洞复现(1)

目录 ①CVE-2017-15715 ②apache_parsing_vulnerability ①CVE-2017-15715 贴出源码&#xff1a; <?php if(isset($_FILES[file])) {$name basename($_POST[name]);$ext pathinfo($name,PATHINFO_EXTENSION);if(in_array($ext, [php, php3, php4, php5, phtml, pht]))…

Linux:apache优化(4)—— 隐藏版本号

运行环境 yum -y install apr apr-devel cyrus-sasl-devel expat-devel libdb-devel openldap-devel apr-util-devel apr-util pcre-devel pcre gcc make zlib-devel 源码包配置 ./configure --prefix/usr/local/httpd --enable-cgi --enable-rewrite --enable-so --enabl…

cleanmymac这个软件怎么样?值不值得下载

cleanmymac是我必装的mac端清理软件&#xff0c;界面简洁好看&#xff0c;完美适配mac系统&#xff0c;文件清理的速度、精度都比较优秀&#xff0c;还是比较不错的呢。cleanmymac作为一款第三方清洁应用程序&#xff0c;具有专业完整的清理功能&#xff0c;包括释放内存、一键…

【办公技巧】怎么批量提取文件名到excel

Excel是大家经常用来制作表格的文件&#xff0c;比如输入文件名&#xff0c;如果有大量文件需要输入&#xff0c;用张贴复制或者手动输入的方式还是很费时间的&#xff0c;今天和大家分享如何批量提取文件名。 打开需要提取文件名的文件夹&#xff0c;选中所有文件&#xff0c…

HTML---JavaScript基础

文章目录 目录 文章目录 本章目标 一.JavaScript基础 概述 特点 JavaScript 基本机构 语法 网页中引用JavaScript的方式 二. JavaScript核心语法 变量 ​编辑 数据类型 数组 练习 本章目标 掌握JavaScript的组成掌握JavaScript的基本语法会定义和使用函数会使用工具进行…

[Angular] 笔记 22:ElementRef

chatgpt: ElementRef 是 Angular 中的一个类&#xff0c;它用于包装对 DOM 元素的引用。它允许开发者直接访问与 Angular 组件关联的宿主 DOM 元素。 当在 Angular 中需要直接操作 DOM 元素时&#xff0c;可以使用 ElementRef。通常情况下&#xff0c;最好避免直接操作 DOM&a…

【Transformer】深入理解Transformer模型1——初步认识了解

前言 Transformer模型出自论文&#xff1a;《Attention is All You Need》 2017年 近年来&#xff0c;在自然语言处理领域和图像处理领域&#xff0c;Transformer模型都受到了极为广泛的关注&#xff0c;很多模型中都用到了Transformer或者是Transformer模型的变体&#xff0…