Java 快速转 C# 教程
以下是一个针对 Java 开发者快速转向 C# 的简明教程,重点对比 Java 与 C# 的异同,帮助你快速上手。
项目结构:
- .sln :解决方案文件,管理多个项目之间的依赖关系。
- .csproj :项目文件,定义目标框架(如 net6.0)、依赖项(NuGet 包或本地 DLL)。
- global.json: 控制 .NET SDK 行为
- 指定 .NET SDK 版本 :确保项目使用特定版本的 SDK 构建(避免本地环境版本不一致)。
- 控制项目扫描范围 :在多项目解决方案中,指定哪些目录参与构建。
- 启用/禁用 SDK 安装提示 :控制是否自动下载未安装的 SDK 版本。
- app.manifest: 应用程序清单文件
- 声明应用程序权限 (如以管理员身份运行)。
- 指定兼容性需求 (如支持的 Windows 版本)。
- 启用 Visual Studio 高 DPI 支持 。
- 配置应用程序隔离(Side-by-Side Assembly) 。
- Program.cs :程序入口(包含 Main 方法)。
一、基础语法对比
1. 变量与数据类型
Java | C# |
---|---|
int a = 10; | int a = 10; |
String name = "Hello"; | string name = "Hello"; |
final int MAX = 100; | const int MAX = 100; |
var list = new ArrayList<>(); (Java 10+) | var list = new List<string>(); |
C# 特色:
var
是隐式类型变量(编译器推断类型)。dynamic
类型可动态赋值(类似 Object)。
2. 拓展方法
C# 的扩展方法允许你为现有类型 (包括密封类、接口、甚至第三方库的类型)“添加”方法,而无需修改其源代码或继承。这是 C# 特有的语法特性,Java 中无直接等价物(需通过工具类或继承实现)。
定义扩展方法
- 必须在静态类 中定义。
- 第一个参数使用 this 关键字,表示该方法扩展的目标类型
// 静态类:扩展方法容器
public static class StringExtensions {// 扩展 string 类型的方法public static bool IsNullOrEmpty(this string str) {return string.IsNullOrEmpty(str);}
}
使用拓展方法
string name = null;// 调用扩展方法(如同实例方法)
if (name.IsNullOrEmpty()) {Console.WriteLine("Name is null or empty");
}
值得注意的是,拓展方法作为一个语法糖对应的可以解决在Java中 xxUtils 的工具类。同时具有以下注意:
- 无法访问内部方法/属性
- 若类型本身有同名方法,实例方法优先于扩展方法
- 避免过度使用,防止命名冲突(需显式导入命名空间)
3. 空运算符(Null Handling Operators)
C# 提供了强大的空值处理运算符,简化空值检查逻辑,避免 NullReferenceException
。
1. 空条件运算符(?.
)
用于安全访问对象的成员,若对象为 null
则返回 null
而非抛出异常。
Person person = GetPerson(); // 可能为 null// 安全访问属性和方法
int length = person?.Name?.Length ?? 0;
person?.SayHello();
对比 Java
-
Java 中需显式判断或使用
Optional
:int length = Optional.ofNullable(person).map(p -> p.getName()).map(String::length).orElse(0);
2. 空合并运算符(??
)
提供默认值,当左侧表达式为 null
时返回右侧值。
string name = null;
string displayName = name ?? "Guest"; // 如果 name 为 null,则使用 "Guest"
对比 Java
-
Java 中使用三元运算符或
Optional
:String displayName = name != null ? name : "Guest"; // 或 String displayName = Optional.ofNullable(name).orElse("Guest");
3. 空合并赋值运算符(??=
)
仅当变量为 null
时才赋值(C# 8.0+)。
string message = GetMessage();
message ??= "Default Message"; // 如果 GetMessage() 返回 null,则赋值为默认值
对比 Java
- Java 中需显式判断:
if (message == null) {message = "Default Message"; }
4. 非空断言运算符(!
)
告知编译器某个表达式不为 null
(C# 8.0+,用于可空引用类型上下文)。
string name = GetName()!; // 告诉编译器 GetName() 返回值不为 null
注意事项
- 空条件运算符返回的类型可能是
null
(需结合??
使用)。 - 空合并运算符适用于
null
检查,但不适用于值类型(如int
)。 - 使用
?.
和??
组合可显著减少防御性代码(如嵌套if
判断)。
二、面向对象编程
1. 类与对象
public class Person {// 字段private string name;// 属性(推荐封装字段)public string Name {get { return name; }set { name = value; }}// 构造函数public Person(string name) {this.name = name;}// 方法public void SayHello() {Console.WriteLine($"Hello, {name}");}
}
对比 Java:
- C# 使用
property
(属性)替代 Java 的getter/setter
。 this
关键字用法相同。
2. 继承与接口
// 继承
public class Student : Person {public Student(string name) : base(name) {}
}// 接口
public interface IRunnable {void Run();
}public class Car : IRunnable {public void Run() {Console.WriteLine("Car is running");}
}
对比 Java:
- C# 使用
:
替代 Java 的extends/implements
。 - 接口方法默认
public
,无需显式声明。
三、C# 特有特性
1. 委托与事件(Delegates & Events)
// 委托(类似 Java 的函数式接口)
// 定义一个名为 Notify 的委托类型,它表示一种方法模板,要求方法返回 void 并接受一个 string 参数
// 类比 Java :类似 Java 中的函数式接口(如 Consumer<String>),但 C# 的委托更直接,可以直接绑定方法。
public delegate void Notify(string message);// 事件
public class EventPublisher {// 声明一个事件 OnNotify,其类型是 Notify 委托。事件本质上是委托的安全封装,外部只能通过 +=/-= 订阅/取消订阅,不能直接调用(如 OnNotify.Invoke() 会报错)。public event Notify OnNotify;// 调用 OnNotify?.Invoke(...) 触发事件,?. 是空值保护操作符(避免空引用异常)。只有当至少有一个订阅者时,才会执行。public void TriggerEvent() {OnNotify?.Invoke("Event triggered!");}
}// 使用
EventPublisher publisher = new EventPublisher();
publisher.OnNotify += (msg) => Console.WriteLine(msg);
publisher.TriggerEvent();
-
订阅事件
使用+=
运算符将一个 lambda 表达式(msg) => Console.WriteLine(msg)
绑定到 OnNotify 事件。当事件触发时,会执行此方法。 -
触发事件
调用 TriggerEvent() 后,所有订阅者都会收到 “Event triggered!” 消息。
2. LINQ(Language Integrated Query)
var numbers = new List<int> { 1, 2, 3, 4, 5 };
var even = numbers.Where(n => n % 2 == 0).ToList();
对比 Java:
- 类似 Java Stream,但语法更简洁。
3. 异步编程(Async/Await)
public async Task DownloadDataAsync() {var client = new HttpClient();var data = await client.GetStringAsync("https://example.com");Console.WriteLine(data);
}
对比 Java:
- 类似
CompletableFuture
,但语法更直观。
Parallel.Invoke(() => {// 并行执行CPU密集任务
});
- 多个 CPU 密集型任务并行执行。
- 任务之间没有依赖。
- 不需要返回结果。
四、常用工具与框架
Java | C# |
---|---|
Maven/Gradle | NuGet(包管理) |
Spring | .NET Core(框架) |
JUnit | xUnit/NUnit(测试框架) |
IntelliJ IDEA | Visual Studio / IntelliJ Rider(IDE) |
五、项目结构与命名空间
// 文件:Program.cs
using System;
namespace MyApplication;class Program {static void Main(string[] args) {Console.WriteLine("Hello World!");}
}
对比 Java:
- C# 使用
namespace
组织代码,Java 使用package
。 - 程序入口是
Main
方法(Java 是main
)。
六、Java 到 C# 的常见转换技巧
Java | C# |
---|---|
System.out.println() | Console.WriteLine() |
ArrayList<T> | List<T> |
HashMap<K,V> | Dictionary<K,V> |
interface | interface |
enum | enum |
try-catch-finally | try-catch-finally |
在 C# 中,反射(Reflection) 是一种强大的机制,允许在运行时动态地获取类型信息、创建对象实例、调用方法、访问字段和属性等。对于从 Java 转向 C# 的开发者来说,反射的概念是相似的,但 C# 的反射 API 更加简洁、直观,并且与语言特性(如 dynamic
、nameof
、LINQ
)结合更紧密。
七、反射
反射是指在 运行时(runtime) 动态地:
- 获取类型信息(如类名、方法、属性等)
- 创建对象实例
- 调用方法、访问字段或属性
- 检查程序集(Assembly)的结构
Java 与 C# 反射的对比
功能 | Java | C# |
---|---|---|
获取类型对象 | MyClass.class 或 obj.getClass() | typeof(MyClass) 或 obj.GetType() |
获取方法 | clazz.getMethod("name", params...) | type.GetMethod("Name") |
调用方法 | method.invoke(obj, args) | method.Invoke(obj, args) |
获取属性 | clazz.getDeclaredField("name") | type.GetProperty("Name") |
获取程序集 | 无直接等价物 | Assembly.GetExecutingAssembly() |
动态创建实例 | clazz.newInstance() | Activator.CreateInstance(type) |
动态访问成员 | 通过 Field/Method 对象 | 通过 PropertyInfo/MethodInfo 等 |
1. 获取 Type
对象
// 通过类型名获取
Type type = typeof(string);// 通过对象获取
object obj = new Person();
Type type = obj.GetType();
2. 获取类成员信息(属性、方法、字段)
Type type = typeof(Person);// 获取所有属性
PropertyInfo[] properties = type.GetProperties();// 获取特定方法
MethodInfo method = type.GetMethod("SayHello");// 获取所有字段
FieldInfo[] fields = type.GetFields();
3. 动态创建实例
object person = Activator.CreateInstance(typeof(Person));
4. 调用方法
MethodInfo method = type.GetMethod("SayHello");
method.Invoke(person, null);
5. 访问属性
PropertyInfo prop = type.GetProperty("Name");
prop.SetValue(person, "Alice");
string name = (string)prop.GetValue(person);
6. 访问字段(不推荐,除非必要)
FieldInfo field = type.GetField("age", BindingFlags.NonPublic | BindingFlags.Instance);
field.SetValue(person, 30);
int age = (int)field.GetValue(person);
7. 获取程序集信息
Assembly assembly = Assembly.GetExecutingAssembly();
foreach (Type type in assembly.GetTypes()) {Console.WriteLine(type.Name);
}
8. 动态加载 DLL 并调用方法
Assembly assembly = Assembly.LoadFile("path/to/MyLibrary.dll");
Type type = assembly.GetType("MyNamespace.MyClass");
object instance = Activator.CreateInstance(type);
MethodInfo method = type.GetMethod("DoSomething");
method.Invoke(instance, null);
9. 使用 dynamic
替代部分反射操作
dynamic person = new ExpandoObject();
person.Name = "Bob";
person.SayHello = new Action(() => Console.WriteLine("Hello"));
person.SayHello(); // 无需反射即可调用
10. 使用 Expression
构建高性能的反射调用
Func<object> factory = Expression.Lambda<Func<object>>(Expression.New(typeof(Person))
).Compile();
object person = factory();
11. 使用 IL Emit
或 Source Generator
优化性能
对于高性能场景(如 ORM、序列化框架),可以使用:
System.Reflection.Emit
:动态生成 IL 代码Source Generator
(C# 9+):编译时生成代码,避免运行时反射
性能问题
- 反射调用比直接调用慢(约慢 10~100 倍)
- 频繁使用
GetMethod
、GetProperty
会增加开销
解决方案
- 缓存反射结果(如
MethodInfo
、PropertyInfo
) - 使用
Expression
构建委托 - 使用
dynamic
(在合适场景下) - 使用
System.Reflection.DispatchProxy
实现代理 - 使用
System.Text.Json
、Newtonsoft.Json
等库已优化的反射机制
安全性
- 可以访问私有成员(需设置
BindingFlags.NonPublic
) - 在部分受限环境中(如 UWP、AOT 编译)可能受限
Java 到 C# 反射的转换技巧
Java | C# |
---|---|
Class.forName("MyClass") | Type.GetType("MyNamespace.MyClass") |
clazz.newInstance() | Activator.CreateInstance(type) |
method.invoke(obj, args) | method.Invoke(obj, args) |
clazz.getDeclaredMethods() | type.GetMethods() |
clazz.getDeclaredFields() | type.GetFields() |
clazz.getDeclaredField("name") | type.GetField("Name") |
clazz.getDeclaredMethod("name", params...) | type.GetMethod("Name", parameterTypes) |
clazz.getInterfaces() | type.GetInterfaces() |
八、引入包(NuGet 包管理)
在 C# 中,NuGet 是官方推荐的包管理系统,类似于 Java 中的 Maven/Gradle。它用于管理项目依赖项(如第三方库、框架等)。
NuGet 包典型命名规则:[组织名].[功能模块].[平台/框架]
1. NuGet 的作用
- 管理项目依赖(如
Newtonsoft.Json
、EntityFramework
等) - 自动下载、安装、更新依赖包
- 支持跨平台(Windows、Linux、macOS)
2. 常用方式
方法 1:通过 Visual Studio 引入
- 右键项目 → Manage NuGet Packages
- 在 Browse 标签页搜索包名(如
Newtonsoft.Json
) - 点击 Install 安装包
- 安装完成后,会自动添加到项目中
方法 2:通过 CLI 命令行
# 安装包
dotnet add package Newtonsoft.Json# 更新包
dotnet add package Newtonsoft.Json --version 13.0.1# 卸载包
dotnet remove package Newtonsoft.Json
方法 3:手动编辑 .csproj
文件
在项目文件中添加 <PackageReference>
:
<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFramework>net6.0</TargetFramework></PropertyGroup><ItemGroup><PackageReference Include="Newtonsoft.Json" Version="13.0.1" /></ItemGroup>
</Project>
3. NuGet 源配置
默认源是 nuget.org,但也可以配置私有源(如公司内部源):
# 添加私有源
dotnet nuget add source https://mycompany.com/nuget -n MyCompany
4. 对比 Java
功能 | Java (Maven/Gradle) | C# (NuGet) |
---|---|---|
包管理 | pom.xml / build.gradle | .csproj |
安装包 | mvn install / gradle build | dotnet add package |
私有仓库 | settings.xml / repositories { maven { url "..." } } | dotnet nuget add source |
九、引用本地的 DLL
有时你需要引用本地的 DLL 文件(如团队内部开发的库、第三方未提供 NuGet 包的库),可以通过以下方式实现。
1. 添加本地 DLL 引用
方法 1:通过 Visual Studio 添加
- 右键项目 → Add → Reference…
- 在弹出窗口中选择 Browse
- 浏览并选择本地 DLL 文件(如
MyLibrary.dll
) - 点击 Add → OK
方法 2:手动编辑 .csproj
文件
<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFramework>net6.0</TargetFramework></PropertyGroup><ItemGroup><Reference Include="MyLibrary"><HintPath>..\Libraries\MyLibrary.dll</HintPath></Reference></ItemGroup>
</Project>
2. 确保 DLL 被正确复制到输出目录
在 .csproj
中添加以下配置,确保 DLL 被复制到 bin
目录:
<ContentWithTargetPath Include="..\Libraries\MyLibrary.dll"><TargetPath>MyLibrary.dll</TargetPath><CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</ContentWithTargetPath>
3. 加载本地 DLL 的运行时行为
- Windows:直接复制到
bin\Debug\net6.0
目录即可 - Linux/macOS:确保 DLL 与主程序在同一目录,或设置
LD_LIBRARY_PATH
/DYLD_LIBRARY_PATH
4. 注意事项
- 强名称签名(Strong Name):如果 DLL 是强名称签名的,引用时需确保签名一致
- 平台相关性:某些 DLL 仅支持特定平台(如 Windows 专用的 DLL)
- 版本冲突:多个 DLL 依赖相同库的不同版本时,可能出现冲突(需手动绑定重定向)
常见问题与解决方案
1. 无法找到 DLL
- 原因:DLL 未正确复制到输出目录
- 解决:检查
.csproj
中是否设置了<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
2. 加载 DLL 失败
- 原因:DLL 依赖的其他库缺失
- 解决:使用
Fusion Log Viewer
(fuslogvw.exe
)查看绑定失败日志
3. 版本冲突
- 原因:多个 DLL 依赖相同库的不同版本
十、DllImport(平台调用,P/Invoke)
在 C# 中,[DllImport("xxx.dll")]
是 平台调用(Platform Invocation Services,P/Invoke) 的核心特性,用于直接调用 非托管代码(如 Windows API、C/C++ 编写的 DLL)。这是 Java 中没有的特性(Java 需要通过 JNI 调用本地代码)。
1. 基本概念
[DllImport]
是 System.Runtime.InteropServices
命名空间下的特性(Attribute),用于声明某个方法的实现来自外部 DLL。它允许你在 C# 中直接调用 Windows API 或其他非托管函数。
2. 使用步骤
步骤 1:引入命名空间
using System.Runtime.InteropServices;
步骤 2:声明外部方法
使用 [DllImport("dll名称")]
特性修饰方法,指定 DLL 名称和调用约定(Calling Convention)。
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);
步骤 3:调用方法
MessageBox(IntPtr.Zero, "Hello from C#", "Greeting", 0);
3. 参数说明
参数 | 说明 |
---|---|
dllName | DLL 文件名(如 "user32.dll" ) |
CharSet | 字符集(CharSet.Ansi 、CharSet.Unicode 、CharSet.Auto ) |
CallingConvention | 调用约定(默认为 CallingConvention.Winapi ,也可指定 ThisCall 、StdCall 等) |
EntryPoint | 可选,指定 DLL 中函数的入口点(当方法名与 DLL 函数名不同时使用) |
4. 常见示例
示例 1:调用 user32.dll
的 MessageBox
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int MessageBox(IntPtr hWnd, string text, string caption, uint type);// 调用
MessageBox(IntPtr.Zero, "Hello from C#", "Greeting", 0);
示例 2:调用 kernel32.dll
的 GetTickCount
[DllImport("kernel32.dll")]
public static extern uint GetTickCount();// 调用
uint tickCount = GetTickCount();
Console.WriteLine($"System uptime: {tickCount} ms");
示例 3:调用 gdi32.dll
的 CreateDC
[DllImport("gdi32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr CreateDC(string lpszDriver, string lpszDevice, string lpszOutput, IntPtr lpInitData);// 调用
IntPtr hdc = CreateDC("DISPLAY", null, null, IntPtr.Zero);
5. 结构体与指针传参
当调用的函数需要结构体或指针参数时,需使用 ref
、out
或 IntPtr
,并可能需要使用 StructLayout
和 MarshalAs
来控制内存布局。
示例:调用 user32.dll
的 GetWindowRect
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{public int Left;public int Top;public int Right;public int Bottom;
}[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);// 使用
RECT rect;
bool success = GetWindowRect(hWnd, out rect);
if (success)
{Console.WriteLine($"Window Rect: {rect.Left}, {rect.Top}, {rect.Right}, {rect.Bottom}");
}
6. 注意事项
安全性
- 调用非托管代码可能带来 安全风险(如缓冲区溢出、非法访问内存)。
- 需要 Full Trust 权限 才能执行 P/Invoke 操作。
平台依赖性
DllImport
仅适用于 Windows 平台(除非使用跨平台兼容的库)。- 某些 DLL(如
user32.dll
、kernel32.dll
)是 Windows 系统库,其他平台无法直接使用。
性能
- P/Invoke 调用比纯托管代码慢(涉及 上下文切换 和 参数封送)。
- 频繁调用时应考虑缓存结果或使用
unsafe
代码优化。
参数封送(Marshaling)
- 需要特别注意 数据类型映射(如
int
对应Int32
,char*
对应string
)。 - 使用
MarshalAs
明确指定封送方式(如UnmanagedType.LPStr
、UnmanagedType.BStr
)。
7. 示例:封装一个 Windows API 工具类
using System;
using System.Runtime.InteropServices;public static class Win32Api
{[DllImport("user32.dll", CharSet = CharSet.Auto)]public static extern int MessageBox(IntPtr hWnd, string text, string caption, uint type);[DllImport("kernel32.dll")]public static extern uint GetTickCount();[StructLayout(LayoutKind.Sequential)]public struct RECT{public int Left;public int Top;public int Right;public int Bottom;}[DllImport("user32.dll")][return: MarshalAs(UnmanagedType.Bool)]public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
}// 使用
class Program
{static void Main(){// 调用 MessageBoxWin32Api.MessageBox(IntPtr.Zero, "Hello from C#", "Greeting", 0);// 获取系统运行时间uint tickCount = Win32Api.GetTickCount();Console.WriteLine($"System uptime: {tickCount} ms");// 获取窗口位置Win32Api.RECT rect;bool success = Win32Api.GetWindowRect(new IntPtr(0x123456), out rect);if (success){Console.WriteLine($"Window Rect: {rect.Left}, {rect.Top}, {rect.Right}, {rect.Bottom}");}}
}
通过掌握 DllImport
和 P/Invoke,你可以在 C# 中直接调用 Windows API 或其他非托管函数,实现更底层的系统级操作。结合良好的封装和错误处理,可以显著提升程序的功能性和灵活性。
相关文章:
Java 快速转 C# 教程
以下是一个针对 Java 开发者快速转向 C# 的简明教程,重点对比 Java 与 C# 的异同,帮助你快速上手。 项目结构: .sln :解决方案文件,管理多个项目之间的依赖关系。.csproj :项目文件,定义目标框…...
Linux面试题集合(5)
把文件1的内容追加到文件2 cat 文件1>>文件2 把文件1和文件2合并成文件3 cat 文件1 文件2>文件3 使用less查看文件时,搜寻ab字符 /ab 用more和less如何查看文件 more: CtrlF -- 向下滚动一屏 CtrlB -- 返回上一屏 f -- 向下翻屏 b -- 向上翻屏 …...
OpenCV 光流估计:从原理到实战
在计算机视觉领域,光流估计(Optical Flow Estimation)是一项至关重要的技术,它能够通过分析视频序列中图像像素的运动信息,捕捉物体和相机的运动情况。OpenCV 作为强大的计算机视觉库,为我们提供了高效实现…...
星火杯大模型应用创新赛学习笔记——datawhale
背景——赛事任务 聚焦大学生真实应用场景,围绕阅读、写作、搜索、聊天、问答等方向,聚焦口语学习、面试招聘、论文写作、学习笔记等一个或多个细分应用场景,完成具有创新性、实用性的应用方案,呈现可演示、可落地、具备商业价值…...
Ulyssess Ring Attention
https://zhuanlan.zhihu.com/p/689067888https://zhuanlan.zhihu.com/p/689067888DeepSpeed Ulysess:切分Q、K、V序列维度,核心卖点保持通信复杂度低,和GPU数无关,和序列长度呈线性关系。 Ring-Attention:切分Q、K、V序…...
c++重要知识点汇总(不定期更新)
前言 真心希望各位dalao点赞收藏~ 树状数组 作用:高效求出区间前缀和,允许进行修改操作。 举个栗子: 刚开始有8项,分别为1-8。 首先构建二叉树: 1-8/ |/ |/ |/ |/ |1-4 5-8/ | / |/ | / |1-…...
重排序模型解读 mxbai-rerank-base-v2 强大的重排序模型
mxbai-rerank-base-v2 强大的重排序模型 模型介绍benchmark综合评价安装 模型介绍 mxbai-rerank-base-v2 是 Mixedbread 提供的一个强大的重排序模型,旨在提高搜索相关性。该模型支持多语言,特别是在英语和中文方面表现出色。它还支持代码和 SQL 排序&a…...
电子电路:到底该怎么理解电容器的“通交流阻直流”?
电容器“通交流,阻直流”的特性源于其对不同频率电信号的响应差异,具体可通过以下步骤理解: 一、电容器的基本结构与充放电机制 结构:由两个导体极板(如金属)和中间的绝缘介质组成。充放电过程:…...
售前工作.工作流程和工具
第一部分 售前解决方案及技术建议书的制作 售前解决方案编写的标准操作步骤SOP: 售前解决方案写作方法_哔哩哔哩_bilibili 第二部分 投标过程关键活动--商务标技术方案 1. 按项目管理--售前销售项目立项 销售活动和销售线索的跟踪流程和工具 1)拿到标书ÿ…...
ORACLE数据库实例报错ORA-00470: LGWR process terminated with error宕机问题分析报告
服务概述 10月21号03:22分,BOSS数据库实例发生异常宕机;工程师及时响应此问题并对此故障原因进行分析及相关建议,详细的故障情况及相关日志、TRACE文件的分析及总结、建议,请参阅本文档。 hzboss数据库实例宕机分析 4.1 数据库层面日志的分…...
深度学习---知识蒸馏(Knowledge Distillation, KD)
一、知识蒸馏的本质与起源 定义: 知识蒸馏是一种模型压缩与迁移技术,通过将复杂高性能的教师模型(Teacher Model)所学的“知识”迁移到轻量级的学生模型(Student Model),使学生模型在参数量和计…...
AI日报 - 2024年5月17日
🌟 今日概览 (60秒速览) ▎🤖 大模型前沿 | OpenAI推出自主编码代理Codex;Google DeepMind发布Gemini驱动的编码代理AlphaEvolve,能设计先进算法;Meta旗舰AI模型Llama 4 Behemoth发布推迟。 Codex能并行处理多任务&…...
OAuth2.0
OAuth2.0 1. 什么是OAuth2.02.OAuth2.0的应用场景3. OAuth2.0基本概念4. 经典OAuth2.0认证流程5. 四种授权模式5.1 授权码模式(Authorization Code Grant)5.2 隐式授权(Implicit Grant)5.3 密码模式(Resource Owner Pa…...
deepin v23.1 音量自动静音问题解决
有的机器上会有音量自动静音问题, 如果你的电脑上也遇到, 这个问题是 Linux 内核的原因, ubuntu上也可能会遇到相同问题(比如你升级了最新内核6.14), 而我测试得6.8.0的内核是不会自动静音的. Index of /mainline 到上面这个链接(linux 内核的官方链接)下载6.8.0的内核, s…...
Spring Security 集成指南:避免 CORS 跨域问题
Spring Security 集成指南:避免 CORS 跨域问题 在现代 Web 应用开发中,前后端分离架构已成为主流。当我们使用 Spring Security 保护后端 API 时,经常会遇到跨域资源共享(CORS)问题。这篇文章将详细解析 Spring Secur…...
stack和queue简单模拟实现
stackreverse_iteratorqueuepriority_queue仿函数具体代码 stack Stacks are a type of container adaptor, specifically designed to operate in a LIFO context (last-in first-out), where elements are inserted and extracted only from one end of the container. 上述描…...
2.单链表两数相加(java)
题目描述: 分析: 1.首先创建一个虚拟节点 ListNode dummy new ListNode(-1);再创建一个节点来保存虚拟节点,因为使用虚拟节点来移动,如果不保存,最后就会丢失。保存虚拟节点:ListNode pdummy; 2.进位标志…...
JDBC 的编写步骤及原理详解
一、JDBC 简介 JDBC(Java DataBase Connectivity)即 Java 数据库连接,是 Java 语言用于操作数据库的一套 API。它为多种关系数据库提供了统一的访问方式,允许 Java 程序与不同类型的数据库(如 MySQL、Oracle、SQL Ser…...
AIStarter Windows 版本迎来重磅更新!模型插件工作流上线,支持 Ollama / ComfyUI 等多平台本地部署模型统一管理
如果你正在使用 AIStarter 工具进行本地 AI 模型部署 ,那么这条消息对你来说非常重要! 在最新推出的 AIStarter Windows 正式版更新中 ,官方对整个平台进行了功能重构和性能优化,尤其是新增了「模型插件工作流 」功能,…...
卸载和安装JDK
文章目录 卸载JDK安装JDK 卸载JDK 删除java的安装目录删除JAVA_HOME删除path下关于java的目录在cmd命令提示符中输入 java -version 安装JDK 浏览器搜索JDK8 下载电脑对应版本 双击安装JDK 记住安装的路径 配置环境变量 我的电脑 -> 右键 -> 属性 新建系统环境变量…...
【蓝桥杯省赛真题51】python石头运输 第十五届蓝桥杯青少组Python编程省赛真题解析
python石头运输 第十五届蓝桥杯青少年组python比赛省赛真题详细解析 博主推荐 所有考级比赛学习相关资料合集【推荐收藏】1、Python比赛 信息素养大赛Python编程挑战赛 蓝桥杯python选拔赛真题详解 <...
USRP 射频信号 采集 回放 系统
USRP 射频信号采集回放系统 也可以叫做: 利用宽带RF录制和回放系统实现6G技术研究超宽带射频信号采集回放系统使用NI USRP平台实现射频信号录制和回放操作演示USRP也能实现多通道宽带信号流盘回放了! 对于最简单的实现方法就是使用LabVIEW进行实现 采…...
产品经理入门(2)产品体验报告
产品体验报告大纲:重点在产品体验——优点。 1.产品概括 可以从各大平台搜产品介绍。 2.市场分析 按照产品方向分析各个指标——包括有效使用时间,市场规模等。 3. 用户分析——对用户通过各项指标画像。 4.产品体验——对各项功能与设计的体验。 5.报告总结...
区块链基本理解
文章目录 前言一、什么是分布式账本(DLT)二、什么是P2P网络?二、共识算法三、密码算法前言 区块链是由一个一个数据块组成的链条,按照时间顺序将数据块逐一链接,通过哈希指针链接,所有的数据块共同维护一份分布式账本(DLT),每个节点(可以理解为一个玩家,一台计算机)都拥…...
数字万用表与指针万用表使用方法及注意事项
在电子测量领域,万用表是极为常用的工具,数字万用表和指针万用表各具特点。熟练掌握它们的使用方法与注意事项,能确保测量的准确性与安全性。下面为您详细介绍: 一 、数字万用表按钮功能 > 进入及退出手动量程模式 每 按 […...
C语言查漏补缺
1、数组初始化时,例如char arr[5] "abcde",因为字符串中有6个字符,即末尾还有个结束符,但是数组容量为5,所以仅接纳5个字符,末尾的结束符不会被接纳,故而这样的字符数组在直接输出时…...
【JDBC】JDBC常见错误处理方法及驱动的加载
MySQL8中数据库连接的四个参数有两个发生了变化 String driver "com.mysql.cj.jdbc.Driver"; String url "jdbc:mysql://127.0.0.1:3306/mydb?useSSLfalse&useUnicodetrue&characterEncodingutf8&serverTimezoneAsia/Shanghai"; 或者Strin…...
从紫光集团看基本财务分析
PE 46PE 代表投资人对他的期望是它的业绩至少要增长50%才算及格。 但实际业绩 一年不如一年. 所以,这个PE 应该是 业绩倒退了,但是市值还没有掉下去,导致运算的结果处在高PE阶段。 那么随着股价的下跌,这个数字会慢慢变小。 当然…...
软件调试纵横谈-17-win32堆的调试支持
17.Win32堆的调试支持_哔哩哔哩_bilibili 继续边看录像边做实验。 堆上的内存时用size表达的,组成一个链表。 创建一个FreCheck应用 上次看heap,直接使用下载的文件,本次要做实验了,就需要自己动手,搞个VC proje…...
CANoe CAPL TCP DoIP通信问题
目录 问题Class: TcpSocketdemo示例client注释掉配置TCP/IP stack改demo代码过滤IP,与需要的IP建立连接问题 使用CANoe进行DoIP通信时,如果是标准的DoIP节点,可以使用DoIP相关函数进行通信。 以下两篇文章是按照此方式实现的。 十六、DoIP诊断通信 1 (专栏:从零开始搭建…...
理解 plank 自动生成的 copyWithBlock: 方法
当你使用 plank 命令自动生成一个类时 ./plank --objc_class_prefix=PUG --no_runtime --no_recursive user.json分析 在 JSON 目录下, 执行如上命令后, 生成的 PUGUser 对象, 会自带 copyWithBlock: 方法, 这个方法是用来做什么的 ? copyWithBlock: (注意末尾有一个冒号,因…...
FreeCAD源码分析: Transaction实现原理
本文阐述FreeCAD中Transaction的实现原理。 注1:限于研究水平,分析难免不当,欢迎批评指正。 注2:文章内容会不定期更新。 一、概念 Ref. from What is a Transaction? A transaction is a group of operations that have the f…...
黑马点评-用户登录
文章目录 用户登录发送短信验证码注册/登录校验登录 用户登录 发送短信验证码 public Result sendCode(String phone, HttpSession session) {// 1.校验手机号if (RegexUtils.isPhoneInvalid(phone)) {// 2.如果不符合,返回错误信息return Result.fail("手机…...
OpenAI新发布Codex的全面解析
一 . 介绍 人工智能技术的飞速发展正在重塑各行各业的运作方式,特别是在软件工程领域。随着生成式AI模型能力的不断提升,代码生成与软件开发领域正经历一场前所未有的变革。OpenAI作为人工智能领域的领军企业,其每一次技术突破都备受全球科技…...
【AI算法工程师面试指北】ResNet为什么用avgpool结构?
在ResNet(残差网络)中,最后使用平均池化(AvgPool)结构主要有以下几个关键原因,这些设计与网络的效率、性能和泛化能力密切相关: 1. 减少参数与计算量,避免过拟合 替代全连接层的冗…...
单调栈和单调队列
一、单调栈 1、使用场景 解决元素左 / 右侧第一个比他大 / 小的数字。 2、原理解释 用栈解决,目标是栈顶存储答案。 以元素左侧第一个比他小为例: (1)遍历顺序一定是从左向右。 (2)由于栈顶一定是答…...
DeepSeek-R1 Supervised finetuning and reinforcement learning (SFT + RL)
DeepSeek-R1Supervised finetuning and reinforcement learning (SFT RL) 好啊,我们今天的直播会非常透彻的跟大家系统性的分享一下整个agents AI就大模型智能体系统和应用程序。我们在做开发的时候,或者实际做企业级的产品落地的时候,你必…...
【部署】读取excel批量导入dify的QA知识库
回到目录 【部署】读取excel批量导入dify的QA知识库 0. 背景 dify的知识库支持QA模式,分段效果不算太理想,在我们的项目里面,手工编辑高质量QA文档,没有办法批量导入系统。 项目dify_import,支持读取excel文件批量导…...
Scanner对象
文章目录 Scanner对象基本语法使用next()接受使用nextLine()接受小案例总结 Scanner对象 java给我们提供了一个工具类,我们可以获取用户的输入 java.util.Scanner是java5的新特性,我们可以通过Scanner类来获取用户的输入 基本语法 Scanner s new Sc…...
Java 面向对象详解和JVM底层内存分析
先关注、点赞再看、人生灿烂!!!(谢谢) 神速熟悉面向对象 表格结构和类结构 我们在现实生活中,思考问题、发现问题、处理问题,往往都会用“表格”作为工具。实际上,“表格思维”就是…...
PIC16F18877 ADC 代码
这段代码是为PIC16F18877微控制器设计的嵌入式系统程序,主要实现了LCD显示屏控制、DHT11温湿度传感器数据采集和ADC模拟量读取三大功能。程序通过配置32MHz内部时钟源初始化系统,使用4位数据总线驱动LCD显示模块,定时读取DHT11传感器获取温湿度数据并校验,同时通过ADC通道采…...
Visual Studio2022跨平台Avalonia开发搭建
由于我已经下载并安装了 VS2022版本,这里就跳过不做阐述。 1.安装 Visual Studio 2022 安装时工作负荷Tab页勾选 “.NET 桌面开发” 和“Visual Studio扩展开发” ,这里由于不是用的微软的MAUI,所以不用选择其他的来支持跨平台开发&a…...
灵光一现的问题和常见错误1
拷贝构造函数显式写,编译器还会自动生成默认构造函数吗,还有什么函数会出现这种问题 在C中,当类显式定义某些特殊成员函数时,编译器可能不再自动生成其他相关函数。以下是详细分析: I. 显式定义拷贝构造函数对默认构造…...
React学习(二)-变量
也是很无聊,竟然写这玩意,毕竟不是学术研究,普通工作没那么多概念性东西,会用就行╮(╯▽╰)╭ 在React中,变量是用于存储和管理数据的基本单位。根据其用途和生命周期,React中的变量可以分为以下几类: 1. 状态变量(State) 用途:用于存储组件的内部状态,状态变化会触…...
我的世界模组开发——特征(2)
原版代码 AbstractHugeMushroomFeature 以下是对AbstractHugeMushroomFeature类代码的逐段解析,结合Minecraft游戏机制和蘑菇形态学特征进行说明: 1. 类定义与继承关系 public abstract class AbstractHugeMushroomFeature extends Feature<HugeMushroomFeatureConfigu…...
中国30米年度土地覆盖数据集及其动态变化(1985-2022年)
中文名称 中国30米年度土地覆盖数据集及其动态变化(1985-2022年) 英文名称:The 30 m annual land cover datasets and its dynamics in China from 1985 to 2022 CSTR:11738.11.NCDC.ZENODO.DB3943.2023 DOI 10.5281/zenodo.8176941 数据共享方式:…...
2000 元以下罕见的真三色光源投影仪:雷克赛恩Cyber Pro1重新定义入门级投影体验
当性价比遇上技术瓶颈 在 2000元以下的1080P投影仪,单LCD 技术长期主导。而三色光源的DLP和3LCD真1080P都在4000元以上。 单LCD投影为纯白光光源,依赖CF滤光膜导致光效低下,普遍存在" 色彩失真 " 等问题。数据显示,该价…...
数学复习笔记 19
前言 向量收尾。线代大概是学了一半了。 向量 向量可以认为是一个矩阵。 线性组合 前面加一个系数就可以了。线性组合和线性表示实际上就是一个意思。 线性相关性 实际上就是内部的向量,至少有一个可以用其他向量表示出来。存在一种情况,系数不全…...
信息收集+初步漏洞打点
目标:理解信息收集在渗透测试中的意义,熟悉常用工具用法,完成基本打点测试 一.理论学习: 模块内容说明信息收集分类主动信息收集 vs 被动信息收集目标发现子域名、IP、端口、子站点、目录、接口技术指纹识别Web框架(如…...
计算机视觉与深度学习 | Python实现EMD-SSA-VMD-LSTM时间序列预测(完整源码和数据)
EMD-SSA-VMD-LSTM混合模型 一、环境配置与依赖二、数据生成(示例数据)三、多级信号分解1. 经验模态分解(EMD)2. 奇异谱分析(SSA)3. 变分模态分解(VMD) 四、数据预处理1. 归一化处理2…...