C#初级教程(6)——函数:从基础到实践
一、函数的核心价值:简化与复用代码
以游戏开发项目为例,在游戏中,角色的移动、攻击等行为并非只在单一场景中出现。设想一下,若每次需要角色执行这些行为时,都要重新编写对应的代码,那将是何等繁琐且易错的工作。通过将这些行为封装成函数,我们只需编写一次,然后在不同场景中按需调用即可。这不仅避免了代码的重复编写,还显著提升了开发效率,让代码结构更加简洁明了,易于维护和扩展。
二、函数的基础构建:定义与调用
(一)函数定义的基础结构
在 C# 的控制台应用程序中,函数的定义遵循特定的形式:
static <returnType> <FunctionName>(<parameterList>)
{// 函数体代码return <returnValue>;
}
在这里,<returnType> 明确了函数返回值的类型。若函数无需返回值,可将其指定为 void。<FunctionName> 则是函数的名称,在命名时需严格遵循 C# 的命名规范,以确保代码的可读性和规范性。<parameterList> 为参数列表,它可以为空,也可以包含一个或多个参数。而 <returnValue> 必须与 <returnType> 的类型保持一致,用于将函数的计算结果返回给调用者。
下面是一个简单的无参数、无返回值的函数定义示例:
static void PrintMessage()
{Console.WriteLine("欢迎来到C#函数的世界!");
}
在这个例子中,PrintMessage 函数没有接收任何参数,也不返回任何值,其功能仅仅是在控制台输出一条欢迎信息。
(二)函数的调用
一旦函数定义完成,就可以在其他函数中进行调用。通常,我们会在 Main 函数中调用其他函数,以启动程序的执行流程。以下是在 Main 函数中调用 PrintMessage 函数的示例:
static void Main()
{PrintMessage();
}
当程序执行到 PrintMessage(); 这一行时,会跳转到 PrintMessage 函数的定义处,执行函数体中的代码,即输出欢迎信息,然后再返回 Main 函数继续执行后续代码。
(三)带参数和返回值的函数
函数的强大之处在于它能够通过参数接收外部传递的数据,并通过返回值将处理结果反馈回去。例如,下面是一个用于计算两个整数之和的函数:
static int AddNumbers(int num1, int num2)
{return num1 + num2;
}
在这个函数中,num1 和 num2 是两个整数类型的参数,函数体将这两个参数相加,并通过 return 语句返回计算结果。
在 Main 函数中调用该函数的示例如下:
static void Main()
{int result = AddNumbers(3, 5);Console.WriteLine("两数之和为:" + result);
}
在上述代码中,首先调用 AddNumbers 函数,将 3 和 5 作为参数传递进去,函数计算得到结果 8,然后将结果赋值给 result 变量,最后在控制台输出两数之和。
三、参数的灵活运用:从固定参数到参数数组
(一)固定参数
函数的固定参数在定义时,其数量和类型都是明确且固定的。例如,在计算圆面积的函数中,我们需要接收圆的半径作为参数,以进行面积的计算。以下是该函数的定义:
static double CalculateCircleArea(double radius)
{return Math.PI * radius * radius;
}
在这个函数中,radius 是一个 double 类型的固定参数,用于表示圆的半径。函数通过 Math.PI 常量和传入的半径值,按照圆面积公式计算并返回圆的面积。
(二)参数数组
当函数需要处理数量不确定的参数时,参数数组就派上了用场。在 C# 中,参数数组通过 params 关键字来定义,并且它只能出现在参数列表的最后一个位置。
例如,我们可以定义一个计算多个整数之和的函数:
static int SumNumbers(params int[] numbers)
{int sum = 0;foreach (int num in numbers){sum += num;}return sum;
}
在这个函数中,params int[] numbers 表示这是一个参数数组,它可以接收任意数量的整数参数。在函数体内部,通过 foreach 循环遍历参数数组,将每个元素累加到 sum 变量中,最后返回累加的结果。
调用该函数时,我们可以非常灵活地传递任意多个整数参数,如下所示:
static void Main()
{int total = SumNumbers(1, 2, 3, 4, 5);Console.WriteLine("多个数之和为:" + total);
}
在上述代码中,我们向 SumNumbers 函数传递了 5 个整数参数,函数会正确地计算它们的和并返回。
四、函数在结构体中的应用:增强数据与行为的关联性
在 C# 中,结构体是一种用户自定义的数据类型。在结构体中定义函数,能够将数据和与之相关的操作紧密地结合在一起,从而增强代码的内聚性和可读性。
以表示学生信息的结构体为例:
struct Student
{public string Name;public int Age;public string GetStudentInfo(){return "姓名:" + Name + ",年龄:" + Age;}
}
在这个结构体中,我们定义了两个字段 Name 和 Age,用于存储学生的姓名和年龄信息。同时,还定义了一个 GetStudentInfo 函数,该函数用于返回包含学生姓名和年龄的字符串信息。
在 Main 函数中使用该结构体和其内部函数的示例如下:
static void Main()
{Student student = new Student { Name = "张三", Age = 20 };string info = student.GetStudentInfo();Console.WriteLine(info);
}
在上述代码中,首先创建了一个 Student 结构体的实例 student,并为其 Name 和 Age 字段赋值。然后调用 student 的 GetStudentInfo 函数,获取学生信息字符串,并在控制台输出。
五、函数重载:提升代码的适应性
函数重载是 C# 中一个非常实用的特性,它允许我们在同一个作用域内定义多个具有相同名称的函数,但这些函数的参数列表必须不同(参数个数、类型或顺序不同)。编译器会根据调用函数时传递的实际参数的类型和个数,自动确定应该调用哪个函数。
例如,我们可以针对求两个数最大值的需求,针对不同数据类型进行函数重载:
static int Max(int num1, int num2)
{return num1 > num2? num1 : num2;
}static double Max(double num1, double num2)
{return num1 > num2? num1 : num2;
}
在上述代码中,我们定义了两个名为 Max 的函数,一个用于比较两个整数的大小并返回较大值,另一个用于比较两个双精度浮点数的大小并返回较大值。
在 Main 函数中调用不同版本的 Max 函数的示例如下:
static void Main()
{int intResult = Max(5, 8);double doubleResult = Max(3.5, 7.2);Console.WriteLine("整数最大值:" + intResult);Console.WriteLine("双精度浮点数最大值:" + doubleResult);
}
在这个例子中,根据传递给 Max 函数的参数类型,编译器会准确地调用相应版本的函数,从而实现对不同数据类型的最大值求解。
六、委托:动态调用函数的强大工具
委托是 C# 中一种非常强大的类型,它的作用是存储函数的引用。通过委托,我们可以实现函数的动态调用,这为代码的编写带来了极大的灵活性。
首先,我们需要定义一个委托类型,它定义了返回类型和参数列表。例如:
delegate int MathOperation(int num1, int num2);
在这个例子中,MathOperation 是一个委托类型,它表示可以引用一个接收两个 int 类型参数,并返回一个 int 类型结果的函数。
接下来,我们定义两个符合该委托定义的函数:
static int Add(int num1, int num2)
{return num1 + num2;
}static int Subtract(int num1, int num2)
{return num1 - num2;
}
在 Main 函数中使用委托的示例如下:
static void Main()
{MathOperation operation;operation = Add;int result1 = operation(5, 3);operation = Subtract;int result2 = operation(5, 3);Console.WriteLine("加法结果:" + result1);Console.WriteLine("减法结果:" + result2);
}
在上述代码中,首先声明了一个 MathOperation 类型的变量 operation。然后将 operation 指向 Add 函数,通过 operation 调用 Add 函数并传递参数 5 和 3,得到加法运算的结果。接着,将 operation 重新指向 Subtract 函数,再次调用 operation 并传递相同参数,得到减法运算的结果。通过这种方式,我们实现了根据程序运行时的逻辑动态选择调用不同函数的功能。
七、函数相关的进阶知识拓展
(一)Lambda 表达式与匿名函数
Lambda 表达式是 C# 中的一种匿名函数,它提供了一种简洁的方式来定义可作为参数传递或存储在变量中的代码块。Lambda 表达式可以极大地简化代码编写,尤其是在处理一些简单的函数逻辑时。
例如,我们可以使用 Lambda 表达式来实现两个整数相加的功能,如下所示:
MathOperation addLambda = (num1, num2) => num1 + num2;
int lambdaResult = addLambda(4, 6);
Console.WriteLine("Lambda表达式计算结果:" + lambdaResult);
在上述代码中,(num1, num2) => num1 + num2 就是一个 Lambda 表达式,它定义了一个接收两个整数参数并返回它们之和的函数。通过将这个 Lambda 表达式赋值给 addLambda 变量(addLambda 是 MathOperation 委托类型的变量),我们可以像调用普通函数一样调用它,从而得到计算结果。
(二)递归函数
递归函数是一种在函数内部调用自身的函数。递归函数常用于解决那些可以分解为相似子问题的场景,通过不断地调用自身来逐步解决问题,直到满足某个终止条件。
以计算阶乘为例,我们可以使用递归函数来实现:
static int Factorial(int n)
{if (n == 0 || n == 1){return 1;}else{return n * Factorial(n - 1);}
}
在这个递归函数中,当 n 为 0 或 1 时,函数返回 1,这是递归的终止条件。否则,函数会将 n 与 Factorial(n - 1) 的结果相乘并返回,其中 Factorial(n - 1) 就是对自身的递归调用,通过不断地减小 n 的值,最终达到终止条件。
在 Main 函数中调用递归函数的示例如下:
static void Main()
{int factorialResult = Factorial(5);Console.WriteLine("5的阶乘为:" + factorialResult);
}
在上述代码中,调用 Factorial(5) 时,函数会按照递归逻辑逐步计算,最终返回 5 的阶乘结果。
八. 题目
1. 选择题改编及 C# 解析
在以下给出的常量形式里,不属于字符常量的是哪一项呢?请仔细判断后选择正确答案。
A. '\t'
B. "A"
C. 'Z'
class Program
{static void Main(){// 分析每个选项// 选项A '\t' 是转义字符,属于字符常量// 选项B "A" 是用双引号括起来的,这是字符串常量,不是字符常量// 选项C 'Z' 是用单引号括起来的单个字符,属于字符常量Console.WriteLine("答案选B,因为只有 \"A\" 是字符串常量,不是字符常量。");}
}
2. 递归函数求 f(n) 改编及 C# 解析
已知有这样一个数列,其递推关系为 f(n) = f(n - 1) + f(n - 2),并且初始条件为 f(0) = 2,f(1) = 3。请编写程序计算出 f(40) 的值。
class Program
{static void Main(){int n = 40;int[] f = new int[n + 1];f[0] = 2;f[1] = 3;for (int i = 2; i <= n; i++){f[i] = f[i - 1] + f[i - 2];}Console.WriteLine($"f(40) 的值为: {f[n]}");}
}
3. 正整数分解质因数改编及 C# 解析
请编写一个程序,让用户可以多次输入正整数,程序会将输入的正整数分解为质因数相乘的形式并输出。例如,当用户输入 90 时,程序应打印出 90 = 2 * 3 * 3 * 5。
using System;class Program
{static void Main(){while (true){Console.Write("请输入一个正整数(输入 0 退出): ");int num = int.Parse(Console.ReadLine());if (num == 0) break;Console.Write($"{num} = ");int divisor = 2;bool firstFactor = true;while (num > 1){if (num % divisor == 0){if (!firstFactor) Console.Write(" * ");Console.Write(divisor);num /= divisor;firstFactor = false;}else{divisor++;}}Console.WriteLine();}}
}
4. 求最大公约数和最小公倍数改编及 C# 解析
编写一个程序,让用户输入两个正整数 m 和 n,程序会计算并输出这两个数的最大公约数和最小公倍数。
using System;class Program
{static int GCD(int a, int b){while (b != 0){int temp = b;b = a % b;a = temp;}return a;}static int LCM(int a, int b){return a * b / GCD(a, b);}static void Main(){Console.Write("请输入第一个正整数 m: ");int m = int.Parse(Console.ReadLine());Console.Write("请输入第二个正整数 n: ");int n = int.Parse(Console.ReadLine());int gcd = GCD(m, n);int lcm = LCM(m, n);Console.WriteLine($"最大公约数是: {gcd}");Console.WriteLine($"最小公倍数是: {lcm}");}
}
5. 小球反弹问题改编及 C# 解析
有一个小球从 100 米的高度自由落下,每次落地后会反弹回原高度的一半,然后再落下。请编写程序计算小球在第 10 次落地时,总共经过了多少米,以及第 10 次反弹的高度是多少。
using System;class Program
{static void Main(){double height = 100;double totalDistance = 100;for (int i = 1; i < 10; i++){height /= 2;totalDistance += 2 * height;}height /= 2;Console.WriteLine($"第 10 次落地时共经过: {totalDistance} 米");Console.WriteLine($"第 10 次反弹高度: {height} 米");}
}
6. 求阶乘和改编及 C# 解析
编写一个程序,计算 1 + 2! + 3! + ... + 20! 的和。
using System;class Program
{static long Factorial(int n){long result = 1;for (int i = 2; i <= n; i++){result *= i;}return result;}static void Main(){long sum = 0;for (int i = 1; i <= 20; i++){sum += Factorial(i);}Console.WriteLine($"1 + 2! + 3! + ... + 20! 的和为: {sum}");}
}
7. 递归求阶乘改编及 C# 解析
使用递归的方法编写一个程序,计算 5 的阶乘。已知阶乘的递归公式为 f(n) = n * f(n - 1)。
using System;class Program
{static int Factorial(int n){if (n == 0 || n == 1){return 1;}return n * Factorial(n - 1);}static void Main(){int result = Factorial(5);Console.WriteLine($"5 的阶乘是: {result}");}
}
8. 定义结构体并赋值输出改编及 C# 解析
编写一个程序,定义一个名为 Student 的结构体,该结构体包含学号、姓名、性别和程序设计成绩四个字段。声明该结构体类型的变量,使用赋值语句对其进行赋值,然后将这些信息输出。
using System;struct Student
{public int StudentID;public string Name;public char Gender;public double ProgrammingScore;
}class Program
{static void Main(){Student student;student.StudentID = 101;student.Name = "张三";student.Gender = '男';student.ProgrammingScore = 85.5;Console.WriteLine($"学号: {student.StudentID}");Console.WriteLine($"姓名: {student.Name}");Console.WriteLine($"性别: {student.Gender}");Console.WriteLine($"程序设计成绩: {student.ProgrammingScore}");}
}
9. 四舍五入运算改编及 C# 解析
编写一个程序,让用户输入一个正数,程序会对该数进行四舍五入到个位数的运算,并输出结果。例如,输入 12.56 会得到 13,输入 12.46 会得到 12。
using System;class Program
{static void Main(){Console.Write("请输入一个正数: ");double num = double.Parse(Console.ReadLine());int result = (int)Math.Round(num, 0);Console.WriteLine($"四舍五入后的结果是: {result}");}
}
10. 求满足关系式的 k 的最大值改编及 C# 解析
已知关系式 1*1 + 2*2 + 3*3 + ... + k*k < 2000,编写一个程序,求出满足此关系式的 k 的最大值。
using System;class Program
{static void Main(){int k = 0;int sum = 0;while (sum < 2000){k++;sum += k * k;}Console.WriteLine($"满足关系式的 k 的最大值是: {k - 1}");}
}
11. 百钱买百鸡问题改编及 C# 解析
某人有 100 元钱,打算去买 100 只鸡。已知公鸡 5 元钱一只,母鸡 3 元钱一只,小鸡一元钱 3 只。请编写程序找出所有可能的购买方案,并将其打印出来。
using System;class Program
{static void Main(){Console.WriteLine("可能的购买方案如下:");for (int rooster = 0; rooster <= 20; rooster++){for (int hen = 0; hen <= 33; hen++){int chick = 100 - rooster - hen;if (chick % 3 == 0 && rooster * 5 + hen * 3 + chick / 3 == 100){Console.WriteLine($"公鸡: {rooster} 只, 母鸡: {hen} 只, 小鸡: {chick} 只");}}}}
}
九.结语
C# 函数在编程中占据着不可或缺的重要地位。从基础的定义和调用,到参数的灵活运用、函数重载以及委托等高级特性,再到 Lambda 表达式和递归函数等进阶知识,每一个环节都蕴含着强大的功能和无限的可能性。希望通过本文的详细讲解,能够帮助大家对 C# 函数有更深入、更全面的理解和掌握,从而在编程实践中能够灵活运用这些知识,编写出更加高效、更具扩展性的优质代码。无论是开发小型应用程序,还是构建大型复杂系统,对 C# 函数的精通都将成为开发者的得力武器。
相关文章:
C#初级教程(6)——函数:从基础到实践
一、函数的核心价值:简化与复用代码 以游戏开发项目为例,在游戏中,角色的移动、攻击等行为并非只在单一场景中出现。设想一下,若每次需要角色执行这些行为时,都要重新编写对应的代码,那将是何等繁琐且易错的…...
Ubuntu搭建esp32环境 配置打开AT指令集 websocket功能
1,搭建前提 环境搭建参考乐鑫官网给的本地编译 ESP-AT 工程方法 因为公司电脑和网络的特殊性,不能正确解析域名(仅在浏览器上可以访问) ,所以这边访问的时候改成了ssh 未了避免使用外网困难的问题,这里用…...
express(node ORM) 使用 Winston 记录日志 及数据库保存日志
一、安装 npm i winston npm i winston-mysql二、 配置 winston 2.1、封装 const config require(__dirname ‘/…/config/config.json’)[env]; 先判断当前是什么环境,如果.env中没有配置,就是开发环境。接着去config/config.json中读取对应的配置。…...
是德科技keysight N5173B信号发生器,是一款经济高效的仪器
是德科技keysight N5173B信号发生器安捷伦N5173B信号源 是德N5173B微波模拟信号发生器,拥有 9 kHz 至 40 GHz 的频率覆盖范围,N5173B为宽带滤波器、放大器、接收机等器件的参数测试提供了必要的信号,是一款经济高效的仪器。 N5173B特点&…...
从零到一:如何用阿里云百炼和火山引擎搭建专属 AI 助手(DeepSeek)?
本文首发:从零到一:如何用阿里云百炼和火山引擎搭建专属 AI 助手(DeepSeek)? 阿里云百炼和火山引擎都推出了免费的 DeepSeek 模型体验额度,今天我和大家一起搭建一个本地的专属 AI 助手。 阿里云百炼为 …...
FFmpeg视频处理入门级教程
一、FFmpeg常规处理流程 #mermaid-svg-W8X1llNEyuYptV3I {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-W8X1llNEyuYptV3I .error-icon{fill:#552222;}#mermaid-svg-W8X1llNEyuYptV3I .error-text{fill:#552222;str…...
C/C++ | 每日一练 (4)
💢欢迎来到张胤尘的技术站 💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 C/C | 每日一练 (4)题目参考答案基础容器序列容器std:…...
数据安全_笔记系列06:数据生命周期管理(存储、传输、使用、销毁)深度解析
数据安全_笔记系列06:数据生命周期管理(存储、传输、使用、销毁)深度解析 数据生命周期管理(存储、传输、使用、销毁)详解 数据生命周期管理(Data Lifecycle Management, DLM)是围绕数据从创建…...
后端返回文件流,前端导出excel文件
1、当后端接口返回文件流时,需前端导出excel文件,在请求中添加 responseType: blob限制条件,根据返回的文件流导出 封装的方法: /** * 公共的导出excel方法 * param {*} content 后端接口返回的二进制文件 * param {*} name 导出…...
Python开发 Flask框架面试题及参考答案
目录 Flask 的核心设计理念是什么?与 Django 相比有哪些显著差异? 解释 Flask 框架的核心理念及其作为 “微框架” 的优缺点 Flask 的依赖库有哪些?简述 Werkzeug 和 Jinja2 的作用 什么是 WSGI?Flask 如何基于 WSGI 实现服务端与应用的交互 解释 RESTful API 的设计原…...
Python 3.11 69 个内置函数(完整版)
一、数学与数值运算(12个) 函数 说明 示例 abs(x) 绝对值 abs(-5)→ 5 divmod(a, b) 返回(a//b, a%b) divmod(7,3)→ (2,1) max(iterable) 最大值 max([1,2,3])→ 3 min(iterable) 最小值 min([1,2,3])→ 1 pow(a, b) a^b(等…...
蓝桥杯备考:贪心算法之矩阵消除游戏
这道题是牛客上的一道题,它呢和我们之前的排座位游戏非常之相似,但是,排座位问题选择行和列是不会改变元素的值的,这道题呢每每选一行都会把这行或者这列清零,所以我们的策略就是先用二进制把选择所有行的情况全部枚举…...
跳跃游戏两则
跳跃游戏 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 思路 这里只…...
机器视觉--相机曝光
在现代工业生产的精密舞台上,机器视觉技术已然成为推动生产自动化、智能化的关键力量。而工业相机作为机器视觉系统的 “眼睛”,其曝光环节更是决定了视觉信息获取的质量与精度,如同为工业生产赋予了一双洞察入微的 “智慧之眼”,…...
基于 CFD 预测的机器学习第 2 部分:在 Benchmark 应用程序上使用 Stochos 预测流场
了解机器学习和 Stochos 如何彻底改变制造业的 CFD 预测。 挑战 预测复杂流体动力学场景中的流场一直是工程师和科学家面临的重大挑战。传统的计算流体动力学 (CFD) 方法需要大量的计算资源和时间,因此难以处理实时预测和大规模模拟。 此外…...
批量导出数据库表到Excel
这篇文章将介绍如何批量的将多个甚至成千上万的数据库表导出为Excel文件。 准备数据 如下图是数据库里的表,我们需要将它们全部导出为excel文件,这里以SQL Server数据库为例 新增导出 打开的卢导表工具,新建数据库连接,这里以S…...
力扣提升第一天
力扣提升第一天 题目链接:https://leetcode.cn/problems/design-memory-allocator/?envTypedaily-question&envId2025-02-25 一开始解题思路 暴力解决法 我奔着先从简单的写法做起,之后再想办法进行改进,心里已经预料到会出现超出时间…...
uni-app 开发 App 、 H5 横屏签名(基于lime-signature)
所用插件:lime-signature 使用到 CSS 特性 绝对定位transform 旋转transform-origin transform 原点 复习一下定位元素(相对定位、绝对定位、粘性定位) 代码# <template><view class"signature-page"><view clas…...
【Python】Python顺序语句经典题(四)
Python顺序语句经典练习题例题(四)。题目来源:Acwing 前三期合集:【Python】Python顺序语句经典题合集-CSDN博客 目录 1.最大值 题目描述 解题思路 AC代码 2.距离 题目描述 AC代码 3.燃料消耗 题目描述 AC代码 4.钞票…...
mysql的字符集和比较规则
mysql的字符集和比较规则 一、字符集(Character Set)二、比较规则(Collation)三、客户端与服务器的字符集转换四、注意事项总结 深度解读mysql是怎样运行的 MySQL的字符集和比较规则是其处理字符串存储、传输及比较的核心机制&…...
Vue3 + Vite + TS,使用 配置项目别名属性:server
官网地址传送门 点哇点哇,vite 官网传送门 直接上马 server: {https: false, // 是否开启 httpsopen: true, // 是否自动在浏览器中打开port: 8001, // 端口号host: "0.0.0.0",// 跨域代理proxy: {/api: {target: "http://localhost:3000", …...
03_pyqt5 + vlc 实现视频播放器
1.功能需求如图 按钮: 播放/暂停, 前进/后退, 视频上一个/下一个, 打开视频进度条: 视频进度条显示, 进度条拖拽, 音量控制按键控制: 1,2,3,4缩放画面大小, 2.方案选择 开发语言: python UI界面: pyqt5 qt_designed 设计ui布局 视频编码: python-vlc 方案说明: 视频解码可…...
Grafana使用日志5--如何重置Grafana密码
背景 有时候当账号太多的时候,根本记不住所有的账号密码,这时候就很容易登录失败,这时候怎么办呢? 接下来就让我来给大家演示一下Grafana的账号如果忘记了的话,该怎么找回自己的账号密码 操作 让我们来看一下具体的…...
使用 pytest-mock 进行 Python 高级单元测试与模拟
一、单元测试与模拟的意义 在软件开发中,单元测试用于验证代码逻辑的正确性。但实际项目中,代码常依赖外部服务(如数据库、API、文件系统)。直接测试这些依赖会导致: 测试速度变慢测试结果不可控产生副作用(如真实发送邮件)模拟(Mocking) 技术通过创建虚拟对象替代真…...
索提诺比率(Sortino Ratio):更精准的风险调整收益指标(中英双语)
索提诺比率(Sortino Ratio):更精准的风险调整收益指标 📉📊 📌 什么是索提诺比率? 在投资分析中,我们通常使用 夏普比率(Sharpe Ratio) 来衡量风险调整后的…...
prometheus+node_exporter+grafana监控K8S信息
prometheusnode_exportergrafana监控K8S 1.prometheus部署2.node_exporter部署3.修改prometheus配置文件4.grafana部署 1.prometheus部署 包下载地址:https://prometheus.io/download/ 将包传至/opt 解压 tar xf prometheus-2.53.3.linux-amd64.tar.gz 移动到…...
IDEA关闭SpringBoot程序后仍然占用端口的排查与解决
IDEA关闭SpringBoot程序后仍然占用端口的排查与解决 问题描述 在使用 IntelliJ IDEA 开发 Spring Boot 应用时,有时即使关闭了应用,程序仍然占用端口(例如:4001 端口)。这会导致重新启动应用时出现端口被占用的错误&a…...
kafka的ACL配置的sasl.kerberos.principal.to.local.rules配置解释
kafka配置acl认证的用户名转换规则 1、Kerberos中的介绍2、自定义sasl user name3、自定义ssl 的用户名4、关于kafka配置kerberos以及开启acl的实践 1、Kerberos中的介绍 Kerberos 关于此配置项的解释 https://web.mit.edu/Kerberos/krb5-latest/doc/admin/conf_files/krb5_co…...
山东大学软件学院nosql实验三
实验题目: 用Java做简单查询(2学时) 实验内容 用API方式,做简单查询。 实验要求 在以下要求中选择至少2个,使用Java语言实现数据查询,最终把数据输出到前端界面。 (1)找出年龄小于20岁的所有学生 &…...
Feign 类型转换问题解析:如何正确处理 `ResponseEntity<byte[]>` 返回值
在微服务架构中,Feign 是一种常见的用于服务间调用的客户端,它允许我们通过声明式接口来调用远程服务。使用 Feign 时,我们通常通过接口方法的返回类型来接收服务的响应体。然而,某些情况下,我们会遇到 Feign 无法正确解析响应体类型的问题,尤其是当服务返回一个如 Respo…...
