C#核心笔记——(一)C#和.NET Framework

C#是一种通用的,类型安全的面向对象编程语言。其目标是提高程序员生产力。

一.面向对象

C#实现了丰富的面向对象范式,包括封装、继承、多态。

C#面向对象特性包括:
统一的类型系统
类与接口
属性、方法、事件
C#支持纯函数模式

二、类型安全性

C#是一门类型安全的语言。例如:C#不允许将字符串类型作为整数类型处理。

C#支持类型静态化。能够在程序运行前排除大量错误。

C#允许使用dynamic关键字动态定义指定类型。然而C#在大多情况下仍然是一门静态语言。

C#还是一门强类型语言。

三、内存管理

C#依靠运行时来实现自动内存管理。公共语言运行时的垃圾回收器会作为程序的一部分运行。

C#并未抛弃指针,关键字unsafe的程序块显式内存分配。

四、平台支持

Linux、macOS、iOS、Android

五、CLR

公共语言运行时(Common Language Runtime,CLR),如自动化内存管理和异常处理。

C#也会将代码编译为托管代码。托管代码以中间语言(Intermediate Language,IL)的形式表示。CRL通常会在执行前,将IL转换为机器(如x84、x64)原生代码,称为即时(Just-In-Time)编译。

六、.NET Framework

.NET Framework是由CLR和大量的程序库组成。

七、其他框架

UWP
.Net Core
ASP.NET Core
Xamarin

八、简史

8.1C# 7.0新特性

8.1.1 数字字面的改进

下划线改善可读性:

int million = 1_000_000;

二进制字面量使用Ob前缀来标识:

int a = 0b1001_0000;
var b = 0b1001_0000;

8.1.2 输出变量及参数忽略

调用含有out参数的方法将更加容易:

bool successful = int.TryParse("123", out int result);
Console.WriteLine(result);

当调用含有多个out参数方法时,可以使用下划线字符_忽略你并不关心的参数:

方法

static void SimpleMethod(out int result,out int result2 ,out int result3)
{result = 1 + 1;result2 = 2 + 2;result3 = 3 + 3;
}

调用

SimpleMethod(out _, out _, out int result2);

8.1.3 模式

is运算符也可以自然的引入变量,称为模式变量

方法

static void SimpleMethod2(object x)
{if(x is string s){Console.WriteLine(s.Length);}
}

调用

SimpleMethod2("大家好呀");

同样 switch语句也同样支持模式。可以使用when子句来判断条件,或是直接选择null;

方法

static void SimpleMethod3(object? x){switch(x){case int i:Console.WriteLine("It is an int"); break;case string s:Console.WriteLine(s.Length);break;case bool b when b == true :Console.WriteLine("True");break;case null:Console.WriteLine("It is null");break;}}

调用

SimpleMethod3(12);
SimpleMethod3("12");
SimpleMethod3(true);
SimpleMethod3(null);

8.1.4 局部方法

局部方法是声明在其他函数内部的方法

static void WriteCubes()
{Console.WriteLine(Cubu(3));Console.WriteLine(Cubu(4));Console.WriteLine(Cubu(5));int Cubu(int value) => value * value * value;
}

8.1.5 更多的表达式体成员

C#6引入了以”胖箭头“语法表示的表达式的方法,只读属性、运算符以及索引器。而C#7更将其扩展到了构造函数、读/写属性和终结器中:

类:

 public class Person : IAsyncDisposable{string? name;public Person(string? name) => Name = name;public string? Name{get => name;set => name = value ?? "";}public ValueTask DisposeAsync(){Console.WriteLine("Dispose");return ValueTask.CompletedTask;}}

方法:

 static async void PersonDispose(){await AsyncPersonDispose();}static async Task AsyncPersonDispose(){await using (Person p = new Person("小米")){Console.WriteLine(p.Name);}}

8.1.6 解构器

C#7引入了结构器模式。构造器一般接受一系列(作为参数)并将其赋值给字段,而结构器则正相反,它将字段反向赋值给变量。

public class Dog{string? name;public Dog(string? name) => Name = name;public string? Name{get => name;set => name = value ?? "";}public void Deconstruct(out string firstName,out string lastName){int spacePos = name.IndexOf(' ');firstName = name.Substring(0, spacePos);lastName = name.Substring(spacePos + 1);}}

调用

var joe = new Dog("joe Bloggs");
var(first,last)=joe;
Console.WriteLine(first);
Console.WriteLine(last);

8.1.7 元组

C# 7 改进当属显示的元组(tuple)支持,元组提供了一系列相关值的简单方式:

var bob = ("Bob", 23);
Console.WriteLine(bob.Item1);
Console.WriteLine(bob.Item2);

C#的新元组实质上是使用了System.ValueTuple<…>泛型结构的语法糖。
我们还可以对元组的元素命名:

var tuple = (Name: "Bob", Age: 23);
Console.WriteLine(tuple.Name);
Console.WriteLine(tuple.Age);

有了元组函数再也不用通过一系列out参数来返回多个值了:

static (int row, int colum) GetFilePosition() => (3, 10);
var pos = GetFilePosition();
Console.WriteLine(pos.row);
Console.WriteLine(pos.colum);

元组隐式的支持解构模式

(int row,int column) = GetFilePosition();
Console.WriteLine(row);
Console.WriteLine(column);

8.1.7 thow表达式

现在它可以出现在表达式体函数中

public string Foo() => throw new NotImplementedException();

thow表达式也可以出现在三无判断运行符中:
方法

static string Capotalize(string? value) =>value == null ? throw new ArgumentException("Value") :value == "" ? "" :char.ToUpper(value[0]) + value.Substring(1);

调用

Console.WriteLine(Capotalize(null)); 

8.2 C# 6.0新特性

null条件(“Elvis”)运算符,可以避免在调用方法或访问类型的成员之前显式地编写用于null判断的语句。如下result将会为null而不会抛出NullReferenceException:

System.Text.StringBuilder sb = null;
string result = sb?.ToString();

lambda表达式

public int TimesTwo(int x) => x * 2;
public string someProperty => "Property value";

属性初始化器可以对自动属性进行初始赋值:

public DateTime TimeCreated { get; set; } = DateTime.Now;

这种初始化也支持只读属性:

public DateTime TimeCreated { get; } = DateTime.Now;

只读属性也可以在构造器中赋值。

索引初始化器可以一次性初始化具有索引器的任意类型:

var dict = new Dictionary<int, string>()
{[3] = "three",[20] = "ten"
};

字符串插值用更加简单的方式替代了string.Format:

string s = $"It is {DateTime.Now}";
Console.WriteLine(s);

异常过滤器,可以在catch上再加一个条件:

string html;
try
{html = new WebClient().DownloadString("http://asef");
}
catch(WebException ex) when(ex.Status == WebExceptionStatus.Timeout)
{}

using static 指令可以引入一个类型的所有静态成员,这样就可以不用写类型而直接使用这些成员:

using static System.Console;
WriteLine("Hello world");

nameof运算符返回变量、类型或者其他符号的名称,这样可以避免变量重命名造成不一致的代码:

int capacity = 123;
string x = nameof(capacity);
Console.WriteLine(x);

值得一提的是C# 6.0可以在catch和finally块中使用 await.

8.3 C# 5.0新特性

async和await,支持异步功能,有利于编写高并发和高效的I/O密集型应用程序。

8.4 C# 4.0新特性

1.动态绑定
2.可选参数和命名参数
3.用泛型接口和委托实现类型变化
4.改进COM互操作性

8.5 C# 3.0新特性

隐式局部变量、匿名类型、对象构造器、lambda表达式、扩展方法、查询表达式、表达式数。

8.5 C# 2.0新特性

泛型、可空类型、匿名方法、分部类、静态类

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

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

相关文章

BUUCTF zip伪加密 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 下载附件&#xff0c;得到一个zip压缩包。 密文&#xff1a; 解题思路&#xff1a; 1、刚开始尝试解压&#xff0c;看到了flag.txt文件&#xff0c;但需要解压密码。结合题目&#xff0c;确认这是zip伪加密&#…

Makefile 基础教程:从零开始学习

在软件开发过程中&#xff0c;Makefile是一个非常重要的工具&#xff0c;它可以帮助我们自动构建程序&#xff0c;管理程序依赖关系&#xff0c;提高开发效率。本篇博客将从基础开始&#xff0c;介绍Makefile的相关知识&#xff0c;帮助大家快速掌握Makefile的使用方法 Makefil…

Corel Products Keygen-X-FORCE 2023(Corel会声会影2023注册机)

Corel All Products Universal Keygens通用注册机是一款非常实用的激活工具&#xff0c;专门用于激活Corel全系列产品。尤其是被广泛使用的CorelDRAW作图软件和Corel VideoStudio会声会影视频编辑处理软件。小编也是一直关注由X-Force团队制作的注册机&#xff0c;目前已更新至…

kubectl资源管理命令-陈述式

目录 一、陈述式对象管理 1、基本概念 2、基础命令使用 3、基本信息查看&#xff08;kubectl get&#xff09; 4、增删等操作 5、登录pod中的容器 6、扩容缩容pod控制器的pod 7、删除副本控制器 二、创建项目实例 1、创建 kubectl create命令 2、发布 kubectl …

vue中报 TypeError: Assignment to constant variable.

在项目开发过程中&#xff0c;在使用变量声明时&#xff0c;如果不注意&#xff0c;可能会造成类型错误 比如&#xff1a; Uncaught (in promise) TypeError: Assignment to constant variable. 未捕获的类型错误&#xff1a;赋值给常量变量。 原因&#xff1a; 我们使用 con…

MySQL-DQL【数据查询语言】(图码结合)

作者:chlorine 专栏:数据库_chlorine5的博客-CSDN博客 MySQL——DDL&#xff1a;DDL ——数据定义语言 MySQL——DML&#xff1a;DML——数据操作语言 目录 一.DQL的定义 二.DQL—语法 三.DQL—基础查询(SELECT.. FROM) &#x1f449;查询多个字段 &#x1f449;设置别名 …

WKWebView iOS17设置UserAgent

WKWebView 设置 user-agent 参考文档 之前设置 user-agent 都是通过设置NSUserDefaults来实现的&#xff0c;不过升级到了iOS17之后这个方式不好用了。 老的设置方式&#xff1a; [[NSUserDefaults standardUserDefaults] registerDefaults:dictionnary];目前看通过设置 we…

力扣:141. 环形链表(Python3)

题目&#xff1a; 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的…

【软考系统架构设计师】2023年系统架构师冲刺模拟习题之《软件工程》

在软考中软件工程模块主要包含以下考点&#xff1a; 文章目录 软件过程模型&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;逆向工程&#x1f31f;基于构件的软件工程&#x1f31f;&#x1f31f;软件开发与软件设计与维护净室软件工程软件模型软件需求 软件过程模型&am…

【RTT驱动框架分析】-硬件定时器应用笔记和源码分析

hwtimer硬件定时器 官方应用开发 定时器简介 硬件定时器一般有 2 种工作模式,定时器模式和计数器模式。不管是工作在哪一种模式,实质都是通过内部计数器模块对脉冲信号进行计数。下面是定时器的一些重要概念。 **计数器模式:**对外部输入引脚的外部脉冲信号计数。 **定…

Linux MMC子系统 - 2.eMMC 5.1总线协议浅析

By: Ailson Jack Date: 2023.10.27 个人博客&#xff1a;http://www.only2fire.com/ 本文在我博客的地址是&#xff1a;http://www.only2fire.com/archives/161.html&#xff0c;排版更好&#xff0c;便于学习&#xff0c;也可以去我博客逛逛&#xff0c;兴许有你想要的内容呢。…

科技联众,互利共赢 | 卡驰科技(深圳)有限公司CEO张倍铭博士到访拓世科技集团,共探跨境电商,海外拓展无限可能

在创新的浪潮中&#xff0c;人工智能以其强大的能量持续推动着各行各业的进步&#xff0c;拓世科技集团作为人工智能领域的引领者&#xff0c;通过不断合作和交流&#xff0c;与众多领域的佼佼者共同探讨数字时代的无限可能。卡驰科技&#xff08;深圳&#xff09;有限公司作为…

适用于 Mac 或 Windows 的 4 种最佳 JPEG/PNG图片 恢复软件

您的计算机或外部存储驱动器上很可能有大量 JPEG /PNG图片照片&#xff0c;但不知何故&#xff0c;您意识到一些重要的 JPEG /PNG图片文件丢失或被删除&#xff0c;它们对您来说意义重大&#xff0c;您想要找回它们. 4 种最佳 JPEG/PNG图片 恢复软件 要成功执行 JPEG /PNG图片…

【Java笔试强训】Day6(45840-不要二、23292-字符串转成整数)

45840-不要二 链接&#xff1a;45840-不要二 题目&#xff1a; 二货小易有一个W*H的网格盒子&#xff0c;网格的行编号为0~ H-1&#xff0c;网格的列编号为0~W-1。每个格子至多可以放一块蛋糕&#xff0c;任意两块蛋糕的欧几里得距离不能等于2。 对于两个格子坐标(x1,y1),(…

Cross-modal Variational Alignment of Latent Spaces

方法 潜空间LS 辅助信息 作者未公布代码

Git窗口打开vim后如何退出编辑(IDEA/Goland等编辑器)

最近在学习git高级操作过程中&#xff0c;遇到了一下问题&#xff1a; 我在学习Git合并多个commit为一个的时候&#xff0c;需要输入一个命令 git rebase -i HEAD~2 这说明已经是编辑模式了。当我写好后&#xff0c;我还按照原来在linux上的按下ESC键&#xff0c;但是只是光…

知识链接,人工智能可以帮助人类验证世界知识吗?#verify_wikipedia

这是一篇来自Samaya AI的文章&#xff0c;主要介绍了其 CTO 在 Meta AIs FAIR labs 工作发表在 nature 上的一篇论文成果&#xff0c;用于验证和改进维基百科上的引用来源。我做了一些精选和整理&#xff0c;分享给大家&#xff1a; 研究背景 几千年来&#xff0c;人类一直在创…

leetcode_39 组合总和

1. 题意 给定一个数组&#xff0c;和一个目标值&#xff1b;求得所有数组中所有和为目标值的元素序列。 组合总数 2. 题解 回溯列举每一个可能的序列&#xff0c;注意去重。 2.1 我的解法 class Solution { public:void gen(vector<vector<int>> &ans,co…

中国技术的对外输出:Telegram也开始搞小程序应用了

Telegram 宣布为其开发者提供了一项“能够在其中运行迷你应用”的新功能&#xff08; 迷你应用即 Mini App&#xff0c;下文中以“小程序”代替&#xff09;。 在 Telegram 的博客中&#xff0c;开发人员介绍可以使用 JavaScript 构建自己的迷你应用 在一篇博客文章中&#xf…

【linux】麒麟v10安装Redis主从集群(ARM架构)

安装redis单示例的请看&#xff1a;麒麟v10安装Redis&#xff08;ARM架构&#xff09; 安装环境 ​Hostname​IP addressmaster192.168.0.1slave1192.168.0.2slave2192.168.0.3 下载安装包 &#xff08;三台都操作&#xff09; wget https://repo.huaweicloud.com/kunpeng/…