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

C#基础之方法

文章目录

  • 1 方法
    • 1.1 定义方法
    • 1.2 参数传递
      • 1.2.1 按值传递参数
      • 1.2.2 按引用传递参数
      • 1.2.3 按输出传递参数
      • 1.2.4 可变参数 params
      • 1.2.5 具名参数
      • 1.2.6 可选参数
    • 1.3 匿名方法
      • 1.3.1 Lambda 表达式
        • 1.3.1.1 定义
        • 1.3.1.2 常用类型
        • 1.3.1.3 Lambda 表达式与 LINQ
        • 1.3.1.4 Lambda 表达式的捕获变量
    • 1.4 外部方法
      • 1.4.1 定义
      • 1.4.2 使用
    • 1.5 扩展方法
      • 1.5.1 定义
      • 1.5.2 操作示例

1 方法

一个方法是把一些相关的语句组织在一起,用来执行一个任务的语句块。每一个 C# 程序至少有一个带有 Main 方法的类。

1.1 定义方法

当定义一个方法时,从根本上说是在声明它的结构的元素。在 C# 中,定义方法的语法如下:

<Access Specifier> <Return Type> <Method Name>(Parameter List)
{Method Body
}

下面是方法的各个元素:

  • Access Specifier:访问修饰符,这个决定了变量或方法对于另一个类的可见性。
  • Return type:返回类型,一个方法可以返回一个值。返回类型是方法返回的值的数据类型。如果方法不返回任何值,则返回类型为 void。
  • Method name:方法名称,是一个唯一的标识符,且是大小写敏感的。它不能与类中声明的其他标识符相同。
  • Parameter list:参数列表,使用圆括号括起来,该参数是用来传递和接收方法的数据。参数列表是指方法的参数类型、顺序和数量。参数是可选的,也就是说,一个方法可能不包含参数。
  • Method body:方法主体,包含了完成任务所需的指令集。

下面的代码片段显示一个函数 FindMax,它接受两个整数值,并返回两个中的较大值。它有 public 访问修饰符,所以它可以使用类的实例从类的外部进行访问。

class NumberManipulator
{public int FindMax(int num1, int num2){/* 局部变量声明 */int result;if (num1 > num2)result = num1;elseresult = num2;return result;}...
}

1.2 参数传递

当调用带有参数的方法时,需要向方法传递参数。在 C# 中,有三种向方法传递参数的方式:

方式描述
值参数这种方式复制参数的实际值给函数的形式参数,实参和形参使用的是两个不同内存中的值。在这种情况下,当形参的值发生改变时,不会影响实参的值,从而保证了实参数据的安全。
引用参数这种方式复制参数的内存位置的引用给形式参数。这意味着,当形参的值发生改变时,同时也改变实参的值。
输出参数这种方式可以返回多个值。

1.2.1 按值传递参数

这是参数传递的默认方式。在这种方式下,当调用一个方法时,会为每个值参数创建一个新的存储位置。
实际参数的值会复制给形参,实参和形参使用的是两个不同内存中的值。所以,当形参的值发生改变时,不会影响实参的值,从而保证了实参数据的安全。下面的实例演示了这个概念:

using System;
namespace CalculatorApplication
{class NumberManipulator{public void swap(int x, int y){int temp;temp = x; /* 保存 x 的值 */x = y;    /* 把 y 赋值给 x */y = temp; /* 把 temp 赋值给 y */}static void Main(string[] args){NumberManipulator n = new NumberManipulator();/* 局部变量定义 */int a = 100;int b = 200;Console.WriteLine("在交换之前,a 的值: {0}", a);Console.WriteLine("在交换之前,b 的值: {0}", b);/* 调用函数来交换值 */n.swap(a, b);Console.WriteLine("在交换之后,a 的值: {0}", a);Console.WriteLine("在交换之后,b 的值: {0}", b);Console.ReadLine();}}
}结果:
在交换之前,a 的值:100
在交换之前,b 的值:200
在交换之后,a 的值:100
在交换之后,b 的值:200

结果表明,即使在函数内改变了值,值也没有发生任何的变化。

1.2.2 按引用传递参数

引用参数是一个对变量的内存位置的引用。当按引用传递参数时,与值参数不同的是,它不会为这些参数创建一个新的存储位置。引用参数表示与提供给方法的实际参数具有相同的内存位置。
在 C# 中,使用 ref 关键字声明引用参数。使用 ref,可以让方法直接操作调用方变量本身,而不是它的副本。
ref 的作用:

  • 普通传值(按值传递):方法接收的是变量的副本,对副本的修改不会影响原变量。
  • 引用传递(ref 传递):方法接收的是变量的引用,对引用指向的内存进行修改,会影响原变量。

栈与堆的关系:

  • 值类型(如 int, float)通常存储在栈上。引用传递时,传递的是栈上变量的引用。
  • 引用类型(如对象、数组)存储在堆上。引用传递时,ref 传递的是对堆上对象的引用。

下面的实例演示了这点:

using System;
namespace CalculatorApplication
{class NumberManipulator{public void swap(ref int x, ref int y){int temp;temp = x; /* 保存 x 的值 */x = y;    /* 把 y 赋值给 x */y = temp; /* 把 temp 赋值给 y */}   static void Main(string[] args){NumberManipulator n = new NumberManipulator();/* 局部变量定义 */int a = 100;int b = 200;Console.WriteLine("在交换之前,a 的值: {0}", a);Console.WriteLine("在交换之前,b 的值: {0}", b);/* 调用函数来交换值 */n.swap(ref a, ref b);Console.WriteLine("在交换之后,a 的值: {0}", a);Console.WriteLine("在交换之后,b 的值: {0}", b);Console.ReadLine();}}
}
结果:
在交换之前,a 的值:100
在交换之前,b 的值:200
在交换之后,a 的值:200
在交换之后,b 的值:100

结果表明,swap 函数内的值改变了,且这个改变可以在 Main 函数中反映出来。

1.2.3 按输出传递参数

return 语句可用于只从函数中返回一个值。但是,可以使用 输出参数 out 关键字来从函数中返回两个值。输出参数会把方法输出的数据赋给自己,其他方面与引用参数相似。

下面的实例演示了这点:

using System;namespace CalculatorApplication
{class NumberManipulator{public void getValue(out int x ){int temp = 5;x = temp;}static void Main(string[] args){NumberManipulator n = new NumberManipulator();/* 局部变量定义 */int a = 100;Console.WriteLine("在方法调用之前,a 的值: {0}", a);/* 调用函数来获取值 */n.getValue(out a);Console.WriteLine("在方法调用之后,a 的值: {0}", a);Console.ReadLine();}}
}结果:
在方法调用之前,a 的值: 100
在方法调用之后,a 的值: 5

1.2.4 可变参数 params

当声明一个方法时,不能确定要传递给函数作为参数的参数数目。C# 参数数组解决了这个问题,参数数组通常用于传递未知数量的参数给函数。

在使用数组作为形参时,C# 提供了 params 关键字,使调用数组为形参的方法时,既可以传递数组实参,也可以传递一组数组元素。但是,一个方法中只能有一个可变参数 params,且必须在形参列表最后一个位置
params 的使用格式为:

public 返回类型 方法名称( params 类型名称[] 数组名称 )

实例

using System;
namespace ArrayApplication
{class ParamArray{public int AddElements(params int[] arr){int sum = 0;foreach (int i in arr){sum += i;}return sum;}}class TestClass{static void Main(string[] args){ParamArray app = new ParamArray();int sum = app.AddElements(512, 720, 250, 567, 889);Console.WriteLine("总和是: {0}", sum);Console.ReadKey();}}
}结果:
总和是: 2938

1.2.5 具名参数

具名参数允许调用方法时显式指定参数名称,而不是按位置传递参数。这对有多个参数的方法特别有用,因为可以选择性地设置某些参数,而忽略其他参数。

优点:

  • 提高代码可读性。
  • 避免因参数顺序出错而导致的问题
void PrintDetails(string name, int age, string city)
{Console.WriteLine($"Name: {name}, Age: {age}, City: {city}");
}// 具名参数调用
PrintDetails(name: "Alice", age: 25, city: "New York");// 顺序可以随意调整
PrintDetails(city: "Los Angeles", name: "Bob", age: 30);

1.2.6 可选参数

可选参数允许为方法的某些参数指定默认值,这样调用方法时可以省略这些参数

void Greet(string name, string greeting = "Hello")
{Console.WriteLine($"{greeting}, {name}!");
}// 调用时省略可选参数
Greet("Alice");               // 输出:Hello, Alice!// 调用时显式传递可选参数
Greet("Bob", "Hi");           // 输出:Hi, Bob!

1.3 匿名方法

在 C# 中,匿名函数是一种没有名字的方法,可以在代码中定义和使用。
匿名方法(Anonymous methods) 提供了一种传递代码块作为委托参数的技术。
在匿名方法中不需要指定返回类型,它是从方法主体内的 return 语句推断的。

1.3.1 Lambda 表达式

1.3.1.1 定义

Lambda 表达式是一个简洁的语法,用于创建匿名函数。它们通常用于 LINQ 查询和委托。

(parameters) => expression
// 或
(parameters) => { statement; }

其中:

  • parameters:传递给 Lambda 表达式的参数,可以省略括号 ()(当只有一个参数时)。
  • =>:称为goes to操作符,分隔参数和方法体。
  • expression 或 statements:要执行的代码,简单情况可以用一个表达式,复杂逻辑可以使用代码块 {}

注意:

  • 作用范围:Lambda 表达式可以捕获外部变量,但要小心,这可能导致意外的闭包效果。
  • 类型推断:C# 支持类型推断,Lambda 表达式的参数类型在多数情况下可以自动推断,无需显式声明类型。
  • 简洁性:对于简单逻辑,可以直接写成 Lambda 表达式;对于复杂逻辑,最好用命名方法,避免代码难以阅读。

实例

// 示例:使用 Lambda 表达式定义一个委托
Func<int, int, int> add = (a, b) => a + b;
Console.WriteLine(add(2, 3)); // 输出 5// 示例:使用 Lambda 表达式过滤数组中的元素
int[] numbers = { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0);
foreach (var num in evenNumbers)
{Console.WriteLine(num); // 输出 2 4
}
1.3.1.2 常用类型

Lambda 表达式通常用于定义委托或作为方法的参数,例如:

  • Func:定义具有返回值的 Lambda 表达式。
  • Action:定义不具有返回值的 Lambda 表达式。
  • Predicate:定义返回 bool 类型的 Lambda 表达式,常用于条件判断。

示例:不同类型的 Lambda 表达式

Func<int, int, int> multiply = (x, y) => x * y;
Console.WriteLine(multiply(3, 4));  // 输出:12Action<string> greet = name => Console.WriteLine($"Hello, {name}!");
greet("Alice");  // 输出:Hello, Alice!Predicate<int> isEven = n => n % 2 == 0;
Console.WriteLine(isEven(4));  // 输出:True
1.3.1.3 Lambda 表达式与 LINQ

Lambda 表达式在 LINQ 查询中常用于指定筛选条件、排序方式等。例如,对一个 List<int> 进行筛选和排序:

List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };
var evenNumbers = numbers.Where(n => n % 2 == 0).OrderBy(n => n);foreach (var num in evenNumbers)
{Console.WriteLine(num);  // 输出:2, 4, 6
}
1.3.1.4 Lambda 表达式的捕获变量

Lambda 表达式可以捕获外部作用域中的变量。捕获的变量与闭包类似,生命周期与 Lambda 表达式一致。

int factor = 3;
Func<int, int> multiplyByFactor = n => n * factor;
Console.WriteLine(multiplyByFactor(5));  // 输出:15

在这里,factor 是一个外部变量,multiplyByFactor 捕获了 factor,并在 Lambda 表达式中使用它。

1.4 外部方法

1.4.1 定义

外部方法是指那些用非托管代码(如C或C++)编写的函数,这些函数被编译成动态链接库(DLL)或其他形式的可执行文件。C#程序通过P/Invoke(Platform Invocation Services) 机制调用这些外部方法,P/Invoke 允许托管代码(如C#)调用非托管代码。
在C#中,调用外部方法(也称为外部函数或P/Invoke方法)之前需要先声明,这是因为C#是一种类型安全的语言,它需要在编译时知道方法的签名(即方法的名称、参数类型和返回类型)。外部方法通常指的是那些用非托管代码(如C或C++编写的DLL文件)实现的方法。

为什么需要先声明:

  • 类型安全:C# 编译器需要在编译时知道方法的签名,以确保调用时传递的参数类型和数量是正确的。
  • 元数据:声明外部方法时,可以提供关于方法的元数据(如DLL名称、入口点名称等),这些信息是运行时环境(CLR,Common Language Runtime)用来加载和调用非托管代码所必需的。
  • 编译时检查:通过声明外部方法,编译器可以在编译时检查调用的正确性,减少运行时错误。

1.4.2 使用

在C#中,可以使用DllImport属性来声明外部方法。DllImport属性指定了包含该方法的DLL文件的名称和入口点(即方法的名称)。以下是一个简单的例子:

using System;  
using System.Runtime.InteropServices;  class Program  
{  // 声明外部方法  [DllImport("kernel32.dll", CharSet = CharSet.Auto)]  public static extern IntPtr GetModuleHandle(string lpModuleName);  static void Main()  {  // 调用外部方法  IntPtr handle = GetModuleHandle("kernel32.dll");  Console.WriteLine("Handle: " + handle);  }  
}

在这个例子中,GetModuleHandle是一个外部方法,它位于kernel32.dll中。我们使用DllImport特性来声明这个方法,并在Main方法中调用它。

注意事项:

  • 字符集:使用CharSet属性指定字符集(如 CharSet.AutoCharSet.AnsiCharSet.Unicode ),这会影响字符串参数的传递方式。
  • 调用约定:默认情况下,P/Invoke使用stdcall调用约定。如果外部方法使用其他调用约定(如cdecl),需要使用CallingConvention枚举来指定。
  • 错误处理:调用外部方法时,可能会遇到各种错误(如找不到DLL、方法签名不匹配等)。因此,适当的错误处理是非常重要的。

1.5 扩展方法

1.5.1 定义

C# 中,扩展方法(Extension Method)是允许在不修改类代码或创建子类的情况下,为现有类型添加 新方法的一种机制。扩展方法本质上是一个静态方法,但它的调用方式实例方法类似,使得我们可以在不修改源代码的情况下增强类的功能。

扩展方法必须满足以下条件:

  • 必须定义在静态类
  • 方法本身必须是静态的
  • 第一个参数必须使用 this 关键字修饰,并指定参数类型即要扩展的类型

this 关键字的作用:

  • 标识扩展方法:this 关键字告诉编译器这是一个扩展方法,而不是普通的静态方法
  • 指定扩展类型:this 后面的参数类型就是要扩展的类型。
  • 调用方式:可以像调用实例方法一样调用扩展方法。

扩展方法的优点:

  • 无需修改原类:无需更改或继承现有类型即可添加新方法。
  • 提高代码可读性:扩展方法让代码更具可读性,因为它们可以像实例方法一样调用。
  • 方便维护:扩展方法通常集中在一个静态类中,有助于代码模块化和维护。

注意事项:

  • 扩展方法的命名冲突:如果类型本身已经定义了一个与扩展方法同名的方法,实例方法优先。扩展方法只会在没有实例方法的情况下被调用。
  • this 关键字仅用于第一个参数:扩展方法的第一个参数是要扩展的类型,必须用 this 关键字修饰。扩展方法只能有一个 this 参数。
  • 命名空间的引用:要使用扩展方法,必须引用扩展方法所在的命名空间。
  • 适用场景:扩展方法通常用于增强不可修改的类(如第三方库类)或基础类型(如 string、int 等)而不推荐滥用

1.5.2 操作示例

以下示例演示如何为 string 类型定义一个扩展方法 ToCapitalize,用于将字符串的首字母大写:

// 定义一个静态类来容纳扩展方法
public static class StringExtensions
{// 定义一个静态扩展方法,用于将字符串首字母大写public static string ToCapitalize(this string input){if (string.IsNullOrEmpty(input))return input;return char.ToUpper(input[0]) + input.Substring(1).ToLower();}
}// 使用扩展方法
public class Program
{public static void Main(){string text = "hello world";// 调用扩展方法,就像调用实例方法一样string capitalizedText = text.ToCapitalize();Console.WriteLine(capitalizedText); // 输出 "Hello world"}
}

为 int 类型添加一个扩展方法,计算该整数的平方:

public static class IntExtensions
{public static int Square(this int number){return number * number;}
}public class Program
{public static void Main(){int number = 5;int square = number.Square(); // 调用扩展方法Console.WriteLine(square); // 输出 25}
}

相关文章:

C#基础之方法

文章目录 1 方法1.1 定义方法1.2 参数传递1.2.1 按值传递参数1.2.2 按引用传递参数1.2.3 按输出传递参数1.2.4 可变参数 params1.2.5 具名参数1.2.6 可选参数 1.3 匿名方法1.3.1 Lambda 表达式1.3.1.1 定义1.3.1.2 常用类型1.3.1.3 Lambda 表达式与 LINQ1.3.1.4 Lambda 表达式的…...

Pytest框架学习19--参数化2

1、数据源是yaml 安装yaml&#xff0c;使用safe_load方法读取文件&#xff0c;解析出数据 pip install PyYAML # test_data.yaml test_case_1:a: 2b: 3expected_result: 5test_case_2:a: -1b: 10expected_result: 9test_case_3:a: 0b: 0expected_result: 0# test_code.pyimpor…...

VSCode中“Run Code”运行程序时,终端出现中文乱码解决方法

问题描述 在VSCode中“Run Code”运行程序时&#xff0c;终端输出结果出现中文乱码现象&#xff1a; 解决方法 1. 检查系统cmd的默认编码 查看Windows终端当前编码方式的命令&#xff1a; chcp输出结果是一段数字代码&#xff0c;如936&#xff0c;这说明当前的cmd编码方式…...

HarmonyOS 5.0应用开发——列表(List)

【高心星出品】 文章目录 列表&#xff08;List&#xff09;列表介绍列表布局设置主轴方向设置交叉轴方向 列表填充分组列表填充 滚动条位置设置滚动位置滚到监听 列表项侧滑 列表&#xff08;List&#xff09; 列表介绍 列表作为一种容器&#xff0c;会自动按其滚动方向排列…...

C++设计模式外观模式(Facade)

什么是桥接模式&#xff1f; 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;它的核心目的是解耦抽象部分和实现部分&#xff0c;让它们可以独立变化。在简单的描述中&#xff0c;桥接模式可以让你在不修改原有代码的情况下&#xff0c;分别…...

《Python基础》之Numpy库

目录 简介 一、创建数组 1、根据列表创建数组 2、创建全0数组 3、创建全1数组 4、创建单位矩阵 5、创建随机数数组 二、查看数组的属性 三、 数组的操作 1、索引和切片 2、变形 3、拼接 &#xff08;1&#xff09;、vstack() 纵向拼接 &#xff08;2&#xff09;、hs…...

Python异步编程与API调用:提高效率与性能的实践指南

引言 在当今的软件开发领域&#xff0c;异步编程已成为提高应用程序性能和响应能力的关键技术。特别是在处理I/O密集型任务&#xff0c;如API调用时&#xff0c;异步编程能够显著提升效率。本文将通过一个具体的示例——使用Python的asyncio和aiohttp库来异步调用API&#xff…...

Zookeeper3.4.14集群安装

Zookeeper3.4.14三节点集群安装 为保证集群高可用&#xff0c;Zookeeper 集群的节点数最好是奇数&#xff0c;最少有三个节点&#xff0c;所以这里搭建一个三个节点的集群。(在一个节点模拟三节点&#xff0c;真实的三节点把ip替换一下即可&#xff0c;按照hadoop案件把网络打…...

电机驱动MCU介绍

电机驱动MCU是一种专为电机控制设计的微控制器单元&#xff0c;它集成了先进的控制算法和高性能的功率输出能力。 电机驱动MCU采用高性能的处理器核心&#xff0c;具有快速的运算速度和丰富的外设接口。它内置了专业的电机控制算法&#xff0c;包括PID控制、FOC&#xff08;Fi…...

Python 面向对象编程详解

Python 面向对象编程详解 面向对象编程&#xff08;OOP&#xff09;是一种编程范式&#xff0c;它使用“对象”来设计软件。在 Python 中&#xff0c;面向对象编程非常强大&#xff0c;允许开发者通过类&#xff08;class&#xff09;和对象&#xff08;object&#xff09;来模…...

网络技术-不使用K8S情况下哪些方法可搭建服务链编排

在不使用Kubernetes&#xff08;k8s&#xff09;&#xff08;或不使用Docker环境技术的&#xff09;情况下&#xff0c;搭建服务链编排环境需要依赖其他服务编排和容器化技术&#xff0c;或者采用传统的虚拟机和服务管理方法。以下是一些可能的解决方案&#xff1a; 一、使用其…...

JVM_总结详解

1、CPU和内存的交互 了解jvm内存模型前&#xff0c;了解下cpu和计算机内存的交互情况。【因为Java虚拟机内存模型定义的访问操作与计算机十分相似】 有篇很棒的文章&#xff0c;从cpu讲到内存模型:[什么是java内存模型&#xff1f;] 在计算机中&#xff0c;cpu和内存的交互最…...

go语言 Pool实现资源池管理数据库连接资源或其他常用需要共享的资源

go Pool Pool用于展示如何使用有缓冲的通道实现资源池&#xff0c;来管理可以在任意数量的goroutine之间共享及独立使用的资源。这种模式在需要共享一组静态资源的情况&#xff08;如共享数据库连接或者内存缓冲区&#xff09;下非 常有用。如果goroutine需要从池里得到这些资…...

初级数据结构——邻接表

目录 前言一、定义与结构二、特点与性质三、构建方式四、操作与应用五、代码模版六、经典例题[1.——LCP 07. 传递信息](https://leetcode.cn/problems/chuan-di-xin-xi/description/)代码题解 [2.——547. 省份数量](https://leetcode.cn/problems/number-of-provinces/)代码题…...

思维导图+实现一个登录窗口界面

QQ2024122-205851 import sys from PyQt6.QtGui import QIcon, QPixmap, QMovie from PyQt6.QtWidgets import QApplication, QWidget, QLineEdit, QPushButton, QLabel, QVBoxLayout# 封装我的窗口类 class LoginWidget(QWidget):# 构造函数def __init__(self):# 初始化父类su…...

多级缓存设计实践

缓存是什么&#xff1f; 缓存技术是一种用于加速数据访问的优化策略。它通过将频繁访问的数据存储在高速存储介质&#xff08;如内存&#xff09;中&#xff0c;减少对慢速存储设备&#xff08;如硬盘或远程服务器&#xff09;的访问次数&#xff0c;从而提升系统的响应速度和…...

ElasticSearch学习笔记一

目录 1.ElasticSearch-Head如何启动 2.ElasticSearch-Head创建索引 2.1创建索引时的“分片数”和“副本数”是什么意思&#xff1f; 类比 1&#xff1a;图书馆的书架与备份 类比 2&#xff1a;快递分拣中心与包裹副本 总结 ​编辑 2.2如何查看现有索引的分片数和备份数 …...

A058-基于Spring Boot的餐饮管理系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看项目链接获取⬇️&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600个选题ex…...

代码设计:设计模式:应对变化

文章目录 概述1.拆分代码2.解耦3.扩展总结概述 代码的设计模式主要为了应对变化 三种代码设计中应对变化的方式 1.拆分代码 2.解耦 3.扩展 1.拆分代码 减小变化对代码的影响 需要拆分代码的几种情况 1.类或方法的代码量巨大,导致代码可读性降低 2.存在复杂的代码,如…...

《Vue 路由导航:打造流畅的单页应用一》

一、Vue Router 简介 Vue Router 是什么&#xff1f; Vue Router 是 Vue.js 官方提供的路由管理器&#xff0c;用于构建单页面应用并实现页面间导航。它基于 Vue 的组件系统构建&#xff0c;通过配置路由将浏览器的 URL 和用户看到的内容绑定起来。当用户在应用中浏览不同页面…...

【xshell连接失败】

xshell用pem连接失败 Warning: Identity file ”open_api_test.ssh not accessible: No such file or directory. Warning: Identity file open_api_test2.pem not accessible: No such file or directory. Permission denied (publickey,gssapi-keyex,gssapi-with-mic). 搞了半…...

说说Elasticsearch拼写纠错是如何实现的?

大家好&#xff0c;我是锋哥。今天分享关于【说说Elasticsearch拼写纠错是如何实现的&#xff1f;】面试题。希望对大家有帮助&#xff1b; 说说Elasticsearch拼写纠错是如何实现的&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Elasticsearch 中&…...

实例讲解MATLAB绘图坐标轴标签旋转

在进行绘图时需要在图片上添加上做标轴的标签&#xff0c;但是当数据量比较多时&#xff0c;例如一天24小时的数据&#xff0c;这时把每个小时显示在左边轴的标签上&#xff0c;文字内容放不下&#xff0c;因此需要将坐标轴标签旋转一定的角度&#xff0c;这样可以更好在图形上…...

Win10+Ubuntu20.04双系统重装Ubuntu22.04单系统

从去年 8 月美化 Ubuntu 系统后一直存在内核错误问题&#xff0c;但因为大部分功能还能正常使用&#xff0c;只是在 apt 时报错&#xff0c;所以一直逃避不想重装&#xff0c;直到最近 12 月新的开始&#xff0c;恰好设置的界面打不开得重装 gnome &#xff0c;所以下定决心重装…...

eBPF:现代Linux的强大内核扩展技术

eBPF&#xff1a;现代Linux的强大内核扩展技术 eBPF&#xff08;Extended Berkeley Packet Filter&#xff09;是一项变革性的技术&#xff0c;它为Linux内核提供了一个灵活的、可编程的方式来处理数据包过滤、网络监控、安全性和系统性能分析等多种任务。 1. eBPF简介 1.1 …...

深度学习-52-AI应用实战之基于Yolo8的目标检测自动标注

文章目录 1 YOLOv81.1 YOLOV8的不同版本1.2 可检测类别1.3 数据说明1.4 网络结构1.5 算法核心步骤2 目标检测的基本原理2.1 安装yolov8(cpu版本)2.2 图片检测2.3 视频检测2.4 自动标注2.5 保存标注结果3 参考附录1 YOLOv8 YOLOv8是一种前沿的计算机视觉技术,它基于先前YOLO版…...

人工智能工作流程概述:从数据到智能决策

目录 一、引言 二、人工智能工作流程概述 &#xff08;一&#xff09;数据收集 &#xff08;二&#xff09;数据预处理 &#xff08;三&#xff09;模型选择与设计 &#xff08;四&#xff09;模型训练 &#xff08;五&#xff09;模型评估 &#xff08;六&#xff09;模…...

Jenkins升级到最新版本后无法启动

1. 场景还原 最近在web界面将jenkins升级到最新版本后&#xff0c;后台无法启动jenkins服务&#xff0c;服务状态如下&#xff1a; 运行jenkins命令提示invalid Java version jenkins --version jenkins: invalid Java version: java version "1.8.0_202" Java(TM)…...

.net core MVC入门(三)——Product页面添加

文章目录 项目地址一、Product数据库准备 项目地址 教程作者&#xff1a;教程地址&#xff1a; 代码仓库地址&#xff1a; 所用到的框架和插件&#xff1a; dbt airflow一、Product数据库准备 添加Product的EF上下文 public DbSet<Category> Categories { get; set; …...

【Java基础】笔记

List和ArrayList区别 public class Arrays_BugDemo {public static void main(String[] args){/** List 是一个固定大小的列表&#xff0c;虽然可以进行查询操作&#xff0c;但不支持添加、删除或修改元素。* 如果需要一个可以动态修改的列表&#xff0c;可以使用 ArrayList 进…...

Docker 进阶指南:常用命令、最佳实践与资源管理

Docker 进阶指南&#xff1a;常用命令、最佳实践与资源管理 Docker 作为一种轻量级的容器化技术&#xff0c;已经成为现代软件开发和部署不可或缺的工具。本文将为您深入介绍 Docker 的常用命令、最佳实践以及如何有效管理容器资源&#xff0c;帮助您更好地在 Ubuntu 22.04 或…...

C++编写静态库

1、新建项目创建静态库staticLib1. demoStaticLib.h #pragma once class ArrayTool { public:int Max(const int* lpHead, const int nLength);int Sum(const int* lpHead, const int nLength); }; demoStaticLib.cpp #include "pch.h" #include "demoStati…...

oracle数据库日常操作

1、执行SQL语句后不显示PL/SQL procedure successfully completed set feedback off; 2、显示实例名称 echo "set sqlprompt \"_user_connect_identifier> \"" >> $ORACLE_HOME/sqlplus/admin/glogin.sql 3、客户端尝试连接到服务器时发生超时 …...

行驶证 OCR 识别API接口的影响因素

一、影响因素 (一)证件质量与图像质量 行驶证的质量对OCR 识别 API 界面的效果有重要影响。清晰的文件可以使识别系统准确地捕获文本信息&#xff0c;而模糊的文本可能会导致识别错误。而且不同地区、不同年份的行驶证在字体、排版、格式等方面可能存在差异&#xff0c;甚至可…...

什么是TCP/IP和UDP

TCP/IP和UDP都是网络协议&#xff0c;用于不同计算机或设备之间的通信。它们的作用是定义数据如何在网络上传输&#xff0c;但它们在传输方式、可靠性和效率上有显著的区别。 1. TCP/IP TCP/IP&#xff08;传输控制协议/互联网协议&#xff0c;Transmission Control Protocol…...

1074 Reversing Linked List (25)

Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K3, then you must output 3→2→1→6→5→4; if K4, you must output 4→3→2→1→5→6. Input Specif…...

layui table 纵向滚动条导致单元格表头表体错位问题

我用的时layui2.6.8版本 历史项目维护&#xff0c;bug给我让我做了&#xff0c;本来利用前端手段强解决&#xff0c;后来发现很多table 找了解决办法 打开layui-v2.6.8/lay/modules/table.js 如果打开后时压缩的代码 直接搜索 e.find(".layui-table-patch") …...

算法基础 - 求解非线性方程(牛顿法)

文章目录 1. 前言2. 牛顿迭代算法2.1. 基本思想2.2. 如何求解 x12.3. 如何求解 x22.4. 收敛性2.5. 编码实现2.5.1. 递归实现2.5.2. 非递归实现 1. 前言 前文介绍了如何使用“高斯消元法”求解线性方程组。本文秉承有始有终的态度&#xff0c;继续介绍“非线性方程”的求解算法。…...

[C#]C#实现数字到人民币大写金额的转换

在软件开发中&#xff0c;将数字转换成人民币大写形式的需求通常出现在需要生成财务报表、发票、收据、账单等正式文档的场景中。这些文档往往需要遵循一定的格式和规范&#xff0c;以确保信息的准确性和可读性&#xff0c;特别是在处理与金钱相关的数据时。 比如&#xff1a; …...

Base64.cv:高效安全的在线Base64转换工具详解

在日常开发中&#xff0c;Base64编解码是一个非常常见的需求。本文将介绍一款优秀的在线Base64转换工具&#xff1a;Base64.cv。 工具特点 1. 性能优势 采用浏览器原生API&#xff0c;转换速度快本地运算&#xff0c;无服务器延迟支持大容量文本处理 2. 安全性 纯客户端处…...

前端面试热门题(二)[html\css\js\node\vue)

Vue 性能优化的方法 Vue 性能优化的方法多种多样&#xff0c;以下是一些常用的策略&#xff1a; 使用v-show替换v-if&#xff1a;v-show是通过CSS控制元素的显示与隐藏&#xff0c;而v-if是通过操作DOM来控制元素的显示与隐藏&#xff0c;频繁操作DOM会导致性能下降。因此&am…...

施耐德电气:多维解构AI挑战,引领产业创新变革

CSDN 看到&#xff0c;大模型正在掀起一场智能化革命&#xff0c;带来计算、开发、交互三大范式全面升级和转换&#xff0c;其中 AI 计算范式正在从图灵、冯诺伊曼计算范式转为神经网络计算范式。AI 技术仍在快速发展&#xff0c;AI 算力基础设施的数据中心如果仍走“堆资源、堆…...

Unity的GPU Instancing技术

首先新建一个场景&#xff0c;添加一个相机&#xff0c;并创建一个Render Texture给相机。 然后在相机上挂载以下脚本TestBatches &#xff0c;同时脚本的Inspector面板的Mesh中选择Cube&#xff0c;另外创建一个新的材质拖动给mat&#xff1a; public class TestBatches : M…...

JVM指令集概览:基础与应用

写在文章开头 在现代软件开发中,Java 语言凭借其“一次编写,到处运行”的理念成为了企业级应用的首选之一。这一理念的背后支撑技术正是 Java 虚拟机(JVM)。JVM 是一个抽象的计算机,它实现了 Java 编程语言的各种特性,并且能够执行编译后的字节码文件。了解 JVM 的工作原…...

使用 Redis Stream 结合 Redission DelayedQueue 实现延迟消息队列(已上线生产)

一、Redis Stream 介绍 Redis Stream 是 Redis 5.0 版本新增加的数据结构&#xff0c;作为一种轻量级的消息队列&#xff0c;Redis Stream 作为一种轻量级的消息队列&#xff0c;适合资源有限或对性能要求较高的场景。 Redis Stream 主要用于消息队列&#xff08;MQ&#xff…...

时频转换 | Matlab基于递归图Reccurence Plots一维数据转二维图像方法

目录 基本介绍程序设计参考资料获取方式 基本介绍 时频转换 | Matlab基于递归图Reccurence Plots一维数据转二维图像方法 程序设计 clear clc close allfs 6400 ; % 数据采样频率 N 5120; % 信号的点数% 生成时间向量 t (0:N-1) / fs; % 生成正弦信号 x sin(2 * pi * 15…...

《手写Spring渐进式源码实践》实践笔记 (第二十一章 将ORM框架整合到Spring容器中)

文章目录 第二十一章 ORM框架整合Spring背景目标设计实现代码结构类图实现步骤 测试事先准备属性配置文件测试用例测试结果&#xff1a; 总结 第二十一章 ORM框架整合Spring 背景 MyBatis-Spring 能够实现 MyBatis 与 Spring 框架的无缝集成。它使得 MyBatis 能够参与 Spring…...

数据库管理-第267期 23ai:Oracle Data Redaction演示(20241128)

数据库管理267期 2024-11-286 数据库管理-第267期 23ai&#xff1a;Oracle Data Redaction演示&#xff08;20241128&#xff09;1 示例表及数据2 创建编校策略2.1 名字全编校2.2 电话部分编校 3 DML演示3.1 场景13.2 场景2 总结 数据库管理-第267期 23ai&#xff1a;Oracle Da…...

NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测,含优化前后对比

NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测&#xff0c;含优化前后对比 目录 NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测&#xff0c;含优化前后对比预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介…...

第六届国际科技创新学术交流会暨管理科学信息化与经济创新发展(MSIEID 2024)

重要信息 大会官网&#xff1a;msieid2024.iaecst.org &#xff08;点击了解大会&#xff0c;参会等内容&#xff09; 大会时间&#xff1a;2024年12月6-8日 大会地点&#xff1a;中国-广州 大会简介 随着全球化和信息化的不断深入&#xff0c;管理科学、信息化和经济发展…...