引言:Java 网络编程的重要性

随着互联网技术的飞速发展,网络编程已成为现代软件开发中不可或缺的一部分。Java 作为一种广泛应用于企业级开发和分布式系统的编程语言,提供了强大的网络通信支持。从底层的 Socket 编程到高层的 HTTP 协议处理,Java 提供了丰富的 API 和类库,使得开发者能够轻松构建网络应用程序。

本篇文章将深入探讨 Java 网络编程的核心概念,涵盖从基础的 Socket 编程到高级的 HTTP 通信,包括 TCP、UDP、HTTP 客户端与服务器的实现、多线程服务器设计、SSL/TLS 安全通信、RESTful API 调用等内容。通过大量的代码示例,我们将帮助读者理解 Java 网络编程的核心原理,并掌握如何构建高效、稳定的网络应用。

一、Java 网络编程基础

1.1 网络编程概述

网络编程是指通过计算机网络进行数据交换和通信的过程。Java 提供了 java.net 包,其中包含了用于网络通信的核心类,如 SocketServerSocketURLURLConnection 等。

Java 网络编程主要基于两种协议:

  • TCP(Transmission Control Protocol):面向连接的协议,提供可靠的数据传输。
  • UDP(User Datagram Protocol):无连接的协议,适用于对速度要求较高但对可靠性要求较低的场景。

1.2 IP 地址与端口

在网络通信中,每台计算机都有一个唯一的 IP 地址,用于标识网络中的设备。IP 地址可以是 IPv4(如 192.168.0.1)或 IPv6(如 2001:db8::1)。

端口(Port)是一个 16 位的数字,用于标识计算机上的特定服务。例如,HTTP 服务通常使用端口 80,HTTPS 使用 443,FTP 使用 21。

在 Java 中,InetAddress 类用于表示 IP 地址:

import java.net.InetAddress;
import java.net.UnknownHostException;public class InetAddressExample {public static void main(String[] args) {try {// 获取本地主机的 IP 地址InetAddress localHost = InetAddress.getLocalHost();System.out.println("本地主机名:" + localHost.getHostName());System.out.println("本地 IP 地址:" + localHost.getHostAddress());// 获取指定域名的 IP 地址InetAddress address = InetAddress.getByName("www.google.com");System.out.println("www.google.com 的 IP 地址:" + address.getHostAddress());} catch (UnknownHostException e) {e.printStackTrace();}}
}

二、Socket 编程基础

2.1 什么是 Socket?

Socket 是网络通信的端点,它允许程序在不同主机之间进行数据交换。Java 提供了 SocketServerSocket 类来实现 TCP 通信。

2.2 TCP 通信模型

TCP 是面向连接的协议,通信双方需要先建立连接,然后才能进行数据传输。

2.2.1 TCP 服务器端
import java.io.*;
import java.net.*;public class TCPServer {public static void main(String[] args) {try (ServerSocket serverSocket = new ServerSocket(8888)) {System.out.println("服务器已启动,等待客户端连接...");// 等待客户端连接Socket socket = serverSocket.accept();System.out.println("客户端已连接");// 获取输入流BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));String message = in.readLine();System.out.println("收到客户端消息:" + message);// 发送响应BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));out.write("Hello from server");out.newLine();out.flush();// 关闭连接socket.close();} catch (IOException e) {e.printStackTrace();}}
}
2.2.2 TCP 客户端
import java.io.*;
import java.net.*;public class TCPClient {public static void main(String[] args) {try (Socket socket = new Socket("localhost", 8888)) {System.out.println("已连接到服务器");// 发送消息BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));out.write("Hello from client");out.newLine();out.flush();// 接收响应BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));String response = in.readLine();System.out.println("服务器响应:" + response);// 关闭连接socket.close();} catch (IOException e) {e.printStackTrace();}}
}

2.3 UDP 通信模型

UDP 是无连接的协议,适用于实时性要求较高的场景,如视频会议、在线游戏等。

2.3.1 UDP 服务器端
import java.net.*;public class UDPServer {public static void main(String[] args) {try (DatagramSocket socket = new DatagramSocket(9999)) {byte[] buffer = new byte[1024];DatagramPacket packet = new DatagramPacket(buffer, buffer.length);System.out.println("UDP 服务器已启动,等待数据...");// 接收数据socket.receive(packet);String message = new String(packet.getData(), 0, packet.getLength());System.out.println("收到客户端消息:" + message);// 发送响应String response = "Hello from UDP server";byte[] responseData = response.getBytes();DatagramPacket responsePacket = new DatagramPacket(responseData, responseData.length, packet.getAddress(), packet.getPort());socket.send(responsePacket);} catch (IOException e) {e.printStackTrace();}}
}
2.3.2 UDP 客户端
import java.net.*;public class UDPClient {public static void main(String[] args) {try (DatagramSocket socket = new DatagramSocket()) {String message = "Hello from UDP client";byte[] sendData = message.getBytes();// 发送数据InetAddress address = InetAddress.getByName("localhost");DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, address, 9999);socket.send(sendPacket);// 接收响应byte[] receiveData = new byte[1024];DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);socket.receive(receivePacket);String response = new String(receivePacket.getData(), 0, receivePacket.getLength());System.out.println("服务器响应:" + response);} catch (IOException e) {e.printStackTrace();}}
}

三、多线程服务器设计

在实际应用中,一个服务器需要同时处理多个客户端的连接请求。为了提高并发性能,我们可以使用多线程技术来实现多客户端支持。

3.1 多线程 TCP 服务器

import java.io.*;
import java.net.*;public class MultiThreadedTCPServer {public static void main(String[] args) {try (ServerSocket serverSocket = new ServerSocket(8888)) {System.out.println("多线程 TCP 服务器已启动...");while (true) {Socket socket = serverSocket.accept();System.out.println("新客户端已连接");// 为每个客户端创建一个线程new ClientHandler(socket).start();}} catch (IOException e) {e.printStackTrace();}}static class ClientHandler extends Thread {private Socket socket;public ClientHandler(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));String message;while ((message = in.readLine()) != null) {System.out.println("收到客户端消息:" + message);// 发送响应out.write("Echo: " + message);out.newLine();out.flush();}socket.close();} catch (IOException e) {e.printStackTrace();}}}
}

3.2 多线程客户端

import java.io.*;
import java.net.*;public class MultiThreadedTCPClient {public static void main(String[] args) {for (int i = 0; i < 5; i++) {new Thread(() -> {try (Socket socket = new Socket("localhost", 8888)) {BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));String message = "Hello from client";out.write(message);out.newLine();out.flush();String response = in.readLine();System.out.println("服务器响应:" + response);} catch (IOException e) {e.printStackTrace();}}).start();}}
}

四、HTTP 通信基础

4.1 HTTP 协议简介

HTTP(HyperText Transfer Protocol)是用于 Web 浏览器和服务器之间通信的协议。HTTP 是基于 TCP 的应用层协议,采用请求-响应模式进行通信。

HTTP 请求的基本结构包括:

  • 方法:GET、POST、PUT、DELETE 等
  • URL:请求的资源路径
  • HTTP 版本:如 HTTP/1.1
  • 请求头:包含元数据(如 HostUser-Agent 等)
  • 请求体(可选):如 POST 请求中的数据

HTTP 响应的基本结构包括:

  • 状态码:如 200(OK)、404(Not Found)
  • 状态消息:描述状态码的文本
  • 响应头:如 Content-TypeContent-Length
  • 响应体:如 HTML 页面内容

4.2 使用 Java 发送 HTTP 请求

Java 提供了 HttpURLConnection 类来发送 HTTP 请求。

4.2.1 GET 请求
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;public class HttpGetExample {public static void main(String[] args) {try {URL url = new URL("https://jsonplaceholder.typicode.com/posts/1");HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");// 获取响应码int responseCode = connection.getResponseCode();System.out.println("响应码:" + responseCode);// 读取响应BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));String inputLine;StringBuilder response = new StringBuilder();while ((inputLine = in.readLine()) != null) {response.append(inputLine);}in.close();System.out.println("响应内容:" + response.toString());} catch (Exception e) {e.printStackTrace();}}
}
4.2.2 POST 请求
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;public class HttpPostExample {public static void main(String[] args) {try {URL url = new URL("https://jsonplaceholder.typicode.com/posts");HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("POST");connection.setDoOutput(true);// 设置请求头connection.setRequestProperty("Content-Type", "application/json");// 发送请求体String jsonInputString = "{\"title\":\"foo\",\"body\":\"bar\",\"userId\":1}";try (OutputStream os = connection.getOutputStream()) {byte[] input = jsonInputString.getBytes("utf-8");os.write(input, 0, input.length);}// 读取响应BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));String inputLine;StringBuilder response = new StringBuilder();while ((inputLine = in.readLine()) != null) {response.append(inputLine);}in.close();System.out.println("响应内容:" + response.toString());} catch (Exception e) {e.printStackTrace();}}
}

4.3 使用 Apache HttpClient 发送 HTTP 请求

Apache HttpClient 是一个功能强大的第三方库,提供了更简洁的 HTTP 请求方式。

4.3.1 添加 Maven 依赖
<dependency><groupId>org.apache.httpcomponents.client5</groupId><artifactId>httpclient5</artifactId><version>5.1</version>
</dependency>
4.3.2 GET 请求
import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.http.ClassicHttpResponse;
import org.apache.hc.core5.http.io.entity.EntityUtils;public class ApacheHttpGetExample {public static void main(String[] args) throws Exception {try (CloseableHttpClient httpClient = HttpClients.createDefault()) {HttpGet request = new HttpGet("https://jsonplaceholder.typicode.com/posts/1");ClassicHttpResponse response = httpClient.execute(request);System.out.println("响应码:" + response.getCode());System.out.println("响应内容:" + EntityUtils.toString(response.getEntity()));}}
}
4.3.3 POST 请求
import org.apache.hc.client5.http.classic.methods.HttpPost;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.http.ClassicHttpResponse;
import org.apache.hc.core5.http.io.entity.StringEntity;
import org.apache.hc.core5.http.io.entity.EntityUtils;public class ApacheHttpPostExample {public static void main(String[] args) throws Exception {try (CloseableHttpClient httpClient = HttpClients.createDefault()) {HttpPost request = new HttpPost("https://jsonplaceholder.typicode.com/posts");// 设置请求体String json = "{\"title\":\"foo\",\"body\":\"bar\",\"userId\":1}";request.setEntity(new StringEntity(json));request.setHeader("Content-Type", "application/json");ClassicHttpResponse response = httpClient.execute(request);System.out.println("响应码:" + response.getCode());System.out.println("响应内容:" + EntityUtils.toString(response.getEntity()));}}
}

五、构建 HTTP 服务器

5.1 使用 Java 构建简单的 HTTP 服务器

import com.sun.net.httpserver.HttpServer;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;public class SimpleHttpServer {public static void main(String[] args) throws IOException {HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);server.createContext("/hello", exchange -> {String response = "Hello from HTTP Server";exchange.sendResponseHeaders(200, response.length());OutputStream os = exchange.getResponseBody();os.write(response.getBytes());os.close();});server.setExecutor(null); // creates a default executorserver.start();System.out.println("HTTP 服务器已启动,端口 8000");}
}

5.2 使用 Spring Boot 构建 RESTful Web 服务

Spring Boot 提供了强大的 Web 开发支持,可以快速构建 RESTful API。

5.2.1 创建 Spring Boot 项目

使用 Spring Initializr 创建一个 Spring Boot 项目,添加 Spring Web 依赖。

5.2.2 编写 REST 控制器
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/api")
public class HelloController {@GetMapping("/hello")public String sayHello() {return "Hello from Spring Boot!";}@PostMapping("/echo")public String echo(@RequestBody String message) {return "You said: " + message;}
}
5.2.3 启动应用
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

访问 http://localhost:8080/api/hello 将返回 Hello from Spring Boot!,使用 Postman 或 curl 发送 POST 请求到 /api/echo 可以测试消息回显功能。

六、SSL/TLS 安全通信

在现代网络通信中,安全传输数据至关重要。SSL/TLS 协议可以确保数据在传输过程中不被窃取或篡改。

6.1 使用 HTTPS 发送请求

import javax.net.ssl.HttpsURLConnection;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;public class HttpsGetExample {public static void main(String[] args) {try {URL url = new URL("https://jsonplaceholder.typicode.com/posts/1");HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();connection.setRequestMethod("GET");int responseCode = connection.getResponseCode();System.out.println("响应码:" + responseCode);BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));String inputLine;StringBuilder response = new StringBuilder();while ((inputLine = in.readLine()) != null) {response.append(inputLine);}in.close();System.out.println("响应内容:" + response.toString());} catch (Exception e) {e.printStackTrace();}}
}

6.2 配置 SSLContext

在某些情况下,我们需要自定义 SSL 上下文,例如忽略证书验证或使用自签名证书。

import javax.net.ssl.*;
import java.security.cert.X509Certificate;public class CustomSSLContext {public static void main(String[] args) throws Exception {// 创建信任所有证书的 TrustManagerTrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {public X509Certificate[] getAcceptedIssuers() {return null;}public void checkClientTrusted(X509Certificate[] certs, String authType) {}public void checkServerTrusted(X509Certificate[] certs, String authType) {}}};// 初始化 SSLContextSSLContext sslContext = SSLContext.getInstance("SSL");sslContext.init(null, trustAllCerts, new java.security.SecureRandom());HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true);// 发送 HTTPS 请求URL url = new URL("https://self-signed.badssl.com/");HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();connection.setRequestMethod("GET");BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));String inputLine;StringBuilder response = new StringBuilder();while ((inputLine = in.readLine()) != null) {response.append(inputLine);}in.close();System.out.println("响应内容:" + response.toString());}
}

七、总结

Java 提供了丰富的网络编程 API,从底层的 Socket 编程到高层的 HTTP 通信,开发者可以根据具体需求选择合适的工具和框架。

随着微服务架构的普及,RESTful API 成为构建分布式系统的重要手段。Java 生态中的 Spring Boot、Netty、Apache HttpClient 等框架为网络编程提供了更高级的抽象和更便捷的开发体验。

在未来的发展中,随着 5G、物联网、边缘计算等新技术的兴起,Java 网络编程将继续扮演重要角色。开发者需要不断学习和实践,掌握最新的网络通信技术,以应对日益复杂的网络环境和业务需求。

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

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

相关文章

STM32的蓝牙通讯(HAL库)

蓝牙基础知识&#xff08;了解即可&#xff09;&#xff1a;1.是一种利用低功率无线电&#xff0c;支持设备短距离通信的无线电技术&#xff0c;能在包括移动电话、PDAQ、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换&#xff0c;蓝牙工作在全球通用的2.4 GH…

方案B,version1

我们重新设计起步阶段的步骤,目标是:通过运行PowerShell脚本和配置GitHub Actions工作流(deploy.yml)来实现自动化部署。 要求: 用私有仓库(my-website-source-SSH)存储源码。 通过GitHub Actions自动构建(这里只是简单的Hello World,所以构建步骤可以简化为复制文件…

Linux --- 进程

一、进程概念 在 Linux 系统中&#xff0c;​​进程&#xff08;Process&#xff09;​​ 是程序执行的动态实例&#xff0c;是操作系统进行资源分配和调度的基本单位。 ​​1. 程序 vs 进程​​ ​​程序&#xff08;Program&#xff09;​​&#xff1a;是静态的代码集合&…

Cgroup 控制组学习(三)在容器中使用 CGroups

一、CGroups 关于mememory的限制操作 cgroup关于cpu操作 关于memeory cgroup的几个要点 ① memeory限额类 1、memory.limit_bytes&#xff1a;硬限制--> 限制最大内存使用量&#xff0c;单位有k、m、g三种&#xff0c;填-1则代表无限制,默认是字节2、memory.soft_limi…

SpringBoot面试基础知识

SpringBoot 是面试中后端开发岗位的高频考点&#xff0c;以下是核心考点整理&#xff1a;1. SpringBoot 基础概念- 定义&#xff1a;SpringBoot 是 Spring 框架的简化版&#xff0c;通过“自动配置”“起步依赖”等特性&#xff0c;简化 Spring 应用的搭建和开发&#xff0c;减…

Java面试全方位解析:从基础到AI的技术交锋

Java面试全方位解析&#xff1a;从基础到AI的技术交锋 面试场景&#xff1a;互联网大厂Java工程师岗位面试 面试官&#xff1a;您好&#xff0c;我是今天的面试官&#xff0c;接下来我们将进行三轮技术面试。 谢飞机&#xff1a;您好您好&#xff01;我是谢飞机&#xff0c;特别…

Web Worker:解锁浏览器多线程,提升前端性能与体验

目录 一、Web Worker 是什么&#xff1f; 核心特性 类型 二、为什么需要 Web Worker&#xff1f;(单线程的痛点) 三、Web Worker 的典型使用场景 四、一个简单的代码示例 (专用 Worker) 五、使用 Web Worker 的注意事项 六、总结 一、Web Worker 是什么&#xff1f; 简…

LabVIEW命令行调用与传参功能

该功能一方面借助 Formatinto String 构建命令行字符串&#xff0c;实现LabVIEW 环境下命令行调用 VI 并传参&#xff1b;另一方面&#xff0c;针对 Mac 平台&#xff0c;通过解析应用 Info.plist 文件&#xff0c;处理 LabVIEW 可执行文件路径&#xff0c;完善跨平台命令行调用…

使用FRP搭建内网穿透工具,自己公网服务器独享内外网端口转发

内网穿透&#xff0c;也即 NAT 穿透&#xff0c;进行 NAT 穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包不被 NAT 设备屏蔽而正确路由到内网主机。简单来说&#xff0c;就是让互联网&#xff08;外网&#xff09;设备能访问局域网&#xff08;内网&#xff09;设备提…

JavaWeb01——基础标签及样式(黑马视频笔记)

1.如何用VScode写html代码 1. 首先在vscode上安装一些插件&#xff0c;插件如下&#xff1a; 2.打开你要写入的html文件的文件夹&#xff0c;然后右击“ 新建文件”&#xff0c;命名 “xxx.html”, 3.如果是写 css文件&#xff0c;那么也是右击“新建文件”&#xff0c;命名“x…

在2G大小的文件中,找出高频top100的单词

将 2GB 的大文件分割为 2048 个大小为 512KB 的小文件&#xff0c;采用流式读取方式处理&#xff0c;避免一次性加载整个文件导致内存溢出。初始化一个长度为 2048 的哈希表数组&#xff0c;用于分别统计各个小文件中单词的出现频率。利用多线程并行处理机制遍历所有 2048 个小…

基于LNMP分布式个人云存储

1.准备工作a.关闭两台虚拟机的安全软件客户端&#xff1a;[rootmaster ~]# systemctl stop firewalld [rootmaster ~]# systemctl disable firewalld [rootmaster ~]# systemctl status firewalld ○ firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (…

指针运算全攻略:加减、比较与排序

常见的指针指针运算说明1.指针与整数的加减运算对指针可以进行加法运算&#xff0c;即p n或者p - n。其结果依旧是一个是一个指针&#xff0c;新的指针是在原来的地址值基础上加上/减去n *(sizeof(指针指向的数据类型)&#xff09;个字节。示例&#xff1a;#include<stdio.…

物联网安装调试-物联网网关

物联网网关作为连接终端设备与云平台的核心枢纽,其分类与选型需结合功能定位、硬件性能、连接方式及应用场景等多维度考量。以下从分类体系和产品推荐两方面系统梳理,助您高效决策: 🔧 一、物联网网关分类体系 1. 按功能定位划分 类型 核心能力 典型场景 代表产品 边缘计…

Jenkins教程(自动化部署)

Jenkins教程(自动化部署) 1. Jenkins是什么&#xff1f; Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具&#xff0c;广泛用于项目开发&#xff0c;具有自动化构建、测试和部署等功能。Jenkins用Java语言编写&#xff0c;可在Tomcat等流行的servlet容器中运行&…

linux 驱动验证是否成功 之 查看moudle信息

这些是 Linux 内核模块&#xff08;.ko&#xff09;中的元信息&#xff08;metadata&#xff09;&#xff0c;可以通过如下方式查看&#xff1a;✅ 1. 使用 modinfo 命令查看已加载或已编译模块信息 示例&#xff1a; modinfo aw2013.ko输出内容大概如下&#xff1a; filename:…

浏览器关闭之前请求接口到后端

2025.07.24今天我学习了如何在浏览器关闭之前请求一个接口返回到后端。可以用performance.navigation判断是浏览器关闭&#xff0c;还是浏览器刷新&#xff0c;因为我这边只需要浏览器关闭的时候才去触发1. 利用performance API&#xff08;刷新检测&#xff09; 刷新页面时&am…

MySQL批量数据处理与事务管理

MySQL是一种广泛应用的关系型数据库管理系统&#xff0c;尤其在数据分析和业务逻辑处理方面具有重要地位。在数据量庞大的业务场景中&#xff0c;批量数据处理和事务管理是提高效率和保障数据一致性的重要手段。掌握高效的批量数据操作方法与事务管理技巧&#xff0c;不仅能够提…

iOS网络之异步加载

为什么你的图片要异步加载&#xff1f;在仿写天气预报时&#xff0c;我们常常需要从网络加载天气图标&#xff0c;例如显示某个小时的天气状态图标。这看似简单的事情&#xff0c;如果处理不当&#xff0c;却很容易造成界面卡顿&#xff0c;甚至影响整个 App 的用户体验。错误做…

C#值类型属性的典型问题

问题复现&#xff1a;值类型属性的副本问题以下代码展示了值类型属性的典型问题&#xff1a;struct Point {public int X;public int Y; }class MyClass {public Point Position {get; set;} }// 使用属性修改结构体&#xff08;无效&#xff01;&#xff09; var obj new MyC…