聊点基础---Java和.NET开发技术异同全方位分析
1. C#语言基础
1.1 C#语法概览
欢迎来到C#的世界!对于刚从Java转过来的开发者来说,你会发现C#和Java有很多相似之处,但C#也有其独特的魅力和强大之处。让我们一起来探索C#的基本语法,并比较一下与Java的异同。
程序结构
C#程序的基本结构与Java非常相似。这里是一个简单的C#程序:
using System;namespace HelloWorld
{class Program{static void Main(string[] args){Console.WriteLine("Hello, World!");}}
}
对比Java的版本:
public class HelloWorld {public static void main(String[] args) {System.out.println("Hello, World!");}
}
你会发现,两者的结构非常相似。主要的区别在于:
-
C#使用
using关键字导入命名空间,而Java使用import。 -
C#的
Main方法是static void Main(string[] args),而Java是public static void main(String[] args)。 -
C#使用
Console.WriteLine()输出,Java使用System.out.println()。
在c# 9的最新语法上还可以更简洁,是的没错,只需要一行代码,不需要写命名空间,类,方法,直接编写代码,当然这个方式只存在c#9以上的版本。
Console.WriteLine("Hello, World!");
命名约定
C#和Java的命名约定有些许不同:
-
C#中,方法名和属性名通常使用PascalCase(如
CalculateTotal)。 -
局部变量和参数使用camelCase(如
totalAmount)。 -
接口名称以"I"开头(如
IDisposable)。
而Java中:
-
方法名和变量名都使用camelCase。
-
接口名称不需要特殊前缀。
数据类型
C#和Java的基本数据类型很相似,但也有一些区别:
C#:
int x = 10;
long y = 100L;
float f = 3.14f;
double d = 3.14;
decimal m = 100.50m;
bool isTrue = true;
char c = 'A';
string s = "Hello";
Java:
int x = 10;
long y = 100L;
float f = 3.14f;
double d = 3.14;
boolean isTrue = true;
char c = 'A';
String s = "Hello";
注意C#特有的decimal类型,它提供了更高精度的小数计算,特别适合金融相关的应用。
数组
C#和Java的数组声明稍有不同:
C#:
int[] numbers = new int[5];
string[] names = { "Alice", "Bob", "Charlie" };
Java:
int[] numbers = new int[5];
String[] names = { "Alice", "Bob", "Charlie" };
控制结构
C#和Java的控制结构几乎完全相同:
// if语句
if (condition)
{// code
}
else if (anotherCondition)
{// code
}
else
{// code
}// for循环
for (int i = 0; i < 10; i++)
{// code
}// while循环
while (condition)
{// code
}// switch语句
switch (variable)
{case value1:// codebreak;case value2:// codebreak;default:// codebreak;
}
这些结构在Java中的写法完全相同。
异常处理
C#和Java的异常处理也非常相似:
C#:
try
{// 可能抛出异常的代码
}
catch (SpecificException ex)
{// 处理特定异常
}
catch (Exception ex)
{// 处理一般异常
}
finally
{// 总是要执行的代码
}
Java的异常处理结构完全相同。
注释
C#和Java的注释方式也是一样的:
// 这是单行注释/*
* 这是多行注释
*//// <summary>
/// 这是XML文档注释,类似于Java的Javadoc
/// </summary>
小结
通过这个概览,你可以看到C#和Java在语法上有很多相似之处。这意味着作为一个Java开发者,你可以相对轻松地过渡到C#。然而,C#也有其独特的特性和语法糖,使得某些任务更加简洁和高效。
在接下来的章节中,我们将深入探讨C#的各个方面,包括它独特的特性如属性、事件、委托等。这些概念可能对Java开发者来说比较新,但它们是C#强大功能的关键所在。记住,学习一门新的语言不仅是学习语法,更是学习一种新的思维方式。让我们继续我们的C#学习之旅吧!
1.2 变量和数据类型
在C#中,变量和数据类型是编程的基础。对于从Java转过来的开发者来说,你会发现很多熟悉的概念,但C#也有一些独特的特性。让我们深入探讨C#的变量和数据类型,并与Java进行比较。
变量声明
C#和Java的变量声明方式非常相似:
C#:
int age = 25;
string name = "Alice";
bool isStudent = true;
Java:
int age = 25;
String name = "Alice";
boolean isStudent = true;
主要区别在于:
-
C#使用
string(小写),而Java使用String(大写)。 -
C#使用
bool,而Java使用boolean。
基本数据类型
C#和Java都有类似的基本数据类型,但C#提供了更多的选择:
| C# 类型 | Java 类型 | 大小 | 范围 |
|---|---|---|---|
| sbyte | byte | 8位 | -128 到 127 |
| byte | - | 8位 | 0 到 255 |
| short | short | 16位 | -32,768 到 32,767 |
| ushort | - | 16位 | 0 到 65,535 |
| int | int | 32位 | -2^31 到 2^31-1 |
| uint | - | 32位 | 0 到 2^32-1 |
| long | long | 64位 | -2^63 到 2^63-1 |
| ulong | - | 64位 | 0 到 2^64-1 |
| float | float | 32位 | ±1.5x 10^-45 到 ±3.4 x 10^38 |
| double | double | 64位 | ±5.0 × 10^-324 到 ±1.7 × 10^308 |
| decimal | - | 128位 | ±1.0 x 10^-28 到 ±7.9 x 10^28 |
| char | char | 16位 | U+0000 到 U+FFFF |
| bool | boolean | 8位 | true或 false |
注意C#提供了无符号整数类型(byte, ushort, uint, ulong)和decimal类型,这些在Java中是没有的。
值类型和引用类型
C#和Java都区分值类型和引用类型,但C#的处理更加灵活:
-
值类型(Value Types):
-
在C#中,所有的基本数据类型(int, float, bool等)和struct都是值类型。
-
值类型直接存储它们的数据。
-
-
引用类型(Reference Types):
-
类(class)、接口(interface)、委托(delegate)和数组(array)是引用类型。
-
引用类型存储对其数据(对象)的引用。
-
C#独特之处:
-
C#允许使用
struct关键字创建自定义值类型。 -
C#的
string虽然是引用类型,但具有值类型的一些特性(如不可变性)。
可空类型
C#引入了可空类型的概念,这在Java中是没有的:
int? nullableInt = null;
bool? nullableBool = null;
可空类型允许值类型也可以赋值为null,这在处理数据库或用户输入时非常有用。
var关键字
C#提供了var关键字用于隐式类型声明:
var x = 10; // 编译器推断x为int类型
var name = "Alice"; // 编译器推断name为string类型
Java从Java 10开始引入了类似的var关键字,但使用范围更受限制。
常量
C#使用const关键字声明常量:
const int MaxValue = 100;
const string AppName = "MyApp";
Java使用final关键字:
final int MAX_VALUE = 100;
final String APP_NAME = "MyApp";
枚举
C#和Java都支持枚举,但C#的枚举更加灵活:
C#:
enum Days
{Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
}// 可以指定底层类型和值
enum Status : byte
{Active = 1,Inactive = 0,Suspended = 2
}
Java:
enum Days {MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY
}
C#的枚举可以指定底层类型,而Java的枚举实际上是特殊的类。
类型转换
C#提供了多种类型转换方法:
-
隐式转换:
int x = 10; long y = x; // 隐式转换,不需要显式转换 -
显式转换(强制类型转换):
doubled = 3.14; int i = (int)d; // 显式转换,可能会损失精度 -
使用Convert类:
string s = "123"; int i = Convert.ToInt32(s); -
使用Parse方法:
string s = "3.14"; double d = double.Parse(s); -
TryParse方法(安全转换):
string s = "123"; int result; if (int.TryParse(s, out result)) {Console.WriteLine($"Converted value: {result}"); } else {Console.WriteLine("Conversion failed"); }
Java的类型转换相对简单一些,主要依赖于强制类型转换和包装类的方法。
小结
虽然C#和Java在变量和数据类型方面有很多相似之处,但C#提供了更多的选择和灵活性。C#的可空类型、更丰富的基本数据类型、更灵活的枚举和方便的类型转换方法,都为开发者提供了更多的工具来处理各种数据场景。
作为一个从Java转向C#的开发者,你会发现这些额外的特性可以让你的代码更加简洁和表达力更强。在实际编程中,合理利用这些特性可以提高代码的可读性和性能。
在接下来的学习中,我们将深入探讨C#的更多高级特性,如属性、索引器、泛型等。这些概念将进一步展示C#相对于Java的独特优势。继续保持学习的热情,你会发现C#是一个功能丰富、富有表现力的语言!
1.3 运算符和表达式
C#的运算符和表达式与Java有很多相似之处,但也有一些独特的特性。让我们深入了解C#的运算符和表达式,并与Java进行比较。
算术运算符
C#和Java的算术运算符基本相同:
-
加法 (+)
-
减法 (-)
-
乘法 (*)
-
除法 (/)
-
取模 (%)
示例:
int a = 10, b = 3;
int sum = a + b; // 13
int difference = a - b; // 7
int product = a * b; // 30
int quotient = a / b; // 3 (整数除法)
int remainder = a % b; // 1
注意:C#和Java在整数除法时都会舍去小数部分,如果要得到精确结果,至少有一个操作数应该是浮点数。
赋值运算符
C#和Java的赋值运算符也基本相同:
-
简单赋值 (=)
-
复合赋值 (+=, -=, *=, /=, %=)
C#特有的复合赋值运算符:
-
??= (空合并赋值运算符,C# 8.0引入)
示例:
int x = 5;
x += 3; // 等同于 x = x + 3
x -= 2; // 等同于 x = x - 2string name = null;
name ??= "John"; // 如果name为null,赋值为"John"
比较运算符
C#和Java的比较运算符完全相同:
-
等于
== -
不等于
!= -
大于
> -
小于
< -
大于等于
>= -
小于等于
<=
示例:
int a = 5, b = 7;
bool isEqual = (a == b);// false
bool isNotEqual = (a !=b); // true
bool isGreater = (a > b);// false
bool isLess = (a < b); // true
bool isGreaterOrEqual = (a >= b); // false
bool isLessOrEqual = (a <= b);// true
逻辑运算符
C#和Java的逻辑运算符也是相同的:
-
逻辑与 (&&)
-
逻辑或 (||)
-
逻辑非 (!)
示例:
bool a = true, b = false;
bool andResult = a && b; // false
bool orResult = a || b; // true
bool notResult = !a; // false
位运算符
C#和Java的位运算符也基本相同:
-
按位与
& -
按位或
| -
按位异或
^ -
按位取反
~ -
左移
<< -
右移
>>
C#特有的位运算符:
-
无符号右移 (>>>)
示例:
int a = 60;// 二进制: 0011 1100
int b = 13; // 二进制: 0000 1101int c = a & b; // 12(二进制: 0000 1100)
int d = a | b; // 61 (二进制: 0011 1101)
int e = a ^ b; // 49 (二进制: 0011 0001)
int f = ~a; // -61 (二进制: 1100 0011, 补码表示)
int g = a << 2; // 240 (二进制: 1111 0000)
int h = a >> 2; // 15 (二进制: 0000 1111)
条件运算符
C#和Java都有三元条件运算符:
int a = 10, b = 20;
int max = (a > b) ? a : b; // 20
C#特有的条件运算符:
-
空合并运算符 (??)
-
空条件运算符(?.)
示例:
string name = null;
string displayName = name ?? "Guest"; // "Guest"class Person
{public string Name { get; set; }
}Person person = null;
int? nameLength = person?.Name?.Length; // null
类型测试运算符
C#提供了一些Java中没有的类型测试运算符:
-
is 运算符:检查对象是否与特定类型兼容
-
as 运算符:执行类型转换,如果转换失败,返回null
示例:
object obj = "Hello";
if (obj is string)
{Console.WriteLine("obj is a string");
}string str = obj as string;
if (str != null)
{Console.WriteLine($"The string is: {str}");
}
Lambda 表达式
C#和Java都支持Lambda表达式,但语法略有不同:
C#:
Func<int, int> square = x => x * x;
int result = square(5); // 25
Java:
Function<Integer, Integer> square = x -> x * x;
int result = square.apply(5); // 25
空合并运算符(??)
C#特有的空合并运算符可以简化处理可能为null的情况:
string name = null;
string displayName = name ?? "Guest"; // "Guest"
在Java中,你可能需要这样写:
String name = null;
String displayName = (name != null) ? name : "Guest";
表达式体成员 (Expression-bodied members)
C#允许使用更简洁的语法来定义属性和方法:
public class Circle
{public double Radius { get; set; }public double Diameter => Radius * 2;public double CalculateArea() => Math.PI * Radius * Radius;
}
这种语法在Java中是不存在的。
字符串插值
C#提供了非常方便的字符串插值语法:
string name = "Alice";
int age = 30;
string message = $"My name is {name} and I am {age} years old.";
Java在较新的版本中也引入了类似的功能,但语法不同:
String name = "Alice";
int age = 30;
String message = String.format("My name is %s and I am %d years old.", name, age);
小结
虽然C#和Java在运算符和表达式方面有很多相似之处,但C#提供了一些额外的特性,如空合并运算符、空条件运算符、表达式体成员等,这些可以让代码更加简洁和表达力更强。
作为一个从Java转向C#的开发者,你会发现这些额外的特性可以让你的代码更加优雅和易读。在实际编程中,合理利用这些特性可以提高代码质量和开发效率。
在接下来的学习中,我们将深入探讨C#的更多高级特性,如LINQ、异步编程等。这些概念将进一步展示C#相对于Java的独特优势。继续保持学习的热情,你会发现C#是一个功能丰富、表达力强的语言!
1.4 控制流语句
控制流语句是编程语言的基本构建块,用于控制程序的执行路径。C#和Java在这方面非常相似,但C#也有一些独特的特性。让我们深入了解C#的控制流语句,并与Java进行比较。
if-else 语句
C#和Java的if-else语句几乎完全相同:
int x = 10;
if (x > 5)
{Console.WriteLine("x is greater than 5");
}
else if (x < 5)
{Console.WriteLine("x is less than 5");
}
else
{Console.WriteLine("x is equal to 5");
}
C#特有的特性:
-
可空类型的使用:
int? x = null;
if (x.HasValue)
{Console.WriteLine($"x has a value: {x.Value}");
}
else
{Console.WriteLine("x is null");
}
-
模式匹配(C# 7.0+):
object obj = "Hello";
if (obj is string s)
{Console.WriteLine($"The string is: {s}");
}
switch 语句
C#的switch语句比Java的更加灵活:
int day = 3;
switch (day)
{case 1:Console.WriteLine("Monday");break;case 2:Console.WriteLine("Tuesday");break;case 3:case 4:case 5:Console.WriteLine("Midweek");break;default:Console.WriteLine("Weekend");break;
}
C#特有的特性:
-
模式匹配(C# 7.0+):
object obj = 123;
switch (obj)
{case int i when i > 100:Console.WriteLine($"Large integer: {i}");break;case string s:Console.WriteLine($"String value: {s}");break;case null:Console.WriteLine("Null value");break;default:Console.WriteLine("Unknown type");break;
}
-
switch 表达式(C# 8.0+):
string GetDayType(int day) => day switch
{1 => "Monday",2 => "Tuesday",3 or 4 or 5 => "Midweek",_ => "Weekend"
};
循环语句
C#和Java的循环语句非常相似:
-
for循环:
for (int i = 0; i < 5; i++)
{Console.WriteLine(i);
}
-
while 循环:
int i = 0;
while (i < 5)
{Console.WriteLine(i);i++;
}
-
do-while 循环:
int i = 0;
do
{Console.WriteLine(i);i++;
} while (i < 5);
-
foreach 循环:
string[] fruits = { "apple", "banana", "cherry" };
foreach (string fruit in fruits)
{Console.WriteLine(fruit);
}
C#特有的特性:
-
LINQ与foreach的结合:
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
foreach (var num in numbers.Where(n => n % 2 == 0))
{Console.WriteLine(num);
}
跳转语句
C#和Java都支持以下跳转语句:
-
break:跳出当前循环或switch语句
-
continue:跳过当前循环的剩余部分,开始下一次迭代
-
return:从方法中返回,并可选择返回一个值
C#特有的跳转语句:
-
goto:虽然不推荐使用,但C#保留了goto语句
int i = 0;
start:if (i < 5){Console.WriteLine(i);i++;goto start;}
异常处理
C#和Java的异常处理机制非常相似:
try
{int result = 10 / 0;
}
catch (DivideByZeroException ex)
{Console.WriteLine($"Division by zero error: {ex.Message}");
}
catch (Exception ex)
{Console.WriteLine($"An error occurred: {ex.Message}");
}
finally
{Console.WriteLine("This always executes");
}
C#特有的特性:
-
异常过滤器(C# 6.0+):
try
{// 可能抛出异常的代码
}
catch (Exception ex) when (ex.InnerException != null)
{Console.WriteLine($"Inner exception: {ex.InnerException.Message}");
}
-
using 语句(简化资源管理):
using (var file = new System.IO.StreamReader("file.txt"))
{string content = file.ReadToEnd();Console.WriteLine(content);
}
// file自动关闭
-
using 声明(C# 8.0+):
using var file = new System.IO.StreamReader("file.txt");
string content = file.ReadToEnd();
Console.WriteLine(content);
// file 在作用域结束时自动关闭
小结
虽然C#和Java在控制流语句方面有很多相似之处,但C#提供了一些额外的特性,如模式匹配、switch表达式、异常过滤器等,这些可以让代码更加简洁和表达力更强。
作为一个从Java转向C#的开发者,你会发现这些额外的特性可以让你的代码更加优雅和易读。特别是模式匹配和switch表达式,它们可以大大简化复杂的条件逻辑。
在实际编程中,合理利用这些特性可以提高代码质量和开发效率。例如,使用模式匹配可以使类型检查和转换更加简洁,使用switch表达式可以使复杂的条件判断更加清晰。
在接下来的学习中,我们将深入探讨C#的更多高级特性,如LINQ、异步编程等。这些概念将进一步展示C#相对于Java的独特优势。继续保持学习的热情,你会发现C#是一个功能丰富、表达力强的语言!
1.5 方法和参数
方法(在Java中称为函数)是编程中最基本的代码组织单元。C#和Java在方法定义和使用上有很多相似之处,但C#提供了一些额外的特性,使得方法定义和调用更加灵活。让我们深入探讨C#的方法和参数,并与Java进行比较。
方法定义
C#和Java的基本方法定义非常相似:
public int Add(int a, int b)
{return a + b;
}
Java中的等效代码:
public int add(int a, int b) {return a + b;
}
主要区别:
-
C#方法名通常使用PascalCase,而Java使用camelCase。
-
C#支持方法重载,Java也支持。
参数传递
C#和Java都支持值传递和引用传递,但C#提供了更多选项:
-
值参数(默认):
public void IncrementValue(int x)
{x++; // 不影响原始值
}
-
引用参数(ref 关键字):
public void IncrementRef(ref int x)
{x++; // 修改原始值
}// 调用
int num = 5;
IncrementRef(ref num);
Console.WriteLine(num); // 输出 6
Java没有直接等效的引用参数,但可以通过包装类或数组实现类似效果。
-
输出参数(out 关键字):
public bool TryParse(string s, out int result)
{return int.TryParse(s, out result);
}// 调用
if (TryParse("123", out int number))
{Console.WriteLine($"Parsed number: {number}");
}
Java没有直接等效的输出参数。
-
参数数组(params 关键字):
public int Sum(params int[] numbers)
{return numbers.Sum();
}// 调用
int total = Sum(1, 2, 3, 4, 5);
Java使用可变参数(varargs)实现类似功能:
public int sum(int... numbers) {return Arrays.stream(numbers).sum();
}
方法重载
C#和Java都支持方法重载,允许在同一个类中定义多个同名但参数列表不同的方法:
public class Calculator
{public int Add(int a, int b){return a + b;}public double Add(double a, double b){return a + b;}
}
Java的方法重载与C#基本相同。
可选参数
C#支持可选参数,这在Java中直到最近才引入:
public void Greet(string name, string greeting = "Hello")
{Console.WriteLine($"{greeting}, {name}!");
}// 调用
Greet("Alice"); // 输出: Hello, Alice!
Greet("Bob", "Hi"); // 输出: Hi, Bob!
在Java中,你通常需要使用方法重载来实现类似功能:
public void greet(String name) {greet(name, "Hello");
}public void greet(String name, String greeting) {System.out.println(greeting + ", " + name + "!");
}
命名参数
C#支持命名参数,可以提高代码的可读性:
public void CreateUser(string name, int age, bool isAdmin = false)
{//方法实现
}// 调用
CreateUser(name: "Alice", age: 30, isAdmin: true);
CreateUser(age: 25, name: "Bob"); // 可以改变参数顺序
Java不支持命名参数,但可以使用建造者模式来实现类似的效果。
表达式体方法
C# 6.0引入了表达式体方法,可以使简单方法的定义更加简洁:
public int Add(int a, int b) => a + b;public string GetFullName(string firstName, string lastName) => $"{firstName} {lastName}";
Java不支持这种语法糖。
本地函数
C# 7.0引入了本地函数,允许在方法内定义函数:
public int Factorial(int n)
{int LocalFactorial(int x){return x <= 1 ? 1 : x * LocalFactorial(x - 1);}return LocalFactorial(n);
}
Java不直接支持本地函数,但可以使用匿名内部类或lambda表达式来实现类似功能。
异步方法
C#对异步编程的支持非常强大,使用async和await关键字:
public async Task<string> FetchDataAsync(string url)
{using var client = new HttpClient();return await client.GetStringAsync(url);
}// 调用
string data = await FetchDataAsync("https://api.example.com");
Java也支持异步编程,但语法和使用方式与C#不同,通常使用CompletableFuture:
public CompletableFuture<String> fetchDataAsync(String url) {return CompletableFuture.supplyAsync(() -> {// 使用HttpClient获取数据return "data";});
}// 调用
String data = fetchDataAsync("https://api.example.com").join();
扩展方法
C#允许你为现有类型添加新方法,而不需要修改原始类型的定义:
public static class StringExtensions
{public static bool IsNullOrEmpty(this string str){return string.IsNullOrEmpty(str);}
}// 使用
string name = "Alice";
bool isEmpty = name.IsNullOrEmpty();
Java不支持扩展方法,但可以使用静态工具类来实现类似功能。
泛型方法
C#和Java都支持泛型方法,允许你编写可以处理多种类型的方法:
public T Max<T>(T a, T b) where T : IComparable<T>
{return a.CompareTo(b) > 0 ? a : b;
}// 使用
int maxInt = Max(5, 10);
string maxString = Max("apple", "banana");
Java的泛型方法语法略有不同:
public <T extends Comparable<T>> T max(T a, T b) {return a.compareTo(b) > 0 ? a : b;
}
方法组合与函数式编程
C#对函数式编程有很好的支持,可以轻松组合和传递方法:
Func<int, int> square = x => x * x;
Func<int, int> addOne = x => x + 1;Func<int, int> squareThenAddOne = x => addOne(square(x));int result = squareThenAddOne(5); // 26
Java也支持函数式编程,但语法略有不同:
Function<Integer, Integer> square = x -> x * x;
Function<Integer, Integer> addOne = x -> x + 1;Function<Integer, Integer> squareThenAddOne = square.andThen(addOne);int result = squareThenAddOne.apply(5); // 26
虽然C#和Java在方法和参数的基本概念上很相似,但C#提供了更多的特性和灵活性。C#的引用参数、输出参数、命名参数、可选参数等特性可以让方法定义和调用更加灵活和清晰。此外,C#的异步方法、扩展方法和表达式体方法等特性可以让代码更加简洁和易读。
作为一个从Java转向C#的开发者,你会发现这些额外的特性可以大大提高你的编程效率和代码质量。例如,命名参数和可选参数可以减少方法重载的需求,扩展方法可以让你更容易地扩展现有类型的功能,而async/await则可以大大简化异步编程的复杂性。
在实际编程中,合理利用这些特性可以让你的代码更加清晰、简洁和易于维护。例如,使用命名参数可以提高代码的可读性,使用扩展方法可以使你的代码更加模块化,而使用异步方法可以提高应用程序的响应性。
关注获取更多文章

相关文章:
聊点基础---Java和.NET开发技术异同全方位分析
1. C#语言基础 1.1 C#语法概览 欢迎来到C#的世界!对于刚从Java转过来的开发者来说,你会发现C#和Java有很多相似之处,但C#也有其独特的魅力和强大之处。让我们一起来探索C#的基本语法,并比较一下与Java的异同。 程序结构 C#程序…...
【C++】C++中SDKDDKVer.h和WinSDKVer.h函数库详解
目录 一.SDKDDKVer.h介绍 二.WinSDKVer.h介绍 三.WinSDKVer.h 和 SDKDDKVer.h 的区别 一.SDKDDKVer.h介绍 SDKDDKVer.h 是一个在 Windows 软件开发中常见的头文件,它用于定义软件开发工具包(SDK)和驱动开发工具包(DDK&…...
uni-app 蓝牙传输
https://www.cnblogs.com/ckfuture/p/16450418.html https://www.cnblogs.com/yangxiaobai123/p/16021058.html 字符串转base64:https://www.cnblogs.com/sunny3158/p/17312158.html 将 ArrayBuffer 对象转成 Base64 字符串:基础 - uni.arrayBufferT…...
MBR10200CT-ASEMI智能AI应用MBR10200CT
编辑:ll MBR10200CT-ASEMI智能AI应用MBR10200CT 型号:MBR10200CT 品牌:ASEMI 封装:TO-220 批号:最新 恢复时间:35ns 最大平均正向电流(IF):10A 最大循环峰值反向…...
力扣 爬楼梯
动态规划算法基础篇。 class Solution {public int climbStairs(int n) {int[] f new int[n 1];f[0] 1;f[1] 1;//当爬到n阶楼梯时,可知是由n-1阶或n-2阶楼梯而来for(int i 2; i < n; i) {f[i] f[i - 1] f[i - 2];//后面的每一阶种数由前两个状态得到}ret…...
java设计模式之:策略模式+工厂模式整合案例实战(一)
本文介绍项目中常用的策略模式工厂模式的案例,该案例是针对策略类比较少的情况;下一篇会讲解策略类比较多的案例,下面直接开始: 案例1:项目中对系统中的客户和销售进行事件通知(短信、邮件、钉钉) 首先要有通知的策略…...
国内Ubuntu安装 stable-diffusion教程,换成国内镜像
安装依赖: 首先更新系统并安装Python 3.10和pip: sudo apt update sudo apt install python3.10 python3-pip 设置Python虚拟环境(可选): 安装Python虚拟环境管理工具,并创建激活虚拟环境: su…...
JAVA final详细介绍
一、介绍 final 中文意思: 最后的,最终的. final 可以修饰类、属性、方法和局部变量, 在某些情况下,程序员可能有以下需求,就会使用到final: 1)当不希望类被继承时,可以用final修饰。 //如果我们要求A类不能被其他类继承 //可以使用fin…...
45、tomcat+课后实验
tomcat 1、tomcat tomcat和php一样,都是用来处理动态页面的。 tomcat也可以作为web应用服务器,开源的。 php .php tomcat .jsp nginx .html tomcat 是用Java代码写的程序,运行的是Java的web应用程序。 tomcat的特点和功能:…...
设计模式的七大原则
1.单一职责原则 单一职责原则(Single responsibility principle),即一个类应该只负责一项职责。如类A负责两个不同职责:职责1,职责2。当职责1需求变更而改变A时,可能造成职责2执行错误,所以需要将类A的粒度分解为A1、…...
ThreeJS-3D教学十五:ShaderMaterial(noise、random)
ThreeJS-3D教学十四:ShaderMaterial(length、fract、step) 上面这篇主要是操作 fragmentShader 片元着色器,实现对物体颜色的修改,这次咱们来看下修改 vertexShader 顶点着色器,这个其实就是位移各个顶点的位置。 接下来我们先介绍下 noise 噪声函数(Perlin Noise、Sim…...
LeetCode 2974.最小数字游戏:排序+交换奇偶位
【LetMeFly】2974.最小数字游戏:排序交换奇偶位 力扣题目链接:https://leetcode.cn/problems/minimum-number-game/ 你有一个下标从 0 开始、长度为 偶数 的整数数组 nums ,同时还有一个空数组 arr 。Alice 和 Bob 决定玩一个游戏ÿ…...
使用vllIm部署大语言模型
使用vllm部署大语言模型一般需要以下步骤: 一、准备工作 1. 系统要求 - 操作系统:常见的 Linux 发行版(如 Ubuntu、CentOS)或 Windows(通过 WSL)。 - GPU 支持:NVIDIA GPU 并安装了适当的驱动程…...
静态搜索iOS动态链接函数的调用位置
静态搜索iOS动态链接函数的调用位置 可执行文件格式mach-O,是在苹果的操作系统 macOS 和 iOS 上使用的一种二进制文件格式。 在一些iOS安全扫描中,可能存在需要获取函数具体调用位置的需求,能指导用户更精确的定位漏洞。 现在以NSLog函数为例ÿ…...
【鸿蒙学习笔记】尺寸设置・layoutWeight・对子组件进行重新布局
官方文档:尺寸设置 目录标题 layoutWeight:对子组件进行重新布局 layoutWeight:对子组件进行重新布局 设置了layoutWeight属性的子元素与兄弟元素占主轴尺寸按照权重进行分配,忽略元素本身尺寸设置。 // 引入包名 import { http…...
vue实现表单输入框数字类型校验功能
vue实现表单输入框数字类型校验功能 1. 样式代码 <el-form-item label"订单总价"><el-input size"small" v-model"form.totalPrice" placeholder"请输入订单总价 正整数或者2位数小数" input"check(form.totalPric…...
JS登录页源码 —— 可一键复制抱走
前期回顾 https://blog.csdn.net/m0_57904695/article/details/139838176?spm1001.2014.3001.5501https://blog.csdn.net/m0_57904695/article/details/139838176?spm1001.2014.3001.5501 登录页预览效果 <!DOCTYPE html> <html lang"en"><head…...
Kithara与OpenCV (一)
Kithara使用 OpenCV 库 目录 Kithara使用 OpenCV 库简介需求和支持的环境构建 OpenCV 库使用 CMake 进行配置以与 Kithara 一起工作 使用 OpenCV 库设置项目运行 OpenCV 代码图像采集和 OpenCV自动并行化限制和局限性1.系统建议2.实时限制3.不支持的功能和缺失的功能4.显示 Ope…...
什么是软件定义安全SDSec
一、软件定义安全SDSec产生的背景 软件定义安全(Software Defined Security,SDSec)的产生背景主要源于传统网络安全防护方法在面对复杂网络环境时的不适应性,以及软件定义网络(SDN)技术的发展和应用。 SD…...
【C语言】C语言可以做什么?
目录 1. 操作系统开发1.1 操作系统内核1.2 设备驱动程序1.3 系统工具和实用程序 2. 嵌入式系统2.1 微控制器编程2.2 传感器和执行器控制2.3 消费电子产品 3. 应用程序开发3.1 图形用户界面应用3.2 游戏开发3.3 多媒体处理 4. 网络编程4.1 网络协议实现4.2 服务器和客户端程序4.…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
