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

Asp .Net Core系列:基于MySQL的DBHelper帮助类和SQL Server的DBHelper帮助类

文章目录

    • MySQLDBHelper
    • MSSQLDBHelper

MySQLDBHelper

app.config中添加配置

	<connectionStrings><add name="MySqlConn" connectionString="server=localhost;port=3306;user=root;password=123456;database=db1;SslMode=none"/></connectionStrings>

MySQLDBHelper

using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;namespace Common
{/// <summary>/// 数据库操作类/// </summary>public class MySQLDBHelper{public readonly static string MySqlConn = ConfigurationManager.ConnectionStrings["MySqlConn"].ConnectionString.ToString();/// <summary>/// 执行增、删、改的方法:ExecuteNonQuery,返回true,false/// </summary>/// <param name="sql"></param>/// <param name="pms"></param>/// <returns></returns>public static bool ExecuteNonQuery(string sql, MySqlParameter[] pms){using (MySqlConnection conn = new MySqlConnection(MySqlConn)){conn.Open();using (MySqlTransaction transaction = conn.BeginTransaction()){using (MySqlCommand cmd = new MySqlCommand(sql, conn)){if (pms != null && pms.Length > 0){cmd.Parameters.AddRange(pms);}int rows = cmd.ExecuteNonQuery();transaction.Commit();return rows > 0;}}}}/// <summary>///  执行增、删、改的方法:ExecuteNonQuery,返回true,false/// </summary>/// <param name="sql"></param>/// <param name="pms"></param>/// <returns></returns>public static bool ExecuteNonQuery(string sql, Dictionary<string, object> pms){MySqlParameter[] parameters = null;if (pms != null && pms.Count > 0){parameters = DictionaryToMySqlParameters(pms).ToArray();}return ExecuteNonQuery(sql, parameters);}/// <summary>///  执行增、删、改的方法:ExecuteNonQuery,返回true,false/// </summary>/// <param name="sql"></param>/// <param name="pms"></param>/// <returns></returns>public static bool ExecuteNonQuery(string sql){return ExecuteNonQuery(sql, new MySqlParameter[] { });}/// <summary>/// 将查出的数据装到实体里面,返回一个List/// </summary>/// <param name="sql"></param>/// <param name="pms"></param>/// <returns></returns>public static List<T> ExecuteQuery<T>(string sql, MySqlParameter[] pms) where T : new(){using (var connection = new MySqlConnection(MySqlConn)){connection.Open();using (var command = new MySqlCommand(sql, connection)){if (pms != null && pms.Length > 0){command.Parameters.AddRange(pms);}using (var reader = command.ExecuteReader()){List<T> tList = new List<T>();while (reader.Read()) // 遍历结果集中的每一行数据  {var t = ConvertToModel<T>(reader);tList.Add(t);}return tList;}}}}/// <summary>/// 将查出的数据装到实体里面,返回一个List/// </summary>/// <param name="sql"></param>/// <param name="pms"></param>/// <returns></returns>public static List<T> ExecuteQuery<T>(string sql, Dictionary<string, object> pms) where T : new(){MySqlParameter[] parameters = null;if (pms != null){parameters = DictionaryToMySqlParameters(pms).ToArray();}return ExecuteQuery<T>(sql, parameters);}/// <summary>/// 将查出的数据装到实体里面,返回一个List/// </summary>/// <param name="sql"></param>/// <returns></returns>public static List<T> ExecuteQuery<T>(string sql) where T : new(){return ExecuteQuery<T>(sql, new MySqlParameter[] { });}/// <summary>/// 将查出的数据装到实体里面,返回一个实体/// </summary>/// <param name="sql"></param>/// <param name="pms"></param>/// <returns></returns>public static T ExecuteQueryOne<T>(string sql, MySqlParameter[] pms) where T : new(){using (var connection = new MySqlConnection(MySqlConn)){connection.Open();using (var command = new MySqlCommand(sql, connection)){if (pms != null && pms.Length > 0){command.Parameters.AddRange(pms);}using (var reader = command.ExecuteReader()){while (reader.Read()) // 遍历结果集中的每一行数据  {var t = ConvertToModel<T>(reader);return t;}return default(T);}}}}/// <summary>/// 将查出的数据装到实体里面,返回一个实体/// </summary>/// <param name="sql"></param>/// <param name="pms"></param>/// <returns></returns>public static T ExecuteQueryOne<T>(string sql, Dictionary<string, object> pms) where T : new(){MySqlParameter[] parameters = null;if (pms != null && parameters.Length > 0){parameters = DictionaryToMySqlParameters(pms).ToArray();}return ExecuteQueryOne<T>(sql, parameters);}/// <summary>/// 将查出的数据装到实体里面,返回一个实体/// </summary>/// <typeparam name="T"></typeparam>/// <param name="sql"></param>/// <returns></returns>public static T ExecuteQueryOne<T>(string sql) where T : new(){return ExecuteQueryOne<T>(sql, new MySqlParameter[] { });}/// <summary>/// 将查出的数据装到table里,返回一个DataTable/// </summary>/// <param name="sql"></param>/// <param name="pms"></param>/// <returns></returns>public DataTable ExecuteQueryDataTable(string sql, MySqlParameter[] pms = null){DataTable dt = new DataTable();using (MySqlDataAdapter adapter = new MySqlDataAdapter(sql, MySqlConn)){if (pms != null){adapter.SelectCommand.Parameters.AddRange(pms);}adapter.Fill(dt);}return dt;}/// <summary>/// 将查出的数据装到table里,返回一个DataTable/// </summary>/// <param name="sql"></param>/// <param name="pms"></param>/// <returns></returns>public DataTable ExecuteQueryDataTable(string sql, Dictionary<string, object> pms){MySqlParameter[] parameters = null;if (pms != null){parameters = DictionaryToMySqlParameters(pms).ToArray();}return ExecuteQueryDataTable(sql, parameters);}/// <summary>/// 将查出的数据装到table里,返回一个DataTable/// </summary>/// <param name="sql"></param>/// <returns></returns>public DataTable ExecuteQueryDataTable(string sql){MySqlParameter[] parameters = null;return ExecuteQueryDataTable(sql, parameters);}/// <summary>/// 字典转MySqlParameters/// </summary>/// <param name="parameters"></param>/// <returns></returns>public static List<MySqlParameter> DictionaryToMySqlParameters(Dictionary<string, object> parameters){List<MySqlParameter> MySqlParameters = new List<MySqlParameter>();foreach (var kvp in parameters){string parameterName = kvp.Key;object parameterValue = kvp.Value;// 创建 MySqlParameter 对象  MySqlParameter MySqlParameter = new MySqlParameter(parameterName, parameterValue);MySqlParameters.Add(MySqlParameter);}return MySqlParameters;}/// <summary>/// 按列名转换(单条使用比较方便)/// </summary>/// <param name="reader"></param>/// <returns></returns>public static T ConvertToModel<T>(MySqlDataReader reader) where T : new(){T t = new T();PropertyInfo[] propertys = t.GetType().GetProperties();List<string> drColumnNames = new List<string>();for (int i = 0; i < reader.FieldCount; i++){drColumnNames.Add(reader.GetName(i));}foreach (PropertyInfo pi in propertys){if (drColumnNames.Contains(pi.Name)){if (!pi.CanWrite){continue;}var value = reader[pi.Name];if (value != DBNull.Value){pi.SetValue(t, value, null);}}}return t;}}
}

MSSQLDBHelper

app.config中添加配置

	<connectionStrings><add name="SqlConn" connectionString="Server=127.0.0.1;Database=db1;UserId=sa;Password=123456;"/></connectionStrings>

MSSQLDBHelper

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;namespace Common
{/// <summary>/// 数据库帮助类/// </summary>public class MSSQLDBHelper{public readonly static string SqlConn = ConfigurationManager.ConnectionStrings["SqlConn"].ConnectionString.ToString();/// <summary>/// 执行增、删、改的方法:ExecuteNonQuery,返回true,false/// </summary>/// <param name="sql"></param>/// <param name="pms"></param>/// <returns></returns>public static bool ExecuteNonQuery(string sql, SqlParameter[] pms){using (SqlConnection conn = new SqlConnection(SqlConn)){conn.Open();using (SqlTransaction transaction = conn.BeginTransaction()){using (SqlCommand cmd = new SqlCommand(sql, conn)){if (pms != null && pms.Length > 0){cmd.Parameters.AddRange(pms);}int rows = cmd.ExecuteNonQuery();transaction.Commit();return rows > 0;}}}}/// <summary>///  执行增、删、改的方法:ExecuteNonQuery,返回true,false/// </summary>/// <param name="sql"></param>/// <param name="pms"></param>/// <returns></returns>public static bool ExecuteNonQuery(string sql, Dictionary<string, object> pms){SqlParameter[] parameters = null;if (pms != null && pms.Count > 0){parameters = DictionaryToSqlParameters(pms).ToArray();}return ExecuteNonQuery(sql, parameters);}/// <summary>///  执行增、删、改的方法:ExecuteNonQuery,返回true,false/// </summary>/// <param name="sql"></param>/// <param name="pms"></param>/// <returns></returns>public static bool ExecuteNonQuery(string sql){return ExecuteNonQuery(sql, new SqlParameter[] { });}/// <summary>/// 将查出的数据装到实体里面,返回一个List/// </summary>/// <param name="sql"></param>/// <param name="pms"></param>/// <returns></returns>public static List<T> ExecuteQuery<T>(string sql, SqlParameter[] pms) where T : new(){using (var connection = new SqlConnection(SqlConn)){connection.Open();using (var command = new SqlCommand(sql, connection)){if (pms != null && pms.Length > 0){command.Parameters.AddRange(pms);}using (var reader = command.ExecuteReader()){List<T> tList = new List<T>();while (reader.Read()) // 遍历结果集中的每一行数据  {var t = ConvertToModel<T>(reader);tList.Add(t);}return tList;}}}}/// <summary>/// 将查出的数据装到实体里面,返回一个List/// </summary>/// <param name="sql"></param>/// <param name="pms"></param>/// <returns></returns>public static List<T> ExecuteQuery<T>(string sql, Dictionary<string, object> pms) where T : new(){SqlParameter[] parameters = null;if (pms != null){parameters = DictionaryToSqlParameters(pms).ToArray();}return ExecuteQuery<T>(sql, parameters);}/// <summary>/// 将查出的数据装到实体里面,返回一个List/// </summary>/// <param name="sql"></param>/// <returns></returns>public static List<T> ExecuteQuery<T>(string sql) where T : new(){return ExecuteQuery<T>(sql, new SqlParameter[] { });}/// <summary>/// 将查出的数据装到实体里面,返回一个实体/// </summary>/// <param name="sql"></param>/// <param name="pms"></param>/// <returns></returns>public static T ExecuteQueryOne<T>(string sql, SqlParameter[] pms) where T : new(){using (var connection = new SqlConnection(SqlConn)){connection.Open();using (var command = new SqlCommand(sql, connection)){if (pms != null && pms.Length > 0){command.Parameters.AddRange(pms);}using (var reader = command.ExecuteReader()){while (reader.Read()) // 遍历结果集中的每一行数据  {var t = ConvertToModel<T>(reader);return t;}return default(T);}}}}/// <summary>/// 将查出的数据装到实体里面,返回一个实体/// </summary>/// <param name="sql"></param>/// <param name="pms"></param>/// <returns></returns>public static T ExecuteQueryOne<T>(string sql, Dictionary<string, object> pms) where T : new(){SqlParameter[] parameters = null;if (pms != null && parameters.Length > 0){parameters = DictionaryToSqlParameters(pms).ToArray();}return ExecuteQueryOne<T>(sql, parameters);}/// <summary>/// 将查出的数据装到实体里面,返回一个实体/// </summary>/// <typeparam name="T"></typeparam>/// <param name="sql"></param>/// <returns></returns>public static T ExecuteQueryOne<T>(string sql) where T : new(){return ExecuteQueryOne<T>(sql, new SqlParameter[] { });}/// <summary>/// 将查出的数据装到table里,返回一个DataTable/// </summary>/// <param name="sql"></param>/// <param name="pms"></param>/// <returns></returns>public DataTable ExecuteQueryDataTable(string sql, SqlParameter[] pms = null){DataTable dt = new DataTable();using (SqlDataAdapter adapter = new SqlDataAdapter(sql, SqlConn)){if (pms != null){adapter.SelectCommand.Parameters.AddRange(pms);}adapter.Fill(dt);}return dt;}/// <summary>/// 将查出的数据装到table里,返回一个DataTable/// </summary>/// <param name="sql"></param>/// <param name="pms"></param>/// <returns></returns>public DataTable ExecuteQueryDataTable(string sql, Dictionary<string, object> pms){SqlParameter[] parameters = null;if (pms != null){parameters = DictionaryToSqlParameters(pms).ToArray();}return ExecuteQueryDataTable(sql, parameters);}/// <summary>/// 将查出的数据装到table里,返回一个DataTable/// </summary>/// <param name="sql"></param>/// <returns></returns>public DataTable ExecuteQueryDataTable(string sql){SqlParameter[] parameters = null;return ExecuteQueryDataTable(sql, parameters);}/// <summary>/// 字典转SqlParameters/// </summary>/// <param name="parameters"></param>/// <returns></returns>public static List<SqlParameter> DictionaryToSqlParameters(Dictionary<string, object> parameters){List<SqlParameter> SqlParameters = new List<SqlParameter>();foreach (var kvp in parameters){string parameterName = kvp.Key;object parameterValue = kvp.Value;// 创建 SqlParameter 对象  SqlParameter SqlParameter = new SqlParameter(parameterName, parameterValue);SqlParameters.Add(SqlParameter);}return SqlParameters;}/// <summary>/// 按列名转换(单条使用比较方便)/// </summary>/// <param name="reader"></param>/// <returns></returns>public static T ConvertToModel<T>(SqlDataReader reader) where T : new(){T t = new T();PropertyInfo[] propertys = t.GetType().GetProperties();List<string> drColumnNames = new List<string>();for (int i = 0; i < reader.FieldCount; i++){drColumnNames.Add(reader.GetName(i));}foreach (PropertyInfo pi in propertys){if (drColumnNames.Contains(pi.Name)){if (!pi.CanWrite){continue;}var value = reader[pi.Name];if (value != DBNull.Value){pi.SetValue(t, value, null);}}}return t;}}
}

相关文章:

Asp .Net Core系列:基于MySQL的DBHelper帮助类和SQL Server的DBHelper帮助类

文章目录 MySQLDBHelperMSSQLDBHelper MySQLDBHelper app.config中添加配置 <connectionStrings><add name"MySqlConn" connectionString"serverlocalhost;port3306;userroot;password123456;databasedb1;SslModenone"/></connectionStrin…...

【排序】对各种排序的总结

文章目录 前言1. 排序算法的复杂度及稳定性分析2. 排序算法的性能测试2.1 重复率较低的随机值排序测试2.2 重复率较高的随机值排序测试 前言 本篇是基于我这几篇博客做的一个总结&#xff1a; 《简单排序》&#xff08;含&#xff1a;冒泡排序&#xff0c;直接插入排序&#x…...

Apache ActiveMQ RCE CNVD-2023-69477 CVE-2023-46604

漏洞简介 Apache ActiveMQ官方发布新版本&#xff0c;修复了一个远程代码执行漏洞&#xff0c;攻击者可构造恶意请求通过Apache ActiveMQ的61616端口发送恶意数据导致远程代码执行&#xff0c;从而完全控制Apache ActiveMQ服务器。 影响版本 Apache ActiveMQ 5.18.0 before …...

C语言可变参数输入

本博文源于笔者正在学习的可变参数输入&#xff0c;可变参数是c语言函数中的一部分&#xff0c;下面本文就以一个很小的demo演示可变参数的编写 问题来源 想要用可变参数进行多个整数相加 方法源码 #include<stdio.h> #include<stdlib.h> #include<stdarg.h…...

飞天使-k8s知识点10-kubernetes资源对象3-controller

文章目录 pod探针 控制器 pod 概述&#xff1a; 1. pod是k8s中的最小单元 2. 一个pod中可以运行一个容器&#xff0c;也可以运行多个容器 3. 运行多个容器的话&#xff0c;这些容器是一起被调度的 4. Pod的生命周期是短暂的&#xff0c;不会自愈&#xff0c;是用完就销毁的实体…...

【Vue技巧】Vue2和Vue3组件上使用v-model的实现原理

ChatGPT4.0国内站点&#xff0c;支持GPT4 Vision 视觉模型&#xff1a;海鲸AI 在Vue中&#xff0c;v-model 是一个语法糖&#xff0c;用于在输入框、选择框等表单元素上创建双向数据绑定。当你在自定义组件中实现 v-model 功能时&#xff0c;你需要理解它背后的原理&#xff1a…...

博客随手记

随手记...

【2023】java常用HTTP客户端对比以及使用(HttpClient/OkHttp/WebClient)

&#x1f4bb;目录 1、介绍2、使用2.1、添加配置2.1.1、依赖2.1.2、工具类2.1.3、实体2.1.4、Controller接口 2.2、Apache HttpClient使用2.3 、OkHttp使用2.4、WebClient使用 1、介绍 现在java使用的http客户端主要包括以下几种 而这些中使用得最频繁的主要是&#xff1a; A…...

微信小程序获取来源场景值

https://developers.weixin.qq.com/miniprogram/dev/framework/app-service/scene.html#返回来源信息的场景 https://developers.weixin.qq.com/miniprogram/dev/api/base/app/life-cycle/wx.getLaunchOptionsSync.html 场景值列表 只有1008是来源群聊 /** * 生命周期函数--监…...

Vue3:vue-cli项目创建及vue.config.js配置

一、node.js检测或安装&#xff1a; node -v node.js官方 二、vue-cli安装&#xff1a; npm install -g vue/cli # OR yarn global add vue/cli/*如果安装的时候报错&#xff0c;可以尝试一下方法 删除C:\Users**\AppData\Roaming下的npm和npm-cache文件夹 删除项目下的node…...

关于CAD导入**地球的一些问题讨论

先上示例: 上图是将北京王佐停车场的红线CAD图导入到图新地球效果,如果看官正是需要这样的效果,那么请你继续往下看,全是干货! 在地球中导入CAD图可以做为电子沙盘。对于工程人来说,是极有帮助的。以前一直用谷歌地球,大约在2020年左右,就被和谐了。当时感觉挺可惜的。…...

Semaphore信号量详解

在Java并发编程中&#xff0c;Semaphore是一个非常重要的工具类。它位于java.util.concurrent包中&#xff0c;为我们提供了一种限制对临界资源的访问的机制。你可以将其视为一个同步控制的瑞士军刀&#xff0c;因为它既能够控制对资源的并发访问数量&#xff0c;也能够保证资源…...

Python的核心知识点整理大全66(已完结撒花)

目录 D.3 忽略文件 .gitignore 注意 D.4 初始化仓库 D.5 检查状态 D.6 将文件加入到仓库中 D.7 执行提交 D.8 查看提交历史 D.9 第二次提交 hello_world.py D.10 撤销修改 hello_world.py 注意 D.11 检出以前的提交 往期快速传送门&#x1f446;&#xff08;在文…...

k8s的存储卷

存储卷------数据卷 把容器内的目录&#xff0c;和宿主机的目录进行挂载。 容器在系统上的生命周期是短暂的&#xff0c;delete&#xff0c;k8s用控制&#xff08;deployment&#xff09;创建的pod&#xff0c;delete相当于重启&#xff0c;容器的状态也会回复到初始状态。 …...

Git 实战指南:常用指令精要手册(持续更新)

&#x1f451;专栏内容&#xff1a;Git⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、Git 安装过程1、Windows 下安装2、Cent os 下安装3、Ubuntu 下安装 二、配置本地仓库1、 初始化 Git 仓库2、配置 name 和 e…...

关于SpringMVC前后端传值总结

一、传递方式 1、查询参数&路径参数 查询参数&#xff1a; URI:/teachers?typeweb GetMapping("/klasses/teachers") public List<Teacher> getKlassRelatedTeachers(String type ) { ... }如果查询参数type与方法的名称相同&#xff0c;则直接将web传入…...

【排序】归并排序(C语言实现)

文章目录 1. 递归版的归并排序1.1 归并排序的思想2. 递归版的归并排序的实现 2. 非递归版的归并排序 1. 递归版的归并排序 1.1 归并排序的思想 归并排序&#xff08;MERGE - SORT&#xff09;是建立在归并操作上的一种有效的排序算法, 该算法是采用分治法&#xff08;Divide a…...

127. 单词接龙

和433.最小基因变化这道题一样的解法。 https://blog.csdn.net/qq_43606119/article/details/135538247 class Solution {public int ladderLength(String beginWord, String endWord, List<String> wordList) {Set<String> cnt new HashSet<>();for (int …...

计算机算法贪心算法

贪心算法&#xff08;Greedy Algorithm&#xff09;是一种常见的算法思想&#xff0c;它在每一步选择当前状态下最优的解决方案&#xff0c;从而希望最终能够达到全局最优解。 贪心算法的基本思路是每一步都选择当前状态下的局部最优解&#xff0c;而忽略了当前选择所带来的影…...

基于css实现动画效果

介绍 本文将会基于css&#xff0c;实现各种动画效果&#xff0c;接下来会从简单几个例子入手。 案例 三颗球 <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8" /><title>React App</title><style>…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...