【翻译】.NET 5 Preview8发布

今天,.NET 5预览8发布了,对于.NET5.0的功能开发已经完成了,这必须要排除待处理的bug,预览8是最后一次预览版本。预计11月正式的.NET5.0版本发布之前还将发布两个正式之前的候选版本,这篇文章描述了.NET5.0版本中的一系列功能。
You can download .NET 5.0, for Windows, macOS, and Linux:

  • Installers and binaries

  • Container images

  • Snap installer

  • Release notes

  • Known issues

  • GitHub issue tracker

今天同时也发布了ASP.NET Core 和 EF Core 。
要使用.NET5我们需要最新版本的 Visual Studio (包括 Visual Studio for Mac) 才能使用 .NET 5.0.
.NET 5.0包括许多改进,特别是单个文件应用程序,较小的容器映像,更强大的JsonSerializer API,一整套可空的引用类型注释以及对Windows ARM64的支持。在NET库,GC和JIT中,性能得到了极大的提高。ARM64是性能投资的重点,可提高吞吐量并减少二进制文件。.NET 5.0包括新的语言版本C#9和F#5.0。
.NET 5.0包括了许多的改进,特别是单个文件应用程序,较小的容器映像,更强大的JsonSerializer APIs,一整套可空的引用类型注释以及对Windows ARM64的支持。在.NET库,GC和JIT中,性能得到了极大的提高,ARM6是性能的重点项,可提高吞吐量并减少二进制文件。.NET5.0包括新的语言版本C# 9 和F# 5.0.


.NET 5.0还包括使用Mono运行时和.NET库对Web程序集的支持。这是.NET 5.0中Blazor Web程序集的基础。这是对Blazor 3.2的更改,后者使用了Mono运行时库和Mono库。去年,我们提出了一个统一的.NET平台的愿景,该平台具有适用于所有.NET应用程序类型的一组库和工具。此项更改的好处是,可以享受.NET的单一开发经验,可以在各种.NET应用类型之间实现更高的兼容性,并且仅维护和改进一个代码库。我们使用Web程序集进行的更改(使用.NET库)是对该愿景的首付。我们期望通过.NET 6.0实现其余的愿景,主要集中在Xamarin(iOS和Android)上。
.NET 5.0 还包括使用Mono运行时和.NET库对Web程序集的支持,这是.NET 5.0中Blazor Web程序集的基础。这是对Blazor 3.2的更改,后者使用了Mono运行时和Mono库,在去年他们提出了一个统一的.NET平台的愿景,该平台具有适用于所有.NET应用程序类型的一组库和工具,此项更改的好处是,可以享受.NET的单一开发经验,可以在各种的.NET应用类型之间实现更高的兼容性,并且仅维护和改进一个代码库,在这次使用Web程序集进行的更改(使用.NET库)是对该愿景的首次交付,希望能通过.NET6.0实现其余的愿景,主要集中在Xamarin(iOS和Android)上。
现在这个版本功能开发已经完成,让我们看一下.NET5.0的一部分,该帖子由一组主题部分组成:语言,工具、API、运行时技术和应用程序部署。这些部分及其顺序大致反映了开发过程和生命周期,如果您对一个开发方面对比另一个方面更敢兴趣,这将帮助您找到所需的内容。

Languages

C#9和F#5是.NET5.0版本的一部分,并包含在.NET5.0 SDK中,Visual SDK也包含了在5.0 SDK中,它不包括语言的更改,但进行了改进以支持.NET Core上的Visual Basic应用程序框架。
C#源码生成器是一项重要的新c#编译器新功能,由于它没有任何语言语法,因此在技术上不属于C#9,请参阅新的c#源代码生成器示例,以帮助您开始使用此新功能。

C# 9

c#9是该语言的重要版本,这个版本专注于程序的简单性,数据不变形和更多的模式.

Top-level programs

高级的程序提供了更简单的语法,而仪式感却变少了,此语法将首先帮助我们学习该语言,我们希望高级程序语法在后续发行版中变得更加简单,例如删除默认的 using 语句
下面是c# 9版本的“hello world”。

using System;Console.WriteLine("Hello World!");

高级的程序可以扩展为使用更多功能,例如在同一文件中定义和调用方法或者类.

using System;
using System.Runtime.InteropServices;
Console.WriteLine("Hello World!");
FromWhom();
Show.Excitement("Top-level programs can be brief, and can grow as slowly or quickly in complexity as you'd like", 8);
void FromWhom()
{Console.WriteLine($"From {RuntimeInformation.FrameworkDescription}");
}
internal class Show
{internal static void Excitement(string message, int levelOf){Console.Write(message);for (int i = 0; i < levelOf; i++){Console.Write("!");}Console.WriteLine();}
}

该程序生成以下输出。

[rich@taumarunui test]$ ~/dotnet/dotnet run
Hello World!
From .NET 5.0.0-preview.8
Top-level programs can be brief, and can grow as slowly or quickly in complexity as you'd like!!!!!!!!

Pattern matching

Patterns test值具有特定的形状,并在其具有匹配形状时可以从值中提取信息。最新的c#版本中已添加了新的模式匹配改进。
我将分享两个示例,第一个演示了属性的模式,在将上下文对象与特定模式进行比较之前,他会检查是否为null(带有is).

if (context is {IsReachable: true, Length: > 1 })
{Console.WriteLine(context.Name);
}
This is equivalent to:
if (context is object && context.IsReachable && context.Length > 1 )
{Console.WriteLine(context.Name);
}
Also equivalent to:
if (context?.IsReachable && context?.Length > 1 )
{Console.WriteLine(context.Name);
}

以下示例使用relational patterns(如<,<=)和逻辑模式(如and,or和not)。以下代码根据毛重计算出送货的卡车在高速公路的通行费(decimal ),对于那些不熟悉的人,在数字文字告诉编译器之后,m表示数字是decimal 而不是double.

DeliveryTruck t when t.GrossWeightClass switch
{< 3000 => 8.00m,>= 3000 and <= 5000 => 10.00m,> 5000 => 15.00m,
},

Target-typed new expressions
Target-typed new expressions是在构造对象/值时移除类型重复的一种新方法。
下面的示例都是等效的,中间是新的语法。

List<string> values = new List<string>();
List<string> values = new();
var values = new List<string>();

我猜很多人都会喜欢这个新语法 var 有两个原因:许多人阅读从左到右和希望的类型信息左边 = ,可能更重要的是左边的事完全致力于类型信息,而不是被一个特定的构构造函数的复杂性和细微差别(右边)

Tools

在这篇文章中,我们将重点关注运行时诊断工具。

Microsoft.Extensions.Logging

我们对Microsoft.Extensions.Logging 库中的控制台日志提供程序进行了改进,开发人员现在可以实现自定义的[ConsoleFormatt](https://github.com/dotnet/runtime/issues/34742) ,以完全控制控制台输出的格式和颜色,格式化程序API通过实现 VT-100 (大多数现代终端支持)转移序列的子集来实现丰富的格式化,控制台记录器可以解析不受支持的终端上的转义序列,使您可以为所有终端编写单个格式化程序。
除了支持自定义格式化程序外,我们还添加了一个内置的JSON格式化程序,它会将结构化JSON日志发送到控制台。

Dump debugging

调试托管代码需要对托管对象和构造有特殊的了解,数据访问组件(DAC)事运行时执行引擎的子集,他具有这些构造的知识,并且可以在没有运行时的情况下访问这些托管对象,从Preview 8开始,他们已经开始针对Windows编译Linux DAC,现在可以使用WinDBG或 dotnet dump analysis 在Windows上分析在Linux上收集的.NET Core进程转储。
在Preview 8中,我们还添加了对从macOS上运行的.NET进程捕获ELF转储的支持,由于ELF并不是macOS上的本机可执行文件(像 lldvb 这样本地调试器将不适用于这些转储)文件格式,因此我们将其设为可选功能,要在macOS上启用对转储收集的支持,请设置环境变量COMPlus_DbgEnableElfDumpOnMacOS=1 可以使用 dotnet dump analyze对生成的dump进行分析

Assembly load diagnostics added to event pipe

我们向事件管道添加了程序集加载信息,您可以将其视为Fusion Log Viewer的替代品,现在您可以使用 dotnet-trace 通过以下命令来收集此信息

Microsoft-Windows-DotNETRuntime:4:4 --process-id [process ID]

Printing environment information

随着.NET扩展了对新操作系统和芯片体系结构的支持,人们有时需要一种打印环境信息的方法,我们创建了一个简单的.NET工具成为dotnet-runtimeinfo.
您可以使用以下命令安装和运行该工具

dotnet tool install -g dotnet-runtimeinfo
dotnet-runtimeinfo

该工具为您的环境生成以下形式的输出

[rich@taumarunui ~]$ dotnet-runtimeinfo
.NET information
Version: 5.0.0
FrameworkDescription: .NET 5.0.0-preview.8.20407.11
Libraries version: 5.0.0-preview.8.20407.11
Libraries hash: bf456654f9a4f9a86c15d9d50095ff29cde5f0a4
**Environment information
OSDescription: Linux 5.8.3-2-MANJARO-ARM #1 SMP Sat Aug 22 21:00:07 CEST 2020
OSVersion: Unix 5.8.3.2
OSArchitecture: Arm64
ProcessorCount: 6
**CGroup info
cfs_quota_us: -1
memory.limit_in_bytes: 9223372036854771712
memory.usage_in_bytes: 2945581056

Library APIs

在.NET5.0中添加并改进了许多新的api,下面是一些重要的变化,需要注意。

Nullable Annotations

可空引用类型是c#8和.NET Core3.0的重要功能,他的发布充满了希望,但缺少详细的平台注释,以使其真正有用且使用,等待(大部分)结束了,现在该平台已为可控性添加了80%的注释,他们正在研究是否可以在发布.NET5.0 RTM之前注释剩余的20%如果没有,他们将在.NET6.0的早期完成其余的注释。

下图展示了他们这段时间内取得的进展。

这也意味着,当您将现有的.NET Core3.1代码重新定位到.NET 5.0时,可能会生成新的诊断(如果启用了可空性),如果发生这种情况,您可以感谢我们帮助您避免使用 null 

Regular expression performance improvements

我们对Regex引擎进行了重大的改进,在他们尝试过许多表达式中,这些改进通常会让吞吐量提高3-6倍,在某些情况下甚至更多,他们在System.Text.RegularExpressions 中所做的更改。经常的压力已经对他们自己的使用产生了可衡量的影响。他们希望这些改进也能在你的库和应用程序中带来可衡量的胜利

.NET 5.0 Target Framework

我们正在改变,.NET5.0目标框架的使用方法,下面的项目文件演示了新的.NET5.0目标框架

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net5.0</TargetFramework></PropertyGroup>
</Project>


到目前为止,新的.NET5.0表单比我们使用netcoreapp3.1样式更紧凑,更直观。此外他们正在将目标框架扩展为操作系统进行建模。他们希望通过.NET6.0中的Xamarin定位IOS和Android,从而推动这一变化。
Windows桌面API仅在面向net5.0-windows 时可用,您可以指定操作系统版本,例如 net5.0-windows7或 net5.0-windows10.17763 (October 2018 Update) ,如果要使用WinRT APIs.,则需要定位Windows10版本。
变动汇总:

  • net5.0 is the new Target Framework Moniker (TFM) for .NET 5.0.

  • net5.0 combines and replaces netcoreapp and netstandard TFMs.

  • net5.0 supports .NET Framework compatibility mode

  • net5.0-windows will be used to expose Windows-specific functionality, like Windows Forms and WPF.

  • .NET 6.0 will use the same approach, with net6.0 and will add net6.0-ios and net6.0-android.

  • The OS-specific TFMs can include OS version numbers, like net6.0-ios14.

  • Portable APIs, like ASP.NET Core and Xamarin.Forms, will be usable with net5.0.

WinRT Interop (Breaking Change)

我们已经移至一个新模型,作为.NET5.0的一部分,他支持WinRT API,这包括调用API(在任一方向上; CLR <==> WinRT),两个类型系统之间的数据封送处理以及旨在跨越边界被视为相同类型的统一(既“projected types”; IEnumerable<T> 和 IIterable<T> 是示例)
他们将以来WinRT团队在Windows中提供的一套新的WinRT工具,他将生成基于c#的WinRT互操作程序集

新的WinRT互操作系统有几个好处:

  • It can be developed and improved separate from the .NET runtime.

  • Symmetrical with interop systems provided for other OSes, like iOS and Android.

  • Can take advantage of many other .NET features (AOT, C# features, IL linking).

  • Simplifies the .NET runtime codebase.

现有的WinRT互操作系统已经作为.NET5.0的一部分,从.NET运行时(以及任何其他相关组件)中删除,这是一个突破性的变化,这将意味者使用WinRT和.NET Core3.x 应用程序需要重新构建,不能按照原样在.NET5上运行。

Runtime Technology

在.NET5.0中添加了许多新特性。下面介绍一小部分选择。

Windows ARM64

我们在这个版本中增加了对Windows ARM64的支持。我们已经做出了相对较晚的决定,推迟Windows桌面组件(Windows Forms, WPF)的发布。Windows窗体已接近就绪,但WPF还没有,而且我们不想只发布Windows桌面组件的一半,部分原因是我们没有在分割配置中测试它。我们希望在5.0服务更新中添加Windows桌面组件。
我们正在与一些ISV合作,他们希望其应用程序在Windows ARM64上可用。如果符合您的情况,请通过dotnet@microsoft.com与我们联系。我们希望尽快为您提供构建版本。

Event pipe profiler APIs

事件管道是在.NET Core 2.2中添加的新子系统和API,可以在任何操作系统上执行性能和其他诊断调查。在.NET 5.0中,事件管道已得到扩展,以使事件探查器能够写入事件管道事件。对于以前依靠ETW监视应用程序行为和性能的分析探查器,此方案至关重要。

Native exports

您现在可以将托管方法导出到本机代码。该功能的构建块是托管对UnmanagedCallersOnlyAttribute的API支持。

开发团队的Aaron Robinson一直在从事.NET Native Exports项目,该项目为将.NET组件作为本机库发布提供了更完整的体验。我们正在寻求有关此功能的反馈,以帮助决定是否在更高版本中将该方法包括在产品中。

有一些现有的项目可以实现类似的场景,例如:

  • Unmanaged Exports

  • DllExport

Application deployment

编写或更新应用程序后,您需要对其进行部署以供用户利用。在此版本中,我们专注于单个文件应用程序,并改进了.NET Core的ClickOnce。

Single file applications

单个文件应用程序作为单个文件发布和部署。该应用程序及其依赖项都包含在该文件中。当应用程序运行时,依赖项直接从该文件加载到内存中。这种方法不会降低性能。当与程序集修剪和提前编译结合使用时,单个文件应用程序将变得更小,启动速度更快。
在.NET 5.0中,单个文件应用程序主要集中在Linux上(稍后会详细介绍)。它们可以是框架相关的,也可以是独立的。依赖于全局安装的.NET运行时,依赖于框架的单个文件应用程序可能很小。自包含的单文件应用程序更大(由于带有运行时),但是不需要作为安装前步骤就安装.NET运行时,因此可以正常工作。通常,依赖框架对开发和企业环境有利,而对于ISV,独立包含通常是更好的选择。
我们使用.NET Core 3.1制作了一个单文件应用程序版本。它将二进制文件打包到一个文件中以进行部署,然后将这些文件解压缩到一个临时目录中以加载并执行它们。在某些情况下,这种方法可能会更好,但是我们希望我们为5.0构建的解决方案将是首选,并且会受到欢迎。
创建真正的单文件解决方案需要克服多个障碍。我们必须创建一个更复杂的应用程序捆绑器,教导运行时从二进制资源中加载程序集,并使调试器与内存映射的程序集兼容。我们还遇到了一些我们无法清除的障碍。

在所有平台上,我们都有一个名为“ apphost”的组件。这是成为可执行文件的文件,例如Windows上的 myapp.exe 或基于Unix平台上的 ./myapp 。对于单文件应用程序,我们创建了一个新主机,称为“超级主机”。它具有与常规apphost相同的角色,但还包含运行时的静态链接副本。超级主机是我们单文件方法的基本设计要点。此模型是我们在Linux上使用的模型。由于各种操作系统限制,我们无法在Windows或macOS上实现此方法。在Windows或macOS上没有超级主机。在这些操作系统上,本机运行时二进制文件(约3个)位于单个文件应用程序旁边。我们将在.NET 6.0中重新审视这种情况,但是,我们希望遇到的问题仍然具有挑战性。

您可以使用以下命令生成单文件应用程序。

  • Framework-dependent single-file app:

    • dotnet publish -r linux-x64 --self-contained false /p:PublishSingleFile=true

  • Self-contained single-file app with assembly trimming and ready to run enabled:

    • dotnet publish -r linux-x64 --self-contained true /p:PublishSingleFile=true /p:PublishTrimmed=true /p:PublishReadyToRun=true

您还可以使用项目文件配置单个文件发布。

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net5.0</TargetFramework><!-- Enable single file --><PublishSingleFile>true</PublishSingleFile><!-- Determine self-contained or framework-dependent --><SelfContained>true</SelfContained><!-- The OS and CPU type you are targeting --><RuntimeIdentifier>linux-x64</RuntimeIdentifier><!-- Enable use of assemby trimming - only supported for self-contained apps --><PublishTrimmed>true</PublishTrimmed><!-- Enable AOT compilation --><PublishReadyToRun>true</PublishReadyToRun></PropertyGroup>
</Project>

Notes:

  • Apps are OS and architecture-specific. You need to publish for each configuration (Linux x64, Linux ARM64, Windows x64, …).

  • Configuration files (like *.runtimeconfig.json) are included in the single file. You can place an additional config file beside the single file, if needed (possibly for testing).

  • .pdb files are not included in the single file by default. You can enable PDB embedding with the <DebugType>embed</DebugType> property.


我们在以前的预览文章中看到了很多评论,询问有关单个文件应用程序与提前(AOT)编译之间的关系。AOT是一个频谱。dotnet发布生成的现成代码(将 PublishReadyToRun 设置为true时)是AOT的示例。当您发布准备运行的映像时,该构建会提前为您生成机器代码,而不是在运行时由JIT生成。大多数人可能会将其作为AOT的定义。但是,许多人说AOT时的意思更具体。他们想要一种具有以下特征的解决方案:启动速度极快,不存在IL(出于大小和混淆的原因),(最多)JIT是可选的,并且二进制大小尽可能小。我们使用术语“本机AOT”来描述AOT频谱上的该点。.NET 5.0中提供的单个文件解决方案不满足AOT的这一定义。这是一大进步,但不是“本地AOT”。我们最近发布了有关本机AOT的调查,以获取有关该模式的更多反馈。我们正在仔细研究结果,并将其纳入我们的6.0计划工作中。

Reducing the size of container images


我们一直在寻找使.NET容器映像更小且更易于使用的机会。我们将SDK映像重新建立在ASP.NET映像之上,而不是buildpack-deps上,以显着减小您在多阶段构建方案中提取的聚合映像的大小

对于多阶段构建,此更改具有以下优势(Dockerfile中的示例用法)
Multi-stage build costs with Ubuntu 20.04 Focal:

Pull ImageBeforeAfter
sdk:5.0-focal268 MB232 MB
aspnet:5.0-focal64 MB10 KB (manifest only)

Net download savings: 100 MB (-30%)
Multi-stage build costs with Debian 10 Buster:

Pull ImageBeforeAfter
sdk:5.0280 MB218 MB
aspnet:5.084 MB4 KB (manifest only)

Net download savings: 146 MB (-40%)
See dotnet/dotnet-docker #1814 for more detailed information.


此更改有助于多阶段构建,其中目标的sdk和aspnet或运行时映像是同一版本(我们希望这是常见的情况)。进行此更改后,aspnet pull(例如)将变为无操作状态,因为您将通过初始sdk pull来拉伸aspnet层。
我们对Alpine和Nano Server进行了类似的更改。对于Alpine或Nano Server,没有 buildpack-deps 映像。但是,Alpine和Nano Server的sdk映像以前未在ASP.NET映像之上构建。我们解决了。对于多阶段构建,您将看到Alpine和Nano Server以及5.0的巨大成功。

ClickOnce Support


几个月前,我们宣布将为.NET Core提供ClickOnce支持。该项目仍在进行中。我们希望将其作为RC2的一部分提供。我只是想分享一下我们仍在从事此项目。

Closing

在发行版中,“关闭”是一个有趣的章节标题。该发布确实即将结束。该团队致力于解决所有剩余的5.0问题,并在发行版中获得最终的错误修复和改进。甚至5.0 Runtime Epics问题也已解决。
我们正在研究一些深入的帖子,我们计划在有关各种主题的最终版本发布之前发布这些帖子。注意那些。您还可以期望最终版本的发布时间更长,涵盖更广泛的改进和功能。
感谢您对本发行版的所有支持以及所做的所有贡献。

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

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

相关文章

7-1 页面置换算法--FIFO (50 分)(思路详解)

一:题目 先初始化页面大小&#xff0c;和物理块数。连续输入页面的逻辑地址&#xff0c;以“-1”作为结束标志&#xff0c;采用FIFO页面置换算法、固定分配局部置换分配策略。输出该页面的页号和页内位移&#xff0c;若该页不在内存&#xff0c;并且还有剩余的物理块&#xff…

7-2 页面置换算法--LRU (50 分)

一:题目(思路详解运行时错误解决) 先初始化页面大小&#xff0c;和物理块数。连续输入页面的逻辑地址&#xff0c;以“-1”作为结束标志&#xff0c;采用LRU页面置换算法、固定分配局部置换分配策略。输出该页面的页号和页内位移&#xff0c;若该页不在内存&#xff0c;并且还…

『软件测试3』八大典型的黑盒测试方法已来袭,快快接住!

文章目录一、等价类划分法1、定义2、等价类划分法步骤3、设计测试用例步骤4、案例&#xff1a;学生选修课程二、边界值分析法1、边界值分析法概述2、设计测试用例3、边界值设计原则三、错误推测法1、错误推测法概述2、错误推测法基本思想四、因果图设计法1、因果图设计法概述2、…

使用Jenkins来发布和代理.NetCore项目

Back toStudy!注&#xff1a;书接上文&#xff0c;上回《【CI/CD系列】使用Docker安装Jenkins》咱们说到了使用Docker镜像的方式&#xff0c;来建立Jenkins服务&#xff0c;用来持续集成和持续发布项目&#xff0c;但是上一篇文章有两个问题&#xff1a;01创建的容器不能操作和…

数据库课设(足球联赛管理系统)

一&#xff1a;前言 如果有关注博主的粉丝&#xff0c;可能会发现贴心杰又缺更好几天了&#xff0c;但是我是宠粉杰啊&#xff0c;怎么可能会忘了我的宝贝粉丝呢&#xff0c;只不过是临近期末&#xff0c;各种大作业课设如期而至&#xff0c;这几天我在写数据库课设&#xff0…

.NET Core实用技巧(一)如何将EF Core生成的SQL语句显示在控制台中

前言笔者最近在开发和维护一个.NET Core 项目&#xff0c;其中使用几个非常有意思的.NET Core 相关的扩展&#xff0c;在此总结整理一下。EF Core 性能调优如果你的项目中使用了 EF Core, 且正在处于性能调优阶段&#xff0c;那么了解 EF Core 生成的 SQL 语句是非常关键的。那…

695.岛屿的最大面积(026)BFS

二:思路 1.这里的遍历数据方式为BFS广度遍历 2.当我们遇到一个‘1’的时候,我们就遍历他的左右上下&#xff08;邻接点&#xff09;&#xff0c;如果是1那就入队&#xff0c;直到队列 为空为止。 3.我们记录每个岛屿的面积是采用 我们设置初始值为1&#xff0c;当每遇到一个邻…

『软件工程8』软件项目进度安排与跟踪,一招学会计算关键路径

项目进度安排与跟踪一、项目进度安排的定义及原则1、进度安排的定义2、进度安排的基本原则二、通信开销1、通信开销的定义2、通信路径计算3、案例分析三、工作量分配1、40-20-40规则2、工作量分配图例3、工作量分布推荐四、项目进度安排方法1、关键路径方法(CPM,Critical Path …

await,async 我要把它翻个底朝天,这回你总该明白了吧

一&#xff1a;背景1. 讲故事await&#xff0c;async 这玩意的知识点已经被人说的烂的不能再烂了&#xff0c;看似没什么好说的&#xff0c;但我发现有不少文章还是从理论上讲述了这两个语法糖的用法&#xff0c;懂得还是懂&#xff0c;不懂的看似懂了过几天又不懂了&#xff0…

栈在前端中的应用,顺便再了解下深拷贝和浅拷贝!

详解栈在前端中的应用一、栈是什么二、栈的应用场景三、前端与栈&#xff1a;深拷贝与浅拷贝1、JS数据类型&#xff08;1&#xff09;js数据类型的分类&#xff08;2&#xff09;js数据类型的定义和存储方式&#xff08;3&#xff09;js数据类型的判断方式2、深究浅拷贝和深拷贝…

计网课设 模拟实验拓扑

一:前言 幸福的是考完两科了&#xff0c;抽出时间赶紧赶赶课设&#xff0c;两周遇到了好多事&#xff0c;开心的&#xff0c;烦心的&#xff0c;一堆堆的压过来&#xff0c;但庆幸自己迷失不太久&#xff0c;又能继续学习了 二&#xff1a;实验概览 1:实验拓扑图 2:实验要求…

快醒醒,C# 9 中又来了一堆关键词 init,record,with

一&#xff1a;背景1. 讲故事.NET5 终于在 2020-08-25 也就是前天发布了第八个预览版&#xff0c;这么多的预览版搞得我都麻木了&#xff0c;接踵而来的就是更多的新特性加入到了 C# 9 中&#xff0c;既然还想呆在这条船上&#xff0c;得继续硬着头皮学习哈&#xff0c;这一篇跟…

7-1 字母统计图 (10 分)(思路+详解)

一&#xff1a;题目 摆放在面前的是一小段英文文章。 afeng希望你能帮他统计一下每个小写字母出现的次数。 最后再以柱状图的形式(参照输出样例)输出出来。 输入格式: 输入第一行为一个正整数N(N<100)&#xff0c;表示文章的行数。 随后为N行文本。 输出格式: 由若干行组…

了解js基础知识中的作用域和闭包以及闭包的一些应用场景,浅析函数柯里化

js基础知识中的作用域和闭包一、作用域1、作用域、自由变量简介&#xff08;1&#xff09;作用域定义&#xff08;2&#xff09;作用域实例演示&#xff08;3&#xff09;自由变量定义&#xff08;4&#xff09;自由变量实例演示2、作用域链简介&#xff08;1&#xff09;作用域…

张朝阳一天只睡4小时?不知道,反正我每天都睡足7小时

这是头哥侃码的第213篇原创周末&#xff0c;一个很久没联系过的朋友突然在微信上发给我一个链接。我打开一看&#xff0c;原来是搜狐老板张朝阳近日发表的一个有关睡眠的神论&#xff0c;大致是说他每天只睡四小时&#xff0c;白天状态还特别好&#xff0c;每天员工到公司的时候…

Istio 1.7——进击的追风少年

2020 年 8 月 21 日&#xff0c;Istio 发布了 1.7 版本。除了介绍新版本的主要更新内容外&#xff0c;本文会重点分析 Istio 团队在产品更新策略上的激进态度和举措。是稳扎稳打做好向后兼容&#xff0c;带给用户所承诺的易用性&#xff1b;还是快刀斩乱麻&#xff0c;做进击的…

7-2 港口审查 (15 分)

一:题目 afeng是一个港口的海关工作人员&#xff0c;每天都有许多船只到达港口&#xff0c;船上通常有很多来自不同国家的乘客。 afeng对这些到达港口的船只非常感兴趣&#xff0c;他按照时间记录下了到达港口的每一艘船只情况&#xff1b;对于第i艘到达的船&#xff0c;他记…

【BCVP更新】StackExchange.Redis 的异步开发方式

有哪些习惯坚持LESS IS MORE,SIMPLER IS BETTER THAN MORE你一定会有很大的收获各种小问题&#xff1f;如果你之前用过Redis的话&#xff0c;肯定会使用过StackExchange.Redis&#xff0c;我之前很久就用过&#xff0c;在.netfw的时候&#xff0c;当时并发还比较小&#xff0c;…

map容器实现一对多

一&#xff1a;需求描述 我们希望一个数字或则其他字符串可以对应 一串数&#xff0c; #include<iostream> #include<map> #include<vector> using namespace std; int main(){map<int,vector<int> > m;map<int,vector<int> >:: i…

解决异步问题,教你如何写出优雅的promise和async/await,告别callback回调地狱!

解决异步问题——promise、async/await一、单线程和异步1、单线程是什么2、为什么需要异步3、使用异步的场景二、promise1、promise的三种状态2、三种状态的表现和变化&#xff08;1&#xff09;状态的变化&#xff08;2&#xff09;状态的表现3、then和catch对状态的影响&…