聊点基础---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!");
    }
}

你会发现,两者的结构非常相似。主要的区别在于:

  1. C#使用using关键字导入命名空间,而Java使用import

  2. C#的Main方法是static void Main(string[] args),而Java是public static void main(String[] args)

  3. 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:
        // code
        break;
    case value2:
        // code
        break;
    default:
        // code
        break;
}

这些结构在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;

主要区别在于:

  1. C#使用string(小写),而Java使用String(大写)。

  2. C#使用bool,而Java使用boolean

基本数据类型

C#和Java都有类似的基本数据类型,但C#提供了更多的选择:

C# 类型Java 类型大小范围
sbytebyte8位-128 到 127
byte-8位0 到 255
shortshort16位-32,768 到 32,767
ushort-16位0 到 65,535
intint32位-2^31 到 2^31-1
uint-32位0 到 2^32-1
longlong64位-2^63 到 2^63-1
ulong-64位0 到 2^64-1
floatfloat32位±1.5x 10^-45 到 ±3.4 x 10^38
doubledouble64位±5.0 × 10^-324 到 ±1.7 × 10^308
decimal-128位±1.0 x 10^-28 到 ±7.9 x 10^28
charchar16位U+0000 到 U+FFFF
boolboolean8位true或 false

注意C#提供了无符号整数类型(byteushortuintulong)和decimal类型,这些在Java中是没有的。

值类型和引用类型

C#和Java都区分值类型和引用类型,但C#的处理更加灵活:

  1. 值类型(Value Types):

    • 在C#中,所有的基本数据类型(int, float, bool等)和struct都是值类型。

    • 值类型直接存储它们的数据。

  2. 引用类型(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#提供了多种类型转换方法:

  1. 隐式转换:

    int x = 10;
    long y = x; // 隐式转换,不需要显式转换
    
  2. 显式转换(强制类型转换):

    doubled = 3.14;
    int i = (int)d; // 显式转换,可能会损失精度
    
  3. 使用Convert类:

    string s = "123";
    int i = Convert.ToInt32(s);
    
  4. 使用Parse方法:

    string s = "3.14";
    double d = double.Parse(s);
    
  5. 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 - 2

string 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 1101

int 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#特有的特性:

  1. 可空类型的使用:

int? x = null;
if (x.HasValue)
{
    Console.WriteLine($"x has a value: {x.Value}");
}
else
{
    Console.WriteLine("x is null");
}
  1. 模式匹配(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#特有的特性:

  1. 模式匹配(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;
}
  1. switch 表达式(C# 8.0+):

string GetDayType(int day) => day switch
{
    1 => "Monday",
    2 => "Tuesday",
    3 or 4 or 5 => "Midweek",
    _ => "Weekend"
};

循环语句

C#和Java的循环语句非常相似:

  1. for循环:

for (int i = 0; i < 5; i++)
{
    Console.WriteLine(i);
}
  1. while 循环:

int i = 0;
while (i < 5)
{
    Console.WriteLine(i);
    i++;
}
  1. do-while 循环:

int i = 0;
do
{
    Console.WriteLine(i);
    i++;
} while (i < 5);
  1. foreach 循环:

string[] fruits = { "apple", "banana", "cherry" };
foreach (string fruit in fruits)
{
    Console.WriteLine(fruit);
}

C#特有的特性:

  1. 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都支持以下跳转语句:

  1. break:跳出当前循环或switch语句

  2. continue:跳过当前循环的剩余部分,开始下一次迭代

  3. return:从方法中返回,并可选择返回一个值

C#特有的跳转语句:

  1. 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#特有的特性:

  1. 异常过滤器(C# 6.0+):

try
{
    // 可能抛出异常的代码
}
catch (Exception ex) when (ex.InnerException != null)
{
    Console.WriteLine($"Inner exception: {ex.InnerException.Message}");
}
  1. using 语句(简化资源管理):

using (var file = new System.IO.StreamReader("file.txt"))
{
    string content = file.ReadToEnd();
    Console.WriteLine(content);
}
// file自动关闭
  1. 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;
}

主要区别:

  1. C#方法名通常使用PascalCase,而Java使用camelCase。

  2. C#支持方法重载,Java也支持。

参数传递

C#和Java都支持值传递和引用传递,但C#提供了更多选项:

  1. 值参数(默认):

public void IncrementValue(int x)
{
    x++; // 不影响原始值
}
  1. 引用参数(ref 关键字):

public void IncrementRef(ref int x)
{
    x++; // 修改原始值
}

// 调用
int num = 5;
IncrementRef(ref num);
Console.WriteLine(num); // 输出 6

Java没有直接等效的引用参数,但可以通过包装类或数组实现类似效果。

  1. 输出参数(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没有直接等效的输出参数。

  1. 参数数组(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则可以大大简化异步编程的复杂性。

在实际编程中,合理利用这些特性可以让你的代码更加清晰、简洁和易于维护。例如,使用命名参数可以提高代码的可读性,使用扩展方法可以使你的代码更加模块化,而使用异步方法可以提高应用程序的响应性。

关注获取更多文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/799412.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从零开始学习cartographer源码 | 番外:如何在wsl内使用clion阅读cartographer源码

从零开始学习cartographer源码 | 番外&#xff1a;如何在wsl内使用clion阅读cartographer源码 安装WSL2及Clion安装WSL2-Ubuntu20.04安装Clion安装ROS 安装Cartographer一键安装Cartographer 在Clion打开cartographer工程安装gdb手动创建CMakeLists.txt打开项目配置wsl工具链配…

CV07_深度学习模块之间的缝合教学(2)--维度转换

教学&#xff08;1&#xff09;&#xff1a;链接 1.1 预备知识 问题&#xff1a;假如说我们使用的模型张量是三维的&#xff0c;但是我们要缝合的模块是四维的&#xff0c;应该怎么办&#xff1f; 方法&#xff1a;pytorch中常用的函数&#xff1a;(1)view函数&#xff08;2…

【LeetCode 链表合集】

文章目录 1. LeetCode 206 反转链表2. NC40 链表相加 1. LeetCode 206 反转链表 题目链接&#x1f517; 解题思路&#xff1a; &#x1f50d; &#x1f427;创建一个新的节点&#xff0c;使用链表头插的方法&#xff1b; 2. NC40 链表相加 题目链接&#x1f517; 解题思路…

如何用STM32实现modbus-RTU?

Modbus RTU是一种广泛应用于工业自动化领域的通信协议,基于主从架构,通过串行通信进行数据传输。本文将详细介绍Modbus RTU协议的基本原理,并提供在STM32微控制器上实现Modbus RTU通信的完整代码示例。 1. Modbus RTU协议概述 Modbus RTU的定义和特点 Modbus RTU(Remote Te…

mysql的窗口函数

一、窗口函数 1.1 什么是窗口函数 窗口函数&#xff0c;也叫OLAP函数&#xff08;Online Analytical Processing&#xff0c;联机分析处理&#xff09;&#xff0c;可以对数据库进行实时分析处理&#xff0c;窗口函数的基本语法如下&#xff1a; <窗口函数> over (part…

Web前端开发

1. 介绍 本文将覆盖Web前端开发的方方面面&#xff0c;包括HTML、CSS、JavaScript三大基础知识&#xff0c;vue3框架以及项目实战&#xff0c;帮助读者从零开始掌握前端开发。 2. Web前端开发基础 2.1 HTML5 2.1.1 什么是HTML5 HTML&#xff08;HyperText Markup Language…

【深海王国】初中生也能画的电路板?手把手教你制作第一个PCB电路板(2)

Hi~ (o^^o)♪, 各位深海王国的同志们&#xff0c;早上下午晚上凌晨好呀~ 辛苦工作的你今天也辛苦啦(/≧ω) 今天大都督将继续为大家带来系列——初中生也能画的电路板&#xff0c;帮你一周内快速入门PCB设计&#xff0c;手把手教你从元器件库添加、电路原理图绘制、PCB布局设计…

SparkStreaming--scala

文章目录 第1关&#xff1a;QueueStream代码 第2关&#xff1a;File Streams代码 第1关&#xff1a;QueueStream 任务描述 本关任务&#xff1a;编写一个清洗QueueStream数据的SparkStreaming程序。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.如何使用S…

【07】分布式事务解决方案

1、事务简介 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在关系数据库中&#xff0c;一个事务由一组SQL语句组成。事务应该具有ACID四个特性&#xff1a;原子性、一致性、隔离性、持久性。任何事务机制在实现时&#xff0c;都应该考虑事务…

mac生成.dmg压缩镜像文件

mac生成.dmg压缩镜像文件 背景准备内容步骤1&#xff0c;找一个文件夹2&#xff0c;制作application替身1&#xff0c;终端方式2&#xff0c;黄金右手方式 3&#xff0c;.app文件放入文件夹4&#xff0c;制作.dmg压缩镜像文件5&#xff0c;安装.dmg 总结 背景 为绕开App Store…

纯css实现语音播报动画效果

先来看看效果图 黑色以下代码 background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAAAYCAYAAAAF6fiUAAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAAO8SURBVGiB1ZlPaBxVHMe/v7fbkmUZErRs9/1moUtYBBfxklZR8aYg5KAgvcT25MFDvUhPTaGnHoKIlOpJ0VsPUvAgKNjSS0EPAVGKya…

防火墙综合实验之NAT和智能选路

目录 前言&#xff1a; 一、实验题目 二、实验操作 需求一 需求二 需求三 需求四、需求五 需求六 需求七 ​编辑 需求八 需求九 需求十 需求十一 三、需求测试 前言&#xff1a; 本篇文章是延续上一篇文章&#xff0c;简单来说就是防火墙实验的完善和延续&#…

Zabbix6.0监控Freeswitch状态

一、前提环境说明 1、最终实现Freeswitch监控指标信息&#xff1a; 2、环境需求&#xff1a; &#xff08;1&#xff09;需要使用Zabbix6.0及以上 &#xff08;2&#xff09;需要使用zabbix_agent2 二、实现步骤 1、zabbix_agent2添加监控键值 cat /etc/zabbix/conf.d/fr…

唯众物联网综合实训台 物联网实验室建设方案

物联网综合实训装置 物联网工程应用综合实训台是我公司针对职业院校物联网行业综合技能型人才培养&#xff0c;综合运用传感器技术、RFID技术、接口控制技术、无线传感网技术、Android应用开发等&#xff0c;配合实训台上的433M无线通信设备、ZigBee节点、射频设备、控制设备、…

CoT-SC论文速读

1.论文速读 本文提出了一个重要的Decoder策略为&#xff1a;“Self-Consistency”,并将其用在CoT的Prompt工作中。 该策略作用&#xff1a;让LLM在处理复杂问题时&#xff0c;让他尝试多个推理路径&#xff0c;每一个推理路径都是一次CoT&#xff08;Chain of Thought&#x…

解决回溯算法之切割问题(leetcode--分割回文串)

文章目录 1.问题描述2.做题思路(关键是画出对于的二叉树图)3.代码实现 1.问题描述 2.做题思路(关键是画出对于的二叉树图) 1.思考从起始串的分割方案, 有a ,aa, aab三种方式 2.————————————剩余ab,b,空&#xff08;接下来对ab,b同样的方式进行分割&#xff09; 3.…

【Linux】centos7安装PHP7.4报错:libzip版本过低

问题描述 configure: error: Package requirements (libzip > 0.11 libzip ! 1.3.1 libzip ! 1.7.0) were not met: checking for libzip > 0.11 libzip ! 1.3.1 libzip ! 1.7.0... no configure: error: Package requirements (libzip > 0.11 libzip ! 1.3.1 libzi…

星辰计划02-独特视角的spring动态代理

承接上一文 动态代理 &#xff0c;这里探究spring 动态代理 会话1&#xff1a;spring动态代理 quick start &#x1f467;哥哥&#xff0c;哥哥&#xff0c;spring 怎么去搞动态代理的呢&#x1f468; 来来来&#xff0c;听我细细来说 quick start通过Spring的 ProxyFactory…

【高中数学/幂函数】比较a=2^0.3,b=3^0.2,c=7^0.1的大小

【问题】 比较a2^0.3,b3^0.2,c7^0.1的大小 【解答】 a2^0.32^3/10(2^3)^1/108^1/10 b3^0.23^2/10(3^2)^1/109^1/10 c7^0.17^1/10 由于yx^1/10在x正半轴是增函数&#xff0c;底数大的得数就大。 因为9>8>7,所以b>a>c 【图像】 在图像上绘出曲线yx^1/10&…

C++初阶:类和对象(二)

✨✨所属专栏&#xff1a;C✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ 类的默认成员函数 默认成员函数就是用户没有显式实现&#xff0c;编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个类&#xff0c;我们不写的情况下编译器会默认⽣成以下6个默认成员函数&#xff0c;需要注…