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

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新特性

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

相关文章:

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

C#是一种通用的&#xff0c;类型安全的面向对象编程语言。其目标是提高程序员生产力。 一.面向对象 C#实现了丰富的面向对象范式&#xff0c;包括封装、继承、多态。 C#面向对象特性包括&#xff1a; 统一的类型系统 类与接口 属性、方法、事件 C#支持纯函数模式 二、类型安…...

【2023年冬季】华为OD统一考试(B卷)题库清单(已收录345题),又快又全的 B 卷题库大整理

目录 专栏导读华为OD机试算法题太多了&#xff0c;知识点繁杂&#xff0c;如何刷题更有效率呢&#xff1f; 一、逻辑分析二、数据结构1、线性表① 数组② 双指针 2、map与list3、队列4、滑动窗口5、二叉树6、并查集7、栈 三、算法1、基础算法① 贪心算法② 二分查找③ 分治递归…...

云服务器的先驱,亚马逊云科技海外云服务器领军者

随着第三次工业革命的发展&#xff0c;移动互联网技术带来的信息技术革命为我们的生活带来了极大的便捷。其中&#xff0c;不少优秀的云服务器产品发挥了不可低估的作用&#xff0c;你或许听说过亚马逊云科技、谷歌GCP、IBM Cloud等优秀的海外云服务器。那么云服务器有哪些&…...

QT webengine显示HTML简单示例

文章目录 参考示例1TestWebenqine.promainwindow.hmainwindow.cppmain.cpp效果 示例2 (使用setDevToolsPage函数)main.cpp效果 参考 QT webengine显示HTML简单示例 示例1 编译器 : Desktop Qt 5.15.2 MSVC2019 64bit编辑器: QtCreator代码: TestWebenqine.pro # TestWeben…...

Spark_SQL函数定义(定义UDF函数、使用窗口函数)

一、UDF函数定义 &#xff08;1&#xff09;函数定义 &#xff08;2&#xff09;Spark支持定义函数 &#xff08;3&#xff09;定义UDF函数 &#xff08;4&#xff09;定义返回Array类型的UDF &#xff08;5&#xff09;定义返回字典类型的UDF 二、窗口函数 &#xff08;1&…...

【Leetcode】【每日一题】【中等】274. H 指数

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/h-index/description/?envTyped…...

MySQL读写分离技术及实现方案

MySQL读写分离技术及实现方案 本文主要介绍了MySQL读写分离技术的原理、实现方案以及示例。通过使用读写分离技术&#xff0c;可以提高数据库的性能&#xff0c;降低服务器的压力。 一、MySQL读写分离技术简介 读写分离是指将数据库的读操作和写操作分别分配到不同的服务器上…...

git 推送到github远程仓库细节处理(全网最良心)

我查看了很多网上的教程都不是很好 我们先在github创建一个仓库&#xff0c;且初始化 readme 我们到本地文件初始化仓库 添加远程仓库 这时候我们就 git add . , git commit ,再准备git push 的时候 显示没有指定远程的分支 我们按照提示操作 提示我们要先git pull 提示我…...

算法训练|数据流中的中位数

LCR 160. 数据流中的中位数 - 力扣&#xff08;LeetCode&#xff09; 总结&#xff1a;这题自己最开始的想法是直接使用vector容器&#xff0c;每次取中位数的时候就进行一次排序&#xff0c;超时。题解很巧妙的利用大根堆和小根堆来解决问题&#xff0c;大根堆和小根堆各存一…...

LeetCode 2558. 从数量最多的堆取走礼物【模拟,堆或原地堆化】简单

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

windows服务器环境下使用php调用com组件

Office设置 安装 office2013 且通过正版激活码激活 在组件服务 计算机 我的电脑 DOM 中找到 Microsoft Word 97 - 2003 文档 服务&#xff0c;右键属性 身份验证调整为 无 在 标识中 调整为 交互式用户 php环境设置 开启com组件扩展 在php.ini中设置 extensionphp_com_dotn…...

3DCAT+东风日产:共建线上个性化订车实时云渲染方案

近年来&#xff0c;随着5G网络和云计算技术的不断发展&#xff0c;交互式3D实时云看车正在成为一种新的看车方式。 与传统的到4S店实地考察不同&#xff0c;消费者可以足不出户&#xff0c;通过网络与终端设备即可实现全方位展示、自选汽车配色、模拟效果、快捷选车并进行个性…...

【VR开发】【Unity】【VRTK】1-无代码VRVR开发介绍

本篇开始精简讲解VRTK相关的知识。 VRTK是基于Unity的一套提供无代码VR开发的插件,这套插件开源,可商用,集合了目前可能的VR体验组件,可以让不会C#编程但想要开发VR体验的人在不写一行代码的前提下开发出心仪的VR作品。 这套组件问世后也很受欢迎,目前已经进化到了第四代…...

全国地级市最新城投债数据(2006-2023.2)

地级市-城投债数据是关于各地级市发行的城市投资建设项目资金债券的统计数据。这些数据对于研究者来说有着一定的参考价值。首先&#xff0c;地级市-城投债数据能够提供全国各地级市城投债发行的数量和规模情况&#xff0c;帮助研究者了解城市基础设施建设和经济发展的情况。其…...

vm_flutter

附件地址 https://buuoj.cn/match/matches/195/challenges#vm_flutter 可以在buu下载到。 flutter我也不会&#xff0c;只是这个题目加密算法全部在java层&#xff0c;其实就是一个异或和相加。 反编译 package k;import java.util.Stack;/* loaded from: classes.dex */ pu…...

MySQL数据库#6

Python操作mysql 在使用Python连接mysql之前我们需要先下载一个第三方的模块 pymysql的模块&#xff0c;导入后再进行操作。 操作步骤&#xff1a;1. 先连接mysql host&#xff0c;port&#xff0c;charset&#xff0c;username password 库&#xff0c;等等。 import pymysql…...

YOLO v1(2016.5)

文章目录 AbstractIntroduction过去方法存在的问题我们提出的方法解决了... Unified DetectionNetwork DesignTrainingInference Comparison to Other Detection SystemsDeformable parts modelsR-CNNOther Fast DetectorsDeep MultiBoxOverFeatMultiGrasp ExperimentsConclusi…...

SQL比较两次的字段集合,找出并返回差异,主要用于更新记录事件

Create PROCEDURE [dbo].[SysGetTableFieldsCompare] -- Description: <比较两次的字段集合&#xff0c;找出并返回差异&#xff0c;主要用于更新记录事件> -- Return 0- 成功&#xff0c; -1- 没有这个表 -- Rev: 1.00 -- FieldsSource Nvarchar(max) , FieldsTarg…...

muduo源码剖析之Acceptor监听类

简介 Acceptor类用于创建套接字&#xff0c;设置套接字选项&#xff0c;调用socket()->bind()->listen()->accept()函数&#xff0c;接受连接&#xff0c;然后调用TcpServer设置的connect事件的回调。 listen()//在TcpServer::start中调用 封装了一个listen fd相关…...

express session JWT JSON Web Token

了解 Session 认证的局限性 Session 认证机制需要配合 cookie 才能实现。由于 Cookie 默认不支持跨域访问&#xff0c;所以&#xff0c;当涉及到前端跨域请求后端接口的时候&#xff0c;需要做很多额外的配置&#xff0c;才能实现跨域 Session 认证。 注意&#xff1a; 当前端…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式

pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图&#xff0c;如果边框加在dom上面&#xff0c;pdf-lib导出svg的时候并不会导出边框&#xff0c;所以只能在echarts图上面加边框 grid的边框是在图里…...