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

news2024/12/23 8:07:04

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
{
    .entrypoint
    IL_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 WINDOWS
    Console.WriteLine("Running on Windows");
#elif LINUX
    Console.WriteLine("Running on Linux");
#elif OSX
    Console.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 80

FROM 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/build

FROM build AS publish
RUN dotnet publish "MyApp.csproj" -c Release -o /app/publish

FROM 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#的跨平台能力正在不断提升,为开发者提供更大的灵活性和效率。

 

 

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

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

相关文章

微信小程序手写签名

微信小程序手写签名组件 该组件基于signature_pad封装&#xff0c;signature_pad本身是web端的插件&#xff0c;此处将插件代码修改为小程序端可用。 signature_pad.js /*!* Signature Pad v5.0.3 | https://github.com/szimek/signature_pad* (c) 2024 Szymon Nowak | Releas…

Windows10 安全加固之禁止光驱、U盘等自动播放

在使用Windows10系统的电脑中插入插入光盘或者U盘时,默认是自动播放的,这样会引入一些可能不安全的因素。因此,为了系统安全,有必要禁止光驱、U盘等自动播放。具体方法如下: 方法一:通过设置页面关闭 第1步:单击win10系统的“开始”菜单->“设置”,打开“windows设…

算法:区间dp

文章目录 一、适用场景二、基本思路步骤时间复杂度&#xff1a; 三、例题 区间动态规划&#xff08;Interval DP&#xff09;是一种用于解决某些需要处理区间或子段问题的动态规划方法&#xff0c;特别适合于问题的解可以通过子区间的解进行组合的情况。该方法的核心思想是在子…

pico手柄和人物模型手部旋转同步,实现手柄控制手臂手部位置移动、手部旋转和手指的操作了

这里的主要内容就是下述代码&#xff1b; // 获取左手控制器的旋转&#xff08;四元数表示&#xff09;Quaternion aRotationQuaternion leftHandController.rotation;// 计算旋转差值&#xff08;四元数表示&#xff09;Quaternion rotationDifference Quaternion.Euler(0, …

Qt创建项目及相关问题

文章目录 1. Qt项目创建2. 认识项目代码main.cppwidget.hwidget.cppwidget.ui.pro构建过程生成的中间文件 3. Hello World程序图形化方式创建代码方式创建内存泄漏问题编辑框方式创建按钮方式创建 4. 对象树引入对象树原因对象树自动释放对象实验演示 5. 乱码问题 1. Qt项目创建…

Databend 产品月报(2024年8月)

很高兴为您带来 Databend 2024 年 8 月的最新更新、新功能和改进&#xff01;我们希望这些增强功能对您有所帮助&#xff0c;并期待您的反馈。 Kafka Connect Sink Connector 插件 我们推出了一种将 Kafka 连接到 Databend 的新方式&#xff1a;databend-kafka-connect&#…

2023Idea版本无法下载通义灵码插件以及无法登录问题

进入下载插件处 在插件主页安装时&#xff0c;通常会根据当前自己访问的IDEA版本推荐合适的插件版本&#xff0c;所以最终会安装成功 idea中通义灵码插件无法登录问题

书客、松下、飞利浦护眼台灯怎么样?测评寻找护眼台灯天花板!

大家好&#xff0c;我是专注在护眼领域的一名评测师&#xff0c;长期以来&#xff0c;我致力于探索并体验各类能保护视力健康的护眼产品。今天&#xff0c;我来和大家分享我对护眼台灯的深入评测。护眼台灯作为日常学习生活的一部分&#xff0c;视觉体验的好坏往往取决于所选用…

Pygame中获取鼠标按键状态的方法

在《Pygame中获取鼠标位置的方法》中提到&#xff0c;可以通过鼠标事件和mouse模块中的函数获取鼠标位置&#xff0c;这两种方法同样适用于获取鼠标按键状态。 1 通过鼠标点击事件获取鼠标按键状态 通过鼠标点击事件获取鼠标按键状态的代码如图1所示。 图1 鼠标点击事件获取鼠…

HRGraph: 利用大型语言模型(LLMs)构建基于信息传播的HR数据知识图谱与职位推荐

知识图谱&#xff08;KGs&#xff09;作为语义网络&#xff0c;在管理不同领域复杂互联数据方面表现出极高的有效性&#xff0c;通过提供统一、上下文化和结构化的表示&#xff0c;具有灵活性&#xff0c;能够轻松适应不断发展的知识。在处理复杂的人力资源&#xff08;HR&…

RP2040 C SDK RTC功能使用

RP2040 C SDK RTC功能使用 &#x1f4cd;《RP2040 C SDK串口功能使用》&#x1f955;RP2040 RTC API官方文档说明&#xff1a;https://www.raspberrypi.com/documentation/pico-sdk/hardware.html#group_hardware_rtc&#x1f955;官方例程参考&#xff1a;https://github.com/…

su root 提示 Permission denied

今天在某机器上新建了一个test账号&#xff0c;然后使用su root时&#xff0c;居然提示我没有权限&#xff0c;具体如下所示&#xff1a; [testlocalhost ~]$ su root Password: su: Permission denied [testlocalhost ~]$我确定密码是对的&#xff0c;试了好几次&#xff0c;…

彻底解决 node/npm, Electron下载失败相关问题, 从底层源码详解node electron 加速配置

最近玩了一下electron项目, 总是会遇到electron的下载失败问题, 于是看了一下node源码, 做一个记录. node/npm 加速配置 这个配置通过设置node配置里面的registry 这个配置项来完成加速. 配置方法 npm config set registry https://registry.npmmirror.com上面的命令就是将当…

day42-测试平台搭建之前端vue学习-基础1

一、Vue是什么 1.1.一套用于构建用户界面的渐进式JavaScript框架 1.2.渐进式 Vue可以自底向上逐层的应用 1).简单应用&#xff1a;只需一个轻量小巧的核心库 2).复杂应用&#xff1a;可以引ll入各式各样的Vue插件 二、Vue特点 2.1.采用组件化模式&#xff0c;提高代码复用率、…

翻译论文的关键部分 | Parallel Tiled QR Factorization for Multicore Architectures

SSRFB DTSQT2 DLARFB DGEQT2 1, 对角子矩阵分解 DGEQT2 这个例程被开发出来&#xff0c;用于针对对角Tile子矩阵&#xff1a; &#xff0c;执行不分块的QR分解。 这个运算产生&#xff1a; 一个上三角矩阵 一个酉下三角矩阵&#xff0c;这个矩阵包含 b 个 Householder 反光面…

跨平台打印模板转化pdf源码--SAAS本地化及未来之窗行业应用跨平台架构

一、跨平台打印转pdf渲染 pdf渲染模式可以支持国产化系统&#xff0c;和手机系统&#xff0c;安卓&#xff0c;苹果系统&#xff0c;qq浏览器&#xff0c;火狐&#xff0c;谷歌刘安祺 二、代码 /* ///cyberwin_offline_database_printtemp.js未来之窗打印模板解析技术 2024-…

maven的作用

一.什么是maven&#xff1f; maven是apache旗下的一个开源项目,是一款用于管理和构建java项目的工具。 关于Apache软件基金会,是目前世界最大的最受欢迎。 二.Maven的作用&#xff1f; 1.依赖管理 方便快捷的管理项目依赖的资源(jar包),避免版本冲突问题。 配置文件(pom.x…

Android UID 和 userID 以及 appID

我们知道Android 操作系统是基于Linux内核的&#xff0c;所以Android 的UID 是基于 Linux UID的。 Linux UID Linux 本身就是一个多用户操作系统&#xff0c;每一个用户都会有一个UID&#xff0c;不同UID 之间的资源访问是受限的。 其中&#xff0c;Linux的DAC权限模型&#…

mysql笔记2(安装配置与连接)

文章目录 1. 社区版两种安装包2. mysql是一个典型的C/S架构的软件3. 编写mysql代码的三个位置① cmd② mysql软件客户端③ 第三方软件Hyper 4. 常见的关系型数据库① myql② sql server③ oracle 5. 连接mysql① 为什么要连&#xff1f;② cmd里怎么连&#xff1f; 6. 清屏与退…

直线上最多的点数

优质博文&#xff1a;IT-BLOG-CN 题目 给你一个数组points&#xff0c;其中points[i] [xi, yi]表示X-Y平面上的一个点。求最多有多少个点在同一条直线上。 示例 1&#xff1a; 输入&#xff1a;points [[1,1],[2,2],[3,3]] 输出&#xff1a;3 示例 2&#xff1a; 输入&am…