C#语法基础总结
输入和输出
输入
Console.Read();
从屏幕读取一个字符,并返回该字符所对应的整型数字
Console.ReadLine();
从屏幕读取一串字符,并返回该字符串
输出
Console.WriteLine(); 输出内容,并换行
Console.Write(); 输出内容,不换行
using关键字
一般在程序开头添加 using System;,这时System.String 就可简写为string 。
using 关键字用于在程序中包含命名空间。一个程序可以包含多个 using 语句
// using System;namespace ConsoleApp1
{class Program{static void Main(string[] args){System.String a = "Hello World!";System.Console.WriteLine(a);System.Console.ReadKey();}}
}
using System;namespace ConsoleApp1
{class Program{static void Main(string[] args){string a = "Hello World!";Console.WriteLine(a);Console.ReadKey();}}
}
C#占位符{}
- 当 WriteLine() 函数有多个参数时,输出第一个参数(双引号内的)中的内容,而第二个及后面的参数中的内容替换掉第一个参数中对应位置的占位符一起输出。
static void Main(string[] args)
{Console.WriteLine("A:{0},a:{1}",65,97);Console.ReadLine();
}
- 如果第一个参数没有留占位符,那么第二个参数内容不输出
Console.WriteLine("A:,a:",65,97);
C#数据类型
在C#中,变量分为以下几种类型:
- 值类型(Value types)
- 引用类型(Reference types)
- 指针类型(Pointer types)
引用类型
引用类型不包含存储在变量中的实际数据,但它们包含对变量的引用。
换句话说,它们指的是一个内存位置。使用多个变量时,引用类型可以指向一个内存位置。如果内存位置的数据是由一个变量改变的,其他变量会自动反映这种值的变化。内置的引用类型有:object、dynamic 和 string。
对象(Object)类型
对象(Object)类型 是 C# 通用类型系统(Common Type System - CTS)中所有数据类型的终极基类。Object 是 System.Object 类的别名。所以对象(Object)类型可以被分配任何其他类型(值类型、引用类型、预定义类型或用户自定义类型)的值。但是,在分配值之前,需要先进行类型转换。当一个值类型转换为对象类型时,则被称为 装箱;另一方面,当一个对象类型转换为值类型时,则被称为 拆箱。
object obj;
obj = 100; // 这是装箱
动态(Dynamic)类型
您可以存储任何类型的值在动态数据类型变量中。这些变量的类型检查是在运行时发生的。
dynamic <variable_name> = value;
类型转换
类型转换从根本上说是类型铸造,或者说是把数据从一种类型转换为另一种类型。在 C# 中,类型铸造有两种形式:
隐式类型转换 - 这些转换是 C# 默认的以安全方式进行的转换, 不会导致数据丢失。例如,从小的整数类型转换为大的整数类型,从派生类转换为基类。
显式类型转换 - 显式类型转换,即强制类型转换。显式转换需要强制转换运算符,而且强制转换会造成数据丢失。
下面的实例把不同值的类型转换为字符串类型:
namespace TypeConversionApplication
{class StringConversion{static void Main(string[] args){int i = 75;float f = 53.005f;double d = 2345.7652;bool b = true;Console.WriteLine(i.ToString());Console.WriteLine(f.ToString());Console.WriteLine(d.ToString());Console.WriteLine(b.ToString());Console.ReadKey();}}
动态常量(运行时常量) readonly
在运行时确定值,只能在声明时或构造函数中初始化,只能在类中定义。定义方法如下:
class Program
{readonly int a=1; // 声明时初始化readonly int b; // 构造函数中初始化Program(){b=2;}static void Main(){}
}
?:运算符
我们已经在前面的章节中讲解了 条件运算符 ? :,可以用来替代 if...else 语句。它的一般形式如下:
Exp1 ? Exp2 : Exp3;
其中,Exp1、Exp2 和 Exp3 是表达式。请注意,冒号的使用和位置。
? 表达式的值是由 Exp1 决定的。如果 Exp1 为真,则计算 Exp2 的值,结果即为整个 ? 表达式的值。如果 Exp1 为假,则计算 Exp3 的值,结果即为整个 ? 表达式的值。
数组
1.一维数组初始化
动态初始化:
(1)数据类型[] 数组名=new 数据类型[数组长度];
(2)数据类型[] 数组名=new 数据类型[数组长度]{元素1,元素2…};
(3)数据类型[] 数组名=new 数据类型[]{元素1,元素2…};
静态初始化 → 数据类型[] 数组名={元素1,元素2…};
2.二维数组初始化
数据类型[,] 数组名 = new 数据类型[第一维长度,第二维长度];
int[,] arr= new int[50,3];
数据类型[,] 数组名 = new 数据类型[,]{数组值};
int[,] arr= new int[,]{{1,0,1},{3,0,5}};
数据类型[,] 数组名 = {数组值};
int[,] arr= {{1,0,1},{3,0,5}};
- 二维数组的长度
- 总长度(二维数组的元素个数)
- array.Length
- 第一维的长度
- array.GetLength(0)
- 第二维的长度
- array.GetLength(1)
for (int i = 0; i < heroData.GetLength(0); i++)
{for (int j = 0; j < heroData.GetLength(1); j++){Console.Write(heroData[i,j] + "\t");}//换行Console.WriteLine();
}
函数
// <访问修饰符> <返回值类型> <函数名称> (参数列表)
<Access Specifier> <Return Type> <Method Name>(Parameter List)
{// 函数主体Method Body
}
访问权限修饰符
所有类型和类型成员都具有可访问型级别。该级别可以控制是否可以从你的程序集或其他程序集中的其他代码中使用它们。简单来说就是当前函数或属性的访问权限。
public 整个解决方案中访问。
protected internal 是protected 和 internal 的并集,符合任意一条都可以访问。
proteced 只允许在当前类内部以及该类的子类中访问。
internal 只能在当前项目中访问。在同一个项目中与 public 的权限一致。
private 只允许在本项目本类中被访问。
(1)如果没有主动使用访问修饰符,那么默认是private 私有的,外界是访问不到的。
| 修饰符 | 类内部 | 子类 | 其他类 |
|---|---|---|---|
| public | 可以 | 可以 | 可以 |
| private | 可以 | 不可以 | 不可以 |
| protected | 可以 | 可以 | 不可以 |
参数传递
参数可以通过三种方式传递给函数:
值传递: 值传递会复制参数的实际值并赋值给函数的形式参数,实参和形参使用的是两个不同内存位置中的值,当形参的值发生改变时,不会影响实参的值,从而保证了实参数据的安全。
引用传递: 引用传递会复制参数的内存位置并传递给形式参数,当形参的值发生改变时,同时也会改变实参的值。
输出传递: 输出传递可以一次返回多个值
1.引用传递
引用传递是对变量内存位置的引用。与值传递不同,使用引用传递的形式传递参数时,并不会为形参创建新的内存地址,而是与实参共同指向相同的内存地址。正因为如此,当修改形参的值时,实参的值也会被修改。
在 C# 中,需要使用 ref 关键字来使用引用传递:
class Demo {static void Main(string[] args) {int num = 11;Console.WriteLine("调用函数之前:{0}", num);Func(ref num);Console.WriteLine("调用函数之后:{0}", num);}public static void Func(ref int val){val += val;Console.WriteLine("函数内部的值:{0}", val);}
};
// 输出
// 调用函数之前:11
// 函数内部的值:22
// 调用函数之后:22
// 通过运行结果可以看出,当函数内部值发生更改时,因为他们共用一个内存地址所以调用函数后值发出了改变
2.输出传递
使用 return 语句可以从函数中返回一个值,但是使用输出传递则可以从函数中一次性返回多个值。输出传递与引用传递相似,不同之处在于输出传递是将数据从函数中传输出来而不是传输到函数中。
在 C# 中,需要使用 out 关键字来使用输出传递
class Demo {static void Main(string[] args) {int num = 11;Console.WriteLine("调用函数之前:{0}", num);Func(out num);Console.WriteLine("调用函数之后:{0}", num);}public static void Func(out int val){val = 22;}
};
// 输出
// 调用函数之前:11
// 调用函数之后:22
// 通过运行结果可以看出,在函数体内直接更改了nun的值
注意: 不可直接将参数进行运算,可以直接赋值。如果要进行算术运算则新建一个临时变量进行运算。
ref 不需要对实参赋值,就可以使用。out 需要对实参赋值后,才可以使用。
public static void Func(out int val){// 语法错误val += 22;// 正确int temp = 11;val = temp;val += val;
}
函数重载
(1)与返回值无关(2)与参数列表的个数有关(3)与参数列表的不同数据类型的顺序有关
C#枚举
枚举是一组命名整型常量。枚举类型是使用 enum 关键字声明的。
C# 枚举是值类型。换句话说,枚举包含自己的值,且不能继承或传递继承
声明枚举的一般语法:
enum <enum_name>
{ enumeration list
};
其中,
- enum_name指定枚举的类型名称
- enumeration list是一个用逗号分隔的标识符列表。
枚举列表中的每个符号代表一个整数值,一个比它前面的符号大的整数值,默认情况下,第一个枚举符号的值是0,后面的比前面的加一,例如:
enum Days { Sun, Mon, tue, Wed, thu, Fri, Sat };
using System;namespace day01
{class Program{enum Day {Sun,Mon,Tue,Wed,Thu,Fri,Sat};static void Main(string[] args){int x = (int)Day.Sun;int y = (int)Day.Fri;Console.WriteLine("Sun={0}\nFri={1}",x,y);}}
}
枚举可以是任何数字数据类型,例如 byte,sbyte,short,ushort,int,uint,long 或 ulong。但是,枚举不能为字符串类型。
在 enum 名称后指定类型为:type。下面定义了字节 enum。
enum Categories: byte{Electronics = 1, Food = 5, Automotive = 6, Arts = 10, BeautyCare = 11, Fashion = 15}
C#结构体
在 C# 中,结构体是值类型数据结构。它使得一个单一变量可以存储各种数据类型的相关数据。struct 关键字用于创建结构体。
结构体是用来代表一个记录。假设您想跟踪图书馆中书的动态。您可能想跟踪每本书的以下属性:
Title
Author
Subject
Book ID
定义结构体
为了定义一个结构体,您必须使用 struct 语句。struct 语句为程序定义了一个带有多个成员的新的数据类型。
例如,您可以按照如下的方式声明 Book 结构:
struct Books
{public string title;public string author;public string subject;public int book_id;
};
using System;
using System.Text;
namespace day01
{struct Books{public string title;public string author;public string subject;public int book_id;};class Program{static void Main(string[] args){Books Book1;Book1.title = "C programming";Book1.author = "Nuha Ali";Book1.subject = "C programming Tutorial";Book1.book_id = 12345;Console.WriteLine("Book1 title:{0}", Book1.title);Console.WriteLine("Book1 author:{0}", Book1.author);Console.WriteLine("Book1 subject:{0}", Book1.subject);Console.WriteLine("Book1 book_id:{0}", Book1.book_id);Console.ReadKey();}}
}
结构体默认无参数构造函数,不可以显示声明,但是可以写有参数的构造函数。如果结构体存在有参数构造函数,必须在构造方法返回前,对结构体内的属性(变量)进行显示赋值。静态函数本身就是结构体属性,可以通过结构体调用,所以无需声明其修饰符。
静态(static)构造函数:(1)不允许出现访问修饰符(2)静态构造函数必须是无参的
静态构造函数执行时机:(1)只有在调用结构体方法/函数时,才会被执行
静态变量:(1)静态变量的声明,数据类型/用户自定义的类型前面,需要加关键字 static(2)静态变量不归属于某个实例(一般是类的实例或者是结构体的变量),只归属于当前自身。
struct masty
{public string strname;public masty(string name){strname = name;}public void showname(){Debug.Log(strname);}/*public*/ static masty{}}
类(class)
类的定义:一个类由两种东西组成,成员变量(对象有哪些)和成员函数(对象做什么事)。
注:一个类可以有多个对象,这些对象都会做这个类所定义的动作(函数),但各自有不同的数据
成员变量:一个类中的对象所具有的变量。每一个对象有自己的变量。
成员函数:一个类中的方法。
类 对象名词 = new 类(),类的实例化。
静态的成员函数,只能操作静态的成员,不能操作非静态的的成员常量和函数。
构造函数
C#构造函数是一种特殊的成员函数,它主要用于为对象分配存储空间,对数据成员进行初始化.
构造函数的性质:
(1)C#构造函数的名字必须与类同名;
(2)C#构造函数没有返回类型,它可以带参数,也可以不带参数;
(3)声明类对象时,系统自动调用构造函数,构造函数不能被显式调用;
(4)C#构造函数可以重载,从而提供初始化类对象的不同方法;
(5)若在声明时未定义构造函数,系统会自动生成默认的构造函数,此时构造函数的函数体为空.
(6)如果构造函数是私有的private,那么在类的外部,无法对当前类进行实例化。
声明构造函数的要求:
(1)构造函数不能有返回类型,包括void
(2)构造函数的名称必须与类名相同(所以构造函数往往使用形参)
访问修饰符 类名 (参数列表)
{
语句块;
}
析构函数
用于在对象被销毁时执行清理操作。它与构造函数相反,构造函数用于在对象创建时执行初始化操作。
虽然c#(确切说CLR) 提供了一种新的内存管理机制----自动内存管理机制,资源的释放是可以通过“垃圾回收器”自动完成的,一般不需要用户干预,但在有些特殊情况下还是需要用析构函数的,如在c#中非托管资源的释放。
- 析构函数是用于释放资源和执行清理操作的特殊方法
- 析构函数的名称与类名相同,但前面加上一个波浪线(~)作为前缀
- 析构函数在对象被销毁之前自动调用
// 析构函数
~ClassName()
{// 析构函数的代码
}// ~类名()
//{
// 语句块;
//}
面向对象
1.继承
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
- 子类继承父类,父类派生子类
- 子类又叫派生类,父类又叫基类(超类)
- 子类继承父类成员,也可以有自己独立的成员
构造函数:先执行父类的构造函数,再执行子类构造函数
析构函数:先执行子类的析构函数,再执行父类的
继承的方式
class 子类:父类
{
}
class Animal{#region public string Name { get; set; }//名字public string Color { get; set; }//颜色public string Kind { get; set; }//种类public string Favorite { get; set; }//爱好#endregion//父类构造函数public Animal() { }public Animal(string name,string color,string kind){this.Name = name;this.Color = color;this.Kind = kind;}//父类方法public void Introduce() {string info = string.Format("我的名字叫{0},身穿{2}的衣服,我是{1},我爱吃{3}!", Name, Color, Kind, Favorite);Console.WriteLine(info);}}
- this关键字
用来访问父类成员(当前类和父类的成员变量和函数)
class Dog : Animal{public Dog() { }public Dog(string name, string color, string kind, string favorite){this.Name = name;this.Color = color;this.Kind = kind;this.Favorite = favorite;}}
- base关键字
1.调用父类的构造函数
2.调用父类的属性和方法
只能是public / protected相关的
class Cat:Animal{public Cat() { }public Cat(string name,string color,string kind,string favorite):base(name,color,kind)//1.调用父类构造函数{this.Favorite = favorite;}//跳舞public void Dancing(){base.Introduce();//2.调用父类方法Console.WriteLine("下面我给大家表演《小猫迪斯科》,请大家鼓掌啊:>");}}
子类方法的覆盖
- 前提条件:父类中有一个public函数,子类中没有该函数
因为子类中并没有该函数,所以调用必是父类的
- 前提条件:子类里已经有了该函数,父类里面也有该函数
此时,子类对象调用子类的该函数,父类对象调用父类的该函数
这种子类函数,可以称之为覆盖
- 子类在书写该函数的时候,规范的写法应该是: → [访问修饰符] new 返回值类型 函数名(参数列表)
覆盖:子类也有该函数了,以后调用的时候就调用子类的该函数
public class Person
{public string name;public Person(string name){this.name = name;Console.WriteLine(name);}public void Say() //父类的函数{Console.WriteLine("你在干什么!");}
}
public class Person1:Person
{public Person1(string name):base(name){}public new void Say() //覆盖掉父类的函数{Console.WriteLine("弄啥呢!");}
}
public class Person2:Person1
{public Person2(string name) : base(name){}public new void Say() //覆盖掉父类的函数{Console.WriteLine("搞啥呢!");}
}
static void Main(string[] args)
{Person p = new Person("1");p.Say();Person1 p1 = new Person1("2");p1.Say();Person2 p2 = new Person2("3");p2.Say();PersonFun(p2);Console.ReadLine();
}
public static void PersonFun(Person person)
{person.Say();
}
子类方法的重写【表现出多态】
- 如果父类想要子类可以重写该函数
那么父类的该函数必须是一个虚函数
[访问修饰符] virtual 返回值类型 函数名(参数列表)
- 子类该怎么重写
[访问修饰符] override 返回值类型 函数名(参数列表)
- 重写:把子类和父类的该函数都重新写了一遍,有的新的内容
此时,子类的对象,无论是不是转换成了父类的类型,都会执行重写后的该函数
- 关于VS自动生成类重写函数
右键类名
点击快速修复或重构
点击生成重写
public class Person
{public string name;public Person(){}public Person(string name){this.name = name;}public virtual void Say(){Console.WriteLine("我是父类的方法");}}
public class Person1 : Person
{public Person1(string name){}public override void Say(){Console.WriteLine("我是字类的方法");}
}
static void Main(string[] args)
{Person1 p1 = new Person1("我是字类");p1.Say();Person p = new Person1("我是父类");p.Say();Console.ReadLine();
}
2.封装
把一个或多个项目封闭在一个物理的或者逻辑的包中。
在面向对象程序设计方法论中,封装是为了防止对实现细节的访问。
抽象和封装是面向对象程序设计的相关特性。抽象允许相关信息可视化,封装则使开发者实现所需级别的抽象。
using System;namespace RectangleApplication
{class Rectangle{//成员变量public double length;public double width;public double GetArea(){return length * width;}public void Display(){Console.WriteLine("长度: {0}", length);Console.WriteLine("宽度: {0}", width);Console.WriteLine("面积: {0}", GetArea());}}// Rectangle 结束class ExecuteRectangle{static void Main(string[] args){Rectangle r = new Rectangle();r.length = 4.5;r.width = 3.5;r.Display();Console.ReadLine();}}
}
在上面的实例中,成员变量 length 和 width 被声明为 public,所以它们可以被函数 Main() 使用 Rectangle 类的实例 r 访问。
成员函数 Display() 和 GetArea() 可以直接访问这些变量。
成员函数 Display() 也被声明为 public,所以它也能被 Main() 使用 Rectangle 类的实例 r 访问。
3.多态
多态性意味着有多重形式。在面向对象编程范式中,多态性往往表现为"一个接口,多个功能"。
多态性可以是静态的或动态的。在静态多态性中,函数的响应是在编译时发生的。在动态多态性中,函数的响应是在运行时发生的。
静态多态性(编译时)
在编译时,函数和对象的连接机制被称为早期绑定,也被称为静态绑定。C# 提供了两种技术来实现静态多态性。分别为:
- 函数重载
- 运算符重载
动态多态性(运行时)
是通过 抽象类 和 虚方法 实现的。父类对象=子类实例对象 被允许的,当父类对象去调用虚函数时,会去检测子类有没有重写,若重写了,则调用子类重写后的函数。
相关文章:
C#语法基础总结
输入和输出 输入 Console.Read(); 从屏幕读取一个字符,并返回该字符所对应的整型数字 Console.ReadLine(); 从屏幕读取一串字符,并返回该字符串 输出 Console.WriteLine(); 输出内容,并换行 Console.Write(); 输出内容,不换行…...
Springboot+Vue登录、注册功能(含验证码)(后端!)
我们首先写一个接口,叫login!然后对传入一个user,因为我们前端肯定是要传过来一个user,然后我们后端返回一个user,因为我们要根据这个去校验!我们还引入了一个hutool的一个东西,在pom文件里面引…...
深入理解 HTML 中的<div>和元素:构建网页结构与样式的基石
一、引言 在 HTML 的世界里,<div>和元素虽看似普通,却扮演着极为关键的角色。它们就像网页搭建过程中的万能积木,能够将各种 HTML 元素巧妙地组合起来,无论是构建页面布局,还是对局部内容进行样式调整ÿ…...
搞定python之八----操作mysql
本文是《搞定python》系列文章的第八篇,讲述利用python操作mysql数据库。相对来说,本文的综合性比较强,包含了操作数据库、异常处理、元组等内容,需要结合前面的知识点。 1、安装mysql模块 PyMySql模块相当于数据库的驱动&#…...
游戏立项时期随笔记录(1)
模拟经营的项目还没有完全结束,这几天又有可能涉及到一个新项目。感想随笔记录一下,防止忘记。今天一天整理这个,搞得今天没时间看数学和AI。 在 Unity3D 游戏前端主程序的立项时期,核心目标是明确技术方向、评估可行性、搭建基础…...
LVGL 中设置 UI 层局部透明,显示下方视频层
LVGL层次 LVGL自上而下分别是layer_sys > layer_top > lv_sreen_active > layer_bottom 即 系统层、顶层、活动屏幕、底层 原理 如果将UI设置为局部透明,显示下方的视频层,不仅仅需要将当前活动屏幕的背景设置为透明,还需要将底层…...
Debezium日常分享系列之:Debezium 3.1.0.Beta1发布
Debezium日常分享系列之:Debezium 3.1.0.Beta1发布 新特性和改进Debezium 平台的首次发布Percona 的最小锁定新的 Oracle 源信息 SCN 和时间戳字段Vitess Epoch/零日期列解析的变化Vitess 二进制排序的 tiny、medium 和 long 文本列的变化CloudEvent traceparent 支…...
21.多态
一、多态概念 多种形态。 静态多态:编译时多态。(函数重载) 动态多态:运行时多态。(继承关系下,调用父类指针或引用,对于不同的对象有不同的行为) 二、多态的定义及实现 1ÿ…...
【蓝桥杯】第十三届C++B组省赛
⭐️个人主页:小羊 ⭐️所属专栏:蓝桥杯 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 试题A:九进制转十进制试题B:顺子日期试题C:刷题统计试题D:修剪灌木试题E…...
C# PaddleOCR字符识别
1 安装Nuget 2 C# using System; using OpenCvSharp; using Sdcb.PaddleOCR; using Sdcb.PaddleOCR.Models.Local; using Sdcb.PaddleOCR.Models; using Sdcb.PaddleInference;namespace ConsoleApp1 {public class MichaelOCR{string imagePath "D:\\BUFFER\\VS\\Text\…...
网络爬虫相关
一、爬虫的基础内容 1、基本概念和用途 1.1、概念: 模拟浏览器、发送请求,获取响应。(只能获取客户端所展示出来的数据) 1.2、特点:知识碎片化,针对不同的网站对应的方法也不同。 爬虫:模拟…...
算法及数据结构系列 - 二分查找
系列文章目录 算法及数据结构系列 - BFS算法 文章目录 二分查找框架思路经典题型二分查找寻找左侧边界寻找右侧边界 刷题875. 爱吃香蕉的珂珂1011. 在 D 天内送达包裹的能力392. 判断子序列 二分查找 框架思路 int binarySearch(int[] nums, int target) {int left 0, righ…...
多环境开发-Profiles
在实际的项目开发中,我们通常会涉及多个环境,如开发环境(dev)、测试环境(test)和生产环境(pro)。在不同的环境下,程序的配置信息会有所不同,例如连接的数据库…...
《TCP/IP网络编程》学习笔记 | Chapter 18:多线程服务器端的实现
《TCP/IP网络编程》学习笔记 | Chapter 18:多线程服务器端的实现 《TCP/IP网络编程》学习笔记 | Chapter 18:多线程服务器端的实现线程的概念引入线程的背景线程与进程的区别 线程创建与运行pthread_createpthread_join可在临界区内调用的函数工作&#…...
MambaVision:一种Mamba-Transformer混合视觉骨干网络
摘要 我们提出了一种新型混合Mamba-Transformer主干网络,称为MambaVision,该网络专为视觉应用而设计。我们的核心贡献包括重新设计Mamba公式,以增强其对视觉特征的高效建模能力。此外,我们还对将视觉Transformer(ViT&…...
【Visio使用教程】
Visio使用教程 1. Visio 的基本介绍1.1 Visio 是什么?核心特点: 1.2 主要功能与应用场景典型用途:行业应用: 1.3 版本与兼容性1.4 Visio下载1.5 安装 2. Visio 的界面与基础操作2.1 界面布局详解2.2 创建新文档与模板选择2.3 形状…...
深度学习-服务器训练SparseDrive过程记录
1、cuda安装 1.1 卸载安装失败的cuda 参考:https://blog.csdn.net/weixin_40826634/article/details/127493809 注意:因为/usr/local/cuda-xx.x/bin/下没有卸载脚本,很可能是apt安装的,所以通过执行下面的命令删除: a…...
什么是梯度方差和缩放因子
什么是梯度方差和缩放因子 目录 什么是梯度方差和缩放因子计算梯度方差(Fisher 信息)作用梯度方差计算方式(方差越大,参数越重要,小步更新(细致一些))示例使用缩放因子作用示例两者的区别总结在 LoRA(Low-Rank Adaptation)中,计算梯度方差和使用缩放因子是两个不同的概…...
Linux 如何上传本地文件以及下载文件到本地命令总结
如果你希望在 Shell 终端中将远程服务器上的文件下载到本地电脑,可以使用以下工具和命令: 1. rz / sz(用于 Xshell、MobaXterm 等终端) 如果你使用的是Xshell、SecureCRT、MobaXterm等支持 rz/sz 的终端,可以使用 rz …...
学习单片机需要多长时间才能进行简单的项目开发?
之前有老铁问我,学单片机到底要多久,才能进行简单的项目开发?是三个月速成,还是三年磨一剑? 今天咱们就来聊聊这个话题,我不是什么高高在上的专家,就是个踩过无数坑、烧过几块板子的“技术老友”…...
stm32 L432KC(mbed)入门第一课
目录 一. 前言 二. 专栏意义 三. MS入门第一课 一. 前言 新的一年MS课程又开始了,同时也到了该专栏的第三个年头。在前两年中,该专栏帮助了很多第一次接触单片机的同学。其中,有的同学订阅专栏是为了更好的完成并且通过MS这门课程…...
【面试手撕】非常规算法,多线程常见手撕题目
【面试手撕】非常规算法,多线程常见手撕题目 生产者消费者ReentrantLock实现的生产苹果/消费苹果synchronized实现的生产消费LinkedBlockingQueue阻塞队列方法实现多条件资源分配分布式任务调度模拟 交替打印两个线程交替打印1-100之间的数ReentrantLock 实现synchr…...
Python 基础语法详解
一、变量和数据类型 变量 在 Python 中,变量无需声明类型,直接赋值即可。变量名区分大小写。 # 整数类型 age 25 print(age) # 输出:25# 浮点数类型 height 1.75 print(height) # 输出:1.75# 字符串类型 name "张三&…...
批量给 Excel 添加或删除密码保护|Excel 批量设置打开密码和只读密码
我们在将 Excel 文档发送给第三方或者进行存档的时候,对 Excel 文档添加密码保护是非常重要的一个操作。添加保护后的 Excel 文档。就只能有相应权限的用户才能够打开或者编辑操作。尤其是当我们 Excel 文档中内容非常敏感非常重要的时候,添加保护就显得…...
4.JVM-垃圾回收介绍
记录个人学习中记录笔记,如有错误请您指正,谢谢🙏 垃圾回收器发展史 传统垃圾回收: 分代回收 不同代有不同的垃圾回收机制 保底 标记清除算法 垃圾识别算法 引用计数法 缺陷:下图2 出现循环引用 无法解决 可达性分析 大部分(Java,pytho…...
Redis-锁-商品秒杀防止超卖
一、秒杀(Seckill) 1. 定义 秒杀:短时间内(如1秒内)大量用户同时抢购 限量低价商品 的营销活动。典型场景:双11热门商品抢购、小米手机首发、演唱会门票开售。 2. 技术挑战 挑战点说明后果…...
PostgreSQL 多数据库集簇配置及多数据库复制方法【流程+代码实例】
PostgreSQL 多数据库集簇配置及多数据库复制方法 1. 多数据库集簇配置 安装下载完postgresql后,系统此时包含一个postgres用户和一个名为postgres的默认数据库。 PostgreSQL 基本命令 服务管理命令 # 停止和启动及重启PostgreSQL服务 sudo systemctl stop postgr…...
【k8s004】 Docker 打包 K8s镜像
文章目录 一. 准备工作1. 安装 Docker: [官方安装文档](https://docs.docker.com/get-docker/)2. 准备应用代码(示例使用 Node.js 应用) 二. 创建 Dockerfile3、构建镜像(注意最后的点号)4、测试运行5、推送镜像到仓库6、 Kuberne…...
std::invoke详解
基础介绍 c17版本引入了std::invoke特性,这是一个通用的调用包装器,可以统一调用: 普通函数成员函数函数对象Lambda表达式指向成员的指针 它的主要作用是提供一个统一的方式来调用各种可调用对象。 std::invoke依赖的头文件:#…...
第一个vue项目
项目目录 启动vue项目 npm run serve 1.vue.config.js文件 (CLI通过vue-cli-serve启动项目,解析配置配置文件vue-condig-js) // vue.config.js //引入path板块,这是Node.js的一个内置模块,用于处理文件路径,这里引用…...
