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

【C#跨平台开发详解】C#跨平台开发技术之.NET Core基础学习及快速入门

1. C#与.NET的发展历程

C#是由Microsoft开发的现代编程语言,最初伴随着.NET
Framework发布。随着技术的进步,特别是针对跨平台开发的需求,Microsoft推出了.NET
Core,这是一个开源且跨平台的框架,支持Windows、macOS和Linux。

  • 2002年:C# 1.0 发布,仅限于Windows。
  • 2016年:.NET Core 1.0 发布,开启了C#跨平台开发的新时代。
  • 2020年:.NET 5 发布,整合了.NET
     Framework和.NET
     Core。
  • 2021年:.NET 6 发布,进一步提升跨平台能力。
  • 2022年:.NET 7 发布,持续优化性能与功能。

2. .NET Core:跨平台的基础

.NET Core(现称为.NET
5及以后的版本)是实现C#跨平台的核心技术。它是开源的,具备高性能和模块化的特点。

主要特点:

  • 跨平台:支持在多个操作系统上运行,包含Windows、macOS和Linux。
  • 开源:完全开源,依赖社区的支持和贡献。
  • 高性能:在运行时和内存管理方面进行了优化。
  • 模块化:通过NuGet包管理,轻松引用所需库。
  • 容器支持:适合微服务架构,易于部署。

架构图

40418f820b974388a4aa68adfabf8503.png 

3. C# 跨平台的实现原理

C# 的跨平台能力主要依赖于 .NET 框架,特别是 .NET Core(现已成为统一的 .NET 平台,如 .NET 5、.NET 6 和 .NET 7 等版本)。C# 跨平台实现的核心是通过 中间语言(Intermediate Language, IL)公共语言运行时(Common Language Runtime, CLR)JIT 编译器(Just-In-Time Compiler) 以及 .NET 平台上的各种库和工具实现的。

以下是 C# 实现跨平台开发的核心原理和机制:

1. 编译为中间语言(IL)

C# 源代码首先经过编译器(如 Roslyn)编译为 中间语言(IL),也称为 CIL(Common Intermediate Language)MSIL(Microsoft Intermediate Language)

中间语言的关键特性:

  • 平台无关:IL 是一种平台无关的二进制代码,这意味着它可以在任何支持 .NET 运行时的操作系统上执行(Windows、macOS、Linux 等)。
  • 可移植性:IL 使得编写的 C# 程序在不同的操作系统上具有一致的行为,因为它不是直接的机器码,而是高层次的字节码。

编译过程

编译 C# 代码到 IL 的过程如下:

  1. C# 源代码经过 Roslyn 编译器,生成 IL。
  2. IL 存储在 .dll 或 .exe 文件中。

例如:

public class Program
{public static void Main(){Console.WriteLine("Hello, World!");}
}

 编译后的 IL:

.method public static void Main() cil managed
{.entrypointIL_0000: ldstr "Hello, World!"IL_0005: call void [mscorlib]System.Console::WriteLine(string)IL_000a: ret
}

2. 公共语言运行时(CLR)

公共语言运行时(CLR) 是 .NET 平台中的核心组件,它负责执行 IL 代码,并管理程序的内存、线程、安全性和其他运行时服务。

主要功能:

  • 内存管理和垃圾回收:CLR 自动管理内存分配,并在对象不再使用时自动释放内存。
  • 类型安全性:CLR 运行时检查类型和内存访问,确保类型安全。
  • 异常处理:提供一致的异常处理机制,跨平台应用中一致处理错误。
  • 安全性:通过代码访问安全(CAS)等机制,提供应用程序安全性保障。

CLR 的实现是跨平台的,例如在 Windows 上使用 .NET Framework CLR,在 Linux 和 macOS 上使用 CoreCLR(用于 .NET Core)。这些不同平台上的运行时在实现细节上有差异,但都能执行 IL 代码,确保程序的行为一致。

3. JIT 编译器(即时编译器)

当 IL 代码运行时,.NET 的 JIT 编译器(Just-In-Time Compiler) 将 IL 编译为目标平台的机器码,这一步使得同一个 IL 在不同平台上能够正常执行。

JIT 的工作机制:

  1. 启动时加载 IL:当应用程序启动时,CLR 会加载并解析 IL 代码。
  2. 即时编译:在方法首次被调用时,JIT 编译器会将该方法的 IL 转换为目标平台的机器码。
  3. 执行机器码:编译后的机器码保存在内存中,以备后续使用。如果该方法被多次调用,不需要重新编译。

JIT 编译的优点

  • 平台独立性:JIT 编译使得相同的 IL 可以运行在不同的硬件和操作系统上。
  • 性能优化:JIT 编译时可以针对具体平台进行优化,保证良好的性能。

4. Ahead-of-Time(AOT)编译

在某些场景下,例如移动应用或高性能应用,.NET 支持 Ahead-of-Time(AOT)编译。AOT 编译在发布阶段将 IL 提前编译为目标平台的机器码,而不是在运行时编译,从而减少启动时间并提高执行效率。

典型使用场景

  • Blazor WebAssembly:在这种技术中,C# 代码被提前编译为 WebAssembly,而不是在客户端通过 JIT 编译,这样可以在浏览器中直接运行。
  • Xamarin:在跨平台移动开发中,AOT 编译可以让 C# 代码直接在 iOS 或 Android 设备上运行。

5. 跨平台运行时(CoreCLR 和 Mono)

.NET 提供了多个实现,帮助 C# 代码在不同平台上运行:

CoreCLR

  • .NET Core 和 .NET 5+ 的主要运行时。
  • 高度优化,专门为服务器和桌面环境设计。
  • 提供跨平台支持,运行在 Windows、Linux 和 macOS 上。

Mono

  • Mono 是 .NET 的早期跨平台实现,特别是在移动和嵌入式设备上非常流行。
  • 通过 Mono,可以在 Android 和 iOS 等移动操作系统上运行 C# 应用程序。
  • Xamarin 平台就是基于 Mono 构建的,提供了移动应用跨平台开发的能力。

6. BCL(基础类库)

C# 能够跨平台的重要部分还依赖于 基础类库(Base Class Library, BCL)。BCL 是.NET
提供的一组类库,提供了一致的 API,帮助开发者实现常见的功能,例如文件操作、网络通信、数据结构等。

跨平台的 BCL:

.NET 的 BCL 被设计为跨平台使用,开发者可以编写依赖于标准库的代码,无需考虑操作系统的差异。

例如,文件读写代码:

using System.IO;class Program
{static void Main(){string text = File.ReadAllText("/path/to/file.txt");Console.WriteLine(text);}
}

这种代码可以在 Windows、Linux 和 macOS 上无差别地运行,.NET 会处理底层的文件系统差异。

7. 条件编译和平台特性处理

尽管 BCL 是跨平台的,但有时开发者仍然需要处理一些平台特定的功能。这时可以使用 条件编译依赖注入 的方式,根据不同的操作系统提供不同的实现。

条件编译:

通过 #if 预处理指令,可以根据不同平台编译不同的代码。

#if WINDOWSConsole.WriteLine("Running on Windows");
#elif LINUXConsole.WriteLine("Running on Linux");
#elif OSXConsole.WriteLine("Running on macOS");
#endif

依赖注入:

使用依赖注入模式,动态注入不同平台的实现。

public interface IPlatformService
{void PlatformSpecificOperation();
}public class WindowsService : IPlatformService
{public void PlatformSpecificOperation(){Console.WriteLine("Windows specific operation");}
}public class LinuxService : IPlatformService
{public void PlatformSpecificOperation(){Console.WriteLine("Linux specific operation");}
}// 在启动时根据平台注册服务
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{services.AddSingleton<IPlatformService, WindowsService>();
}
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{services.AddSingleton<IPlatformService, LinuxService>();
}

 

8. 跨平台构建工具和命令行工具

.NET 提供了强大的命令行工具 dotnet CLI,支持在不同平台上进行应用的创建、编译和部署。

# 创建新的控制台应用
dotnet new console -n MyApp# 进入项目目录
cd MyApp# 编译应用
dotnet build# 运行应用
dotnet run

这些命令可以在 Windows、Linux 和 macOS 上执行,确保了开发体验的一致性。

4. 跨平台框架和库

        C#的跨平台框架和库使得开发者能够构建可以在多种操作系统上运行的应用程序。 以下将详细讲解几个重要的跨平台框架和库,以.NET6.0版本为基础提供示例代码以展示它们的使用。

a) 
 ASP.NET Core


  ASP.NET Core是用于构建现代云应用的开源框架。它支持构建Web应用、Web API和微服务,允许开发者使用C#在多种平台上运行应用。

特点

  • 跨平台:可以在Windows、macOS和Linux上运行。
  • 高性能:ASP.NET Core在处理请求时性能表现非常优越。
  • 模块化:支持NuGet包管理,开发者可以根据需要来引入库。
  • 依赖注入:内置的依赖注入支持使得代码更加清晰且易于测试。

示例


 以下是一个简单的ASP.NET Core Web API的示例:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;var builder = WebApplication.CreateBuilder(args);// 添加服务
builder.Services.AddControllers();var app = builder.Build();// 配置HTTP请求管道
if (app.Environment.IsDevelopment())
{app.UseDeveloperExceptionPage();
}app.UseRouting();
app.UseAuthorization();app.MapControllers();app.Run();

 路由控制器示例

using Microsoft.AspNetCore.Mvc;[ApiController]
[Route("api/[controller]")]
public class HelloWorldController : ControllerBase
{[HttpGet]public IActionResult Get(){return Ok("Hello, World!");}
}

b) .NET MAUI

.NET MAUI(Multi-platform App UI)是用于构建跨平台桌面和移动应用的框架,支持Android、iOS、Windows和macOS。它是Xamarin.Forms的演进。

特点

  • 单一项目结构:一个项目可以构建多个平台的应用。
  • 共享代码:可以共享UI和业务逻辑代码。
  • 原生性能:使用原生控件提供性能和用户体验。

示例


以下是一个使用.NET MAUI构建简单应用的示例:

using Microsoft.Maui.Controls;namespace HelloWorldMAUI
{public class App : Application{public App(){MainPage = new ContentPage{Content = new StackLayout{Children ={new Label { Text = "Hello, .NET MAUI!" },new Button{Text = "Click Me",Command = new Command(() => {// 点击事件Application.Current.MainPage.DisplayAlert("Alert", "Button clicked!", "OK");})}}}};}}
}

c) Blazor

概述

Blazor是一个用于构建交互式Web应用的框架,支持C#和HTML。Blazor有两种模式:Blazor Server和Blazor WebAssembly(WASM)。

特点

  • 组件化:使用组件构建应用,提升复用性。
  • C#作为唯一语言:前端和后端均可使用C#开发。
  • 支持WebAssembly:可以直接在浏览器中运行C#代码。

示例

以下是一个简单的Blazor组件示例:

@page "/counter"<h3>Counter</h3><p>Current count: @currentCount</p><button class="btn btn-primary" @onclick="IncrementCount">Increment</button>@code {private int currentCount = 0;private void IncrementCount(){currentCount++;}
}

d)  Unity

概述

Unity是一个跨平台游戏引擎,使用C#作为主要编程语言。它支持从2D到3D的各种游戏开发,能够在多个平台上发布游戏。

特点

  • 强大的图形引擎:支持高质量的图形和物理渲染。
  • 广泛的平台支持:可以发布到PC、移动设备、主机等多种平台。
  • 丰富的生态系统:拥有大量的插件和资产。

示例

以下是一个简单的Unity脚本示例,用于在游戏中输出“Hello, World!”:

using UnityEngine;public class HelloWorld : MonoBehaviour
{void Start(){Debug.Log("Hello, World!");}
}

e)Avalonia

概述

Avalonia是一个用于构建跨平台桌面应用的UI框架,支持Windows、macOS和Linux。

特点

  • XAML支持:使用XAML定义UI,使得开发更加直观。
  • MVVM支持:支持MVVM设计模式,方便应用结构的组织。
  • 高性能:针对不同平台进行了优化。

示例

以下是一个简单的Avalonia应用示例:

<Application xmlns="https://github.com/avaloniaui"><Application.Styles><FluentTheme /></Application.Styles><Window Title="Hello Avalonia" Width="400" Height="200"><StackPanel><TextBlock Text="Hello, Avalonia!" Margin="10" /><Button Content="Click Me" Margin="10" Click="OnButtonClick" /></StackPanel></Window>
</Application>

 

using Avalonia.Controls;public class MainWindow : Window
{public MainWindow(){InitializeComponent();}private void OnButtonClick(object sender, RoutedEventArgs e){MessageBox.Show(this, "Button clicked!", "Notification", MessageBox.MessageBoxButtons.Ok);}
}

 

5. 跨平台开发工具和环境

a) Visual Studio

  • 平台:支持Windows和macOS。
  • 功能:提供完整的开发、调试和部署功能。

b) Visual Studio Code + C#插件

  • 平台:跨平台的轻量级编辑器。
  • 功能:通过插件支持C#开发,包括智能感知和调试。

c) JetBrains Rider

  • 平台:跨平台的IDE,专为.NET开发设计。

d) 命令行工具

  • dotnet CLI:跨平台的命令行工具,用于创建、编译和运行应用。

 

6.性能优化

为确保C#跨平台应用的性能,开发者可以进行以下优化:

a) AOT编译

预编译(Ahead-of-Time)可以提高启动性能,特别是移动和桌面应用。

b) 性能分析工具

使用dotnet-trace和PerfView等工具进行性能分析,确保应用运行高效。

c) SIMD优化

利用单指令多数据(SIMD)指令集进行性能优化。

using System.Numerics;public static void VectorAdd(float[] a, float[] b, float[] result)
{int i = 0;int vectorSize = Vector<float>.Count;int limit = a.Length - (a.Length % vectorSize);for (; i < limit; i += vectorSize){var va = new Vector<float>(a, i);var vb = new Vector<float>(b, i);(va + vb).CopyTo(result, i);}for (; i < a.Length; i++){result[i] = a[i] + b[i];}
}

 

7. 部署和分发

跨平台C#应用的部署和分发主要有以下几种方式:

a) 框架依赖部署

依赖目标机器上已安装的.NET运行时。

b) 自包含部署

将运行时和应用打包在一起,无需目标机器预装.NET

dotnet publish -c Release -r win-x64 --self-contained true
dotnet publish -c Release -r osx-x64 --self-contained true
dotnet publish -c Release -r linux-x64 --self-contained true

 

c) Docker容器化

将应用打包为Docker容器,便于在不同环境中部署。

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["MyApp.csproj", "./"]
RUN dotnet restore "MyApp.csproj"
COPY . .
RUN dotnet build "MyApp.csproj" -c Release -o /app/buildFROM build AS publish
RUN dotnet publish "MyApp.csproj" -c Release -o /app/publishFROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MyApp.dll"]

8.未来展望

C#的跨平台技术仍在不断发展,未来可能的发展方向包括:

  • 性能提升:进一步缩小与原生应用的差距。
  • 云原生集成:强化与云服务的结合。
  • UI开发体验改善:优化跨平台UI开发的工具和框架。
  • 新兴平台支持:拓展到WebAssembly等新兴技术。

结论

        C#的跨平台技术为开发者提供了强大的工具,使他们能够用一种语言开发各种类型的应用并部署到多个平台。
通过.NET Core(
现.NET 5+)、多个跨平台框架和工具,C#实现了真正的“一次编写,到处运行”。虽然在处理平台特定功能和优化性能方面仍有挑战,但C#的跨平台能力正在不断提升,为开发者提供更大的灵活性和效率。

 

 

相关文章:

【C#跨平台开发详解】C#跨平台开发技术之.NET Core基础学习及快速入门

1. C#与.NET的发展历程 C#是由Microsoft开发的现代编程语言&#xff0c;最初伴随着.NET Framework发布。随着技术的进步&#xff0c;特别是针对跨平台开发的需求&#xff0c;Microsoft推出了.NET Core&#xff0c;这是一个开源且跨平台的框架&#xff0c;支持Windows、macOS和…...

请解释Java中的死锁产生的原因和解决方法。什么是Java中的并发工具类?请列举几个并解释其用途。

请解释Java中的死锁产生的原因和解决方法。 Java中的死锁是指两个或两个以上的线程在执行过程中&#xff0c;因为争夺资源而造成的一种相互等待的现象&#xff0c;若无外力作用&#xff0c;这些线程都将无法向前推进。死锁是并发编程中常见的问题&#xff0c;它会导致程序运行…...

三分钟带你看懂,低代码开发赋能办公方式转变

随着技术的不断进步&#xff0c;企业对办公效率和灵活性的需求日益增长。低代码开发作为一种新兴的开发模式&#xff0c;正在改变传统的办公方式&#xff0c;让非技术背景的业务人员也能参与到应用的创建和维护中来。本文将带你快速了解低代码开发如何赋能办公方式的转变。 什么…...

视频剪辑软件哪个好用?11款软件轻松上手,让创意视频流畅呈现!

视频剪辑已经涉及到很多个领域&#xff0c;视频剪辑软件的需求也是越来越普遍了。很多朋友在日常办公学习中&#xff0c;经常会遇到视频剪辑的问题。借助专业的视频剪辑软件&#xff0c;我们可以快速的对视频进行剪辑&#xff0c;制作出属于自己的作品。 市面上有各种各样的视频…...

pytest二次开发:生成用例参数

pytest.fixture是一个装饰器&#xff0c;用于声明一个fixture。Fixture是pytest中的一个核心概念&#xff0c;它提供了一种将测试前的准备代码&#xff08;如设置测试环境、准备测试数据等&#xff09;和测试后的清理代码&#xff08;如恢复测试环境、删除临时文件等&#xff0…...

想抹黑华为的 请换一种方式

文&#xff5c;琥珀食酒社 作者 | 积溪 咱能不能有点创意&#xff1f; 能不能换个方式&#xff1f; 之前我说预测过 我说华为的三折叠手机 MateXT非凡大师发布 会引来一大波华为黑 还真是被我说中了 华为MateXT刚曝光 就被黄牛炒到10多万 有人说华为要割韭菜 是电子…...

学习学习学习

​ 1. 面试算法 算法题空间限制64MB 2x 10^7 int codetop.cc 数字中文读 &#x1f517; kmp 奶牛生小牛问题 丑数LCR 168. 丑数 - 力扣&#xff08;LeetCode&#xff09; 166. 分数到小数 - 力扣&#xff08;LeetCode&#xff09; 小数循环节 深入解析力扣166题&#xff…...

requestAnimationFrame原理和使用

requestAnimationFrame 是一个用于在浏览器中实现高效动画的方法。它告诉浏览器你希望执行一个动画&#xff0c;并在下一次重绘之前调用指定的回调函数来更新动画。浏览器会自动优化动画的刷新频率&#xff0c;以确保动画的流畅性和性能。 原理 帧刷新&#xff1a;浏览器通常…...

线程的状态(java)

“苦&#xff1f; 何止是苦~~~~~” 本期内容来分享一下线程状态相关的知识哦&#xff01;&#xff01;&#xff01; 对于进程来说&#xff0c;进程是有两种状态的。 一种是就绪状态&#xff1a;正在CPU上执行&#xff0c;或者随时可以去CPU上执行的。 另一种是阻塞状态&…...

Linux IO模型:IO多路复用

● 应用程序中同时处理多路输入输出流&#xff0c;若采用阻塞模式&#xff0c;得不到预期的目的&#xff1b; ● 若采用非阻塞模式&#xff0c;对多个输入进行轮询&#xff0c;但又太浪费CPU时间&#xff1b; ● 若设置多个进程/线程&#xff0c;分别处理一条数据通路&#xff…...

[数据集][目标检测]电梯内广告牌电动车检测数据集VOC+YOLO格式2787张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2787 标注数量(xml文件个数)&#xff1a;2787 标注数量(txt文件个数)&#xff1a;2787 标注…...

MATLAB下载详细教程及下载链接

欢迎大家进评论区交流经验 1. 准备工作 下载MATLAB安装包&#xff1a;首先&#xff0c;从MathWorks官方网站&#xff08;http://www.mathworks.com&#xff09;下载适合您操作系统的MATLAB安装包。确保选择与您的操作系统&#xff08;如Windows、macOS或Linux&#xff09;兼容的…...

利用发电量和气象数据分析来判断光伏仿真系统的准确性

随着光伏产业的迅速发展&#xff0c;光伏仿真系统通过集成气象数据分析、发电量分析、投融资分析及损耗估算等功能&#xff0c;为光伏项目的全生命周期管理提供了科学依据。 光伏仿真系统集成了气象数据分析、发电量预测、投融资分析、损耗估算及光伏设计等功能。其中&#xf…...

Model-based RL动态规划(基于价值、基于策略,泛化迭代)

白盒环境和黑盒环境 白盒环境&#xff1a;知道环境的状态转移函数P(s’|s)或P(s’|s,a)和奖励函数R(s)或R(s,a)&#xff1a;   白盒环境下的学习相当于直接给出了有监督学习的数据分布&#xff08;就是有了目标靶子&#xff09;&#xff0c;不需要采样了&#xff0c;直接最小…...

外接串口板,通过串口打开adb模式

一、依赖库 import subprocess import serial from serial.tools import list_ports import logging import time 二、代码 import subprocessimport serial from serial.tools import list_ports import logging import timedef openAdb(com):# com []# for i in list_por…...

ssm微信小程序校园失物招领论文源码调试讲解

第二章 开发技术与环境配置 以Java语言为开发工具&#xff0c;利用了当前先进的SSM框架&#xff0c;以MyEclipse10为系统开发工具&#xff0c;MySQL为后台数据库&#xff0c;开发的一个微信小程序校园失物招领。 2.1 Java语言简介 Java是由SUN公司推出&#xff0c;该公司于20…...

iOS 15推出后利用邮件打开率的7种方法

自从苹果在2021年底推出iOS 15以来&#xff0c;邮件打开率就一直是一个让人头疼的指标。 Klaviyo市场情报主管Mindy Regnell表示&#xff1a;“对于启用了Apple邮件隐私保护&#xff08;MPP&#xff09;的用户来说&#xff0c;苹果会打开这些邮件并预先下载内容到他们的服务器…...

以太网--TCP/IP协议(一)

概述 以太网是局域网的一种&#xff0c;其他的比如还有令牌环、FDDI。和局域网对应的就是广域网&#xff0c;如Internet&#xff0c;城域网等。 从网络层次看&#xff0c;局域网协议主要偏重于低层&#xff08;业内一般把物理层、数据链路层归为低层&#xff09;。以太网协议…...

LeetCode刷题:找到第K大的元素

本题其实就是考察排序算法&#xff0c;为了减低时间复杂度&#xff0c;所以采用堆排序 import java.security.Key; import java.util.Scanner;public class FindKtopElements {public static void main(String[] args) {Scanner scanner new Scanner(System.in);String lin…...

HTML页面配置高德地图,获取位置

HTML页面配置高德地图&#xff0c;获取位置 一、使用情况 1、之前项目用的前后端分离框架&#xff0c;所以用Vue接入的高德地图&#xff0c;自动搜索补全&#xff0c;是请求的后台返回的数据。 2、现在用单体项目&#xff0c;前端是Bootstrap&#xff0c;需要接高德地图&…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...