C#学习笔记 - C#基础知识 - C#从入门到放弃 - C# 结构、类与属性

C# 入门基础知识 - C# 结构、类与属性

  • 第9节 结构、类与属性
    • 9.1 结构的使用
    • 9.2 枚举
    • 9.3 面向对象概述
    • 9.4 类与对象的关系
    • 9.5 类的声明
    • 9.6 属性的使用
      • 9.6.1 属性
      • 9.6.2 属性使用
    • 9.7 构造函数和析构函数
      • 9.7.1 构造函数
      • 9.7.2 析构函数
    • 9.8 类的继承
    • 9.9 类的封装
    • 9.10 类的多态

更多C#基础知识点可查看:C#学习笔记 - C#基础知识 - C#从入门到放弃

第9节 结构、类与属性

9.1 结构的使用

在C#中,结构(Struct)是一种用户自定义的数据类型,用于封装多个相关的值。与类(Class)不同,结构是值类型(Value Type),而不是引用类型(Reference Type)。

【示例程序代码】 一次性声明多个不同类型的变量

namespace 结构的使用
{//结构放于此空间,所有类都可访问public struct ClerkInfo{public string name;public int age;public string department;public char sex;}class Program{//如果放于此位置,只有当前Program类或继承类可以访问static void Main(string[] args){ClerkInfo c1 = new ClerkInfo();c1.name = "Flyer";c1.age = 24;c1.department = "数据库维护部";c1.sex = '男';Console.WriteLine("我是{0},{3}生,今年{1}岁,工作于{2}。",c1.name,c1.age,c1.department,c1.sex);Console.ReadKey();}}
}

运行程序:

我是Flyer,男生,今年24岁,工作于数据库维护部。

在示例代码中出现的一些使用结构的常见情况和示例说明:
1、声明结构:
要声明一个结构,可以使用 struct 关键字,后面跟着结构的名称和定义结构的内容。

    public struct ClerkInfo{public string name;public int age;public string department;public char sex;}

2、创建结构的实例:
可以使用 new 关键字创建结构的实例。

 ClerkInfo c1 = new ClerkInfo();

3、结构的成员访问:
结构的成员可以通过点符号进行访问。

 c1.name = "Flyer";c1.age = 24;c1.department = "数据库维护部";c1.sex = '男';

4、方法和属性:
结构可以包含方法和属性来定义结构的行为和操作。

可以为示例代码结构添加一个方法来打印结构的信息:

public struct ClerkInfo{public string name;public int age;public string department;public char sex;//可以在结构中添加一个打印信息功能public void PrintInfo(){Console.WriteLine("Name: {0}, Age: {1}",name,age);}}

然后,可以通过结构的实例调用该方法:

ClerkInfo c2 = new ClerkInfo()
{name = "程饱饱吃得好饱",age = 24
};
c2.PrintInfo();

运行程序:

Name: 程饱饱吃得好饱, Age: 24

5、结构作为参数和返回值:
结构可以作为方法的参数和返回值。当作为参数传递时,会进行值的复制。

        public void updateClerkInfoName(string newName){c.name = newName;}//当作为返回值返回时,会复制整个结构的值// 将 getClerkInfo() 定义为静态方法public static ClerkInfo getClerkInfo(){return new ClerkInfo{name = "程饱饱",age = 25};}
 // 调用 updateClerkInfoName() 方法c1.updateClerkInfoName("Choao");Console.WriteLine(c1.name);// 调用 getClerkInfo() 方法ClerkInfo clerk = ClerkInfo.getClerkInfo();Console.WriteLine(clerk.name);Console.WriteLine(clerk.age);

运行程序:

Choao
Name: 程饱饱吃得好饱, Age: 24
程饱饱
25

6、结构的默认构造函数:
结构可以具有默认构造函数。如果没有定义任何构造函数,编译器将自动为结构生成一个默认的无参数构造函数,该构造函数将初始化结构的所有字段为其类型的默认值。

【示例完整代码展示】

namespace 结构的使用
{//结构放于此空间,所有类都可访问public struct ClerkInfo{public string name;public int age;public string department;public char sex;public void PrintInfo(){Console.WriteLine("Name: {0}, Age: {1}", name, age);}//当作为参数传递时,会进行值的复制public void updateClerkInfoName(string newName){name = newName;}//当作为返回值返回时,会复制整个结构的值// 将 getClerkInfo() 定义为静态方法public static ClerkInfo getClerkInfo(){return new ClerkInfo{name = "程饱饱",age = 25};}}class Program{//如果放于此位置,只有当前Program类或继承类可以访问static void Main(string[] args){ClerkInfo c1 = new ClerkInfo();c1.name = "Flyer";c1.age = 24;c1.department = "数据库维护部";c1.sex = '男';            Console.WriteLine("我是{0},{3}生,今年{1}岁,工作于{2}。", c1.name, c1.age, c1.department, c1.sex);// 调用 updateClerkInfoName() 方法c1.updateClerkInfoName("Choao");Console.WriteLine(c1.name);// 调用 PrintInfo() 方法ClerkInfo c2 = new ClerkInfo{name = "程饱饱吃得好饱",age = 24};c2.PrintInfo();// 调用 getClerkInfo() 方法ClerkInfo clerk = ClerkInfo.getClerkInfo();Console.WriteLine(clerk.name);Console.WriteLine(clerk.age);Console.ReadKey();}}
}

运行程序:

我是Flyer,男生,今年24岁,工作于数据库维护部。
Choao
Name: 程饱饱吃得好饱, Age: 24
程饱饱
25

9.2 枚举

在C#中,枚举(Enumeration)允许定义一组命名常量。它们为常用的一组特定值提供了一个描述性的名称。枚举在代码中提高可读性,并使代码更易于理解。

【代码示例】

namespace 枚举
{//在此空间声明枚举,枚举作用与结构类似,可以在结构中被调用public enum Gender{,}public enum Week{星期一,星期二,星期三,星期四,星期五,星期六,星期天}class Program{static void Main(string[] args){//枚举调用Gender myGender = Gender.;Week myWorkDay = Week.星期五;Console.WriteLine("我是{0}生,今天是{1}。",myGender,myWorkDay);	//我是男生,今天是星期五。//枚举中每个值会根据定义的顺序从0开始自动赋予每个值一个整型//(int)实现将枚举转换为整型Console.WriteLine((int)myGender);	//0Console.WriteLine((int)myWorkDay);	//4//Console.WriteLine(myGender.ToString());		//男Console.WriteLine(myWorkDay.ToString());	//星期五//将枚举转换为字符串 不能用(string)//只能用myWorkDay.ToString();或Convert.ToString(myWorkDay);Console.WriteLine(myGender);	//男Console.WriteLine(myWorkDay);	//星期五//(枚举名)实现将整型转换为枚举int myInt = 5;Console.WriteLine((Week)myInt); //星期六//将字符串转换为枚举值string myStr = "星期五";Console.WriteLine((Week)Enum.Parse(typeof(Week), myStr));	//星期五Console.ReadKey();}}
}

Note:
当枚举值没有明确赋值时,默认从0开始自增,所以 星期一 的值为0星期二 的值为1,依此类推。

枚举是用于表示一组有限的可能性的强类型标识符。

9.3 面向对象概述

C# 是一种面向对象的编程语言,它支持面向对象编程(OOP)的核心原则和概念。面向对象编程是一种用于构建软件系统的编程范式,它将现实世界中的问题分解为一组相关的对象,并通过对象之间的交互来解决这些问题。

以下是面向对象编程的一些核心概念和特性:

1、类(Class):
类是面向对象编程的基本构建块,它是对象的蓝图或模板。类定义了对象的属性(字段)和行为(方法)。

2、对象(Object):
对象是类的实例化,它是类定义的具体实体,具有特定的状态和行为。通过创建对象,我们可以使用类定义的属性和方法。

3、封装(Encapsulation):
封装是面向对象的一个重要概念,它将数据和方法封装在类中,并通过公共接口提供对它们的访问。封装隐藏了内部实现的细节,使对象的使用者只需关注公共接口。

4、继承(Inheritance):
继承允许一个类(子类)从另一个类(父类)继承属性和方法。子类可以扩展父类的功能,并添加自己的特定行为。继承实现了代码的重用和层次结构的建立。

5、多态(Polymorphism):
多态允许对象在不同的上下文中表现出不同的行为。通过多态,父类的引用可以指向子类的对象,使得在调用相同的方法时可以产生不同的结果。

9.4 类与对象的关系

对象是面向对象编程中两个重要的概念,它们之间存在着紧密的关系。

类(Class):
类是面向对象编程的基本构建块,它是对象的模板或蓝图,用于定义对象的属性(字段)和行为(方法)。类可以看作是一类对象的抽象表示,描述了对象的共同特性。
对象(Object):
对象是类的实例化,它是类的具体实体,具有特定的状态和行为。通过创建对象,可以使用类定义的属性和方法。

对象之间的关系如下:

类是对象的抽象,表示一类相似对象的定义。它描述了对象所具有的属性和方法,并提供了创建对象的模板。
对象是类的具体实例,它根据类的定义创建,并具有类所定义的属性和方法。可以通过关键字 new 来创建类的实例。
类是对象的定义;对象是类的实例。 类定义了对象的结构和行为,包括属性和方法等;而对象持有类定义的属性值和对方法的调用。

【示例代码】

class Car
{public string brand;public string color;public void Start(){Console.WriteLine("The car starts.");}public void Accelerate(){Console.WriteLine("The car accelerates.");}
}class Program
{static void Main(string[] args){// 创建一个Car类的对象Car myCar = new Car();// 设置对象的属性值myCar.brand = "Toyota";myCar.color = "Red";// 调用对象的方法myCar.Start();myCar.Accelerate();Console.ReadKey();}
}

在上述代码中,定义了一个名为 Car 的类,它具有 brandcolor 属性以及 Start( )Accelerate( ) 方法。在 Main 方法中,我们创建了一个 Car 类的对象 myCar,并设置了其品牌和颜色属性的值。然后,我们通过 myCar 对象调用了 Start( )Accelerate( ) 方法。

通过类和对象的关系,我们可以实现代码的封装性、复用性和可维护性。类定义了对象的结构和行为,而对象则代表了类的实例,具有类所定义的属性和方法。

9.5 类的声明

定义类的方式:
右击需要创建类的所在解决方案下的项目 --> 添加 --> 类 --> 命名、添加
完成后会打开一个新的页面,定义完成后保存,可返回Main方法中调用。

【类的声明】

    public enum Gender{,}class Clerk{//定义字段,字段可以存放多个值命名规范:_camelCase,变量只能放一个值public string _name;public Gender _gender;public int _age;public string _department;public int _workYears;//定义一个非静态方法public void Print(){Console.WriteLine("我叫{0},{1}生,今年{2}岁,在{3}部门工作{4}年了。",this._name, this._gender, this._age, this._department, this._workYears);}}

【类的调用】

        static void Main(string[] args){//调用类需将类实例化 实例化:将类指定个某个对象Clerk c1 = new Clerk();Clerk c2 = new Clerk();//c1对象赋值c1._name = "Flyer.Cheng";c1._gender = Gender.;c1._age = 24;c1._department = "数据库维护";c1._workYears = 2;//调用非静态方法c1.Print();//c2对象赋值c2._name = "Anna.Wang";c2._gender = Gender.;c2._age = 25;c2._department = "财务";c2._workYears = 3;//调用非静态方法c2.Print();//声明一个变量string myStr = "程饱饱";Console.WriteLine(c1._name);Console.WriteLine(c2._name);    //_name同一个字段 不同对象Console.WriteLine(myStr);Console.WriteLine(myStr);       //说明字段中可以存储多个值,而变量中只能存一个值Console.ReadKey();}

运行程序:

我叫Flyer.Cheng,男生,今年24岁,在数据库维护部门工作2年了。
我叫Anna.Wang,女生,今年25岁,在财务部门工作3年了。
Flyer.Cheng
Anna.Wang
程饱饱
程饱饱

9.6 属性的使用

9.6.1 属性

在C#中,属性(Properties)是一种特殊的成员,用于封装类的字段,以提供对字段的安全访问和控制。属性允许读取和写入私有字段的值,并提供了对字段的验证和计算的机会。

属性具有类似字段的语法,但在背后使用了getset访问器来实现对字段的访问和修改。通过属性,可以隐藏实际的字段,并在访问和修改字段时执行额外的逻辑。

以下是使用属性的基本语法:

访问修饰符 数据类型 属性名
{get { return 字段名; }set { 字段名 = value; }
}
  1. 访问修饰符:指定属性的可访问性,可以是public、private等。
  2. 数据类型:指定属性的数据类型,例如int、string等。
  3. 属性名:给属性命名的标识符,按照命名约定应使用PascalCase(首字母大写)。
  4. get访问器:用于获取属性的值。它是一个返回属性类型的代码块。
  5. set访问器:用于设置属性的值。它是一个接受属性类型的参数的代码块。

以下是一个简单的使用属性的示例:

class Person
{private string name;   // 私有字段public string Name   // 公共属性{get { return name; }set { name = value; }}
}

在上述的示例中,我们定义了一个名为Person的类,其中有一个私有字段 name 和一个公共属性 Name属性Name提供了对字段name的访问和修改

使用属性:

Person person = new Person();
person.Name = "flyer";   // 设置属性的值
string name = person.Name;   // 获取属性的值

通过属性,可以对字段的值进行控制和验证,可以在set访问器中加入一些逻辑,以确保赋给属性的值满足一定的条件。以下是一个使用属性验证的示例:

class Person
{private string name;   // 私有字段public string Name   // 公共属性{get { return name; }set {if (value != null && value.Length > 0){name = value;}}}
}

在上述示例中,添加了对属性 Name赋值的验证逻辑。只有当赋给属性的值不为空且长度大于0时,才赋给字段 name

属性还可以使用自动实现的方式来减少代码量。通过自动实现属性,不需要手动编写get和set访问器,编译器会自动生成默认的访问器。

以下是使用自动实现属性的示例:

class Person
{public string Name { get; set; }   // 自动实现属性
}

在上述代码中,使用简化的语法声明了一个自动属性 Name 。编译器会自动创建一个名为 Name 的私有字段,并使用 getset 访问器对属性的值进行读取和写入。

9.6.2 属性使用

1、属性的声明:
C#中属性的声明类似于方法的声明,但使用 getset 访问器来定义属性的读取和写入行为。属性通常与一个私有字段相关联,以存储属性的值。

public int MyProperty
{get { return myField; }  // 获取属性值并返回set { myField = value; } // 设置属性值
}

在上述代码中,声明了一个名为 MyProperty 的属性,它与一个名为 myField 的私有字段相关联。通过 get 访问器,返回字段的值,通过 set 访问器,设置字段的值。

2、自动属性:
C#中还提供了自动属性的简化语法,可以极大地简化属性的声明。自动属性会自动创建一个隐藏的私有字段,用于存储属性的值。下面是自动属性的示例:

public int MyProperty { get; set; }

在上述代码中,使用简化的语法声明了一个自动属性 MyProperty。编译器会自动创建一个名为 MyProperty 的私有字段,并使用 getset 访问器对属性的值进行读取和写入。

使用自动属性时,可以提供简洁性和可读性;但是如果需要在获取或设置属性值时执行其他逻辑,还是需要使用完整的属性声明。

3、只读属性:
如果只需要创建一个只读属性,即只有 get 访问器而没有 set 访问器,可以省略 set 访问器。只读属性只能在构造函数或属性的初始值设定项中设置值。

public int MyReadOnlyProperty { get; }

在上述代码中,声明了一个只读属性 MyReadOnlyProperty,只有 get 访问器。这意味着可以通过 get 访问器读取属性的值,但无法通过 set 访问器设置属性的值。

4、访问属性:

// 创建类的实例
MyClass obj = new MyClass();// 设置属性的值
obj.MyProperty = 10;// 获取属性的值
int value = obj.MyProperty;

在上述代码中,创建了一个类的实例 obj。通过 obj 对象,我们可以使用点运算符 . 来访问和设置属性的值。

Note:
① 属性由 get 和 set 访问器组成,用于读取和写入属性的值。
② 访问器可以定义为 public、private、protected 或 internal 等修饰符,用于控制对属性的访问级别。

【综合代码示例】

1、Clerk类的定义:

    class Clerk{//类中可以存放://字段:采用_camelCase命名方式//属性:采用PascaCase命名方式//方法://定义属性后往往都会通过属性来访问字段//通常情况下 属性声明为public 字段声明为private//在外部访问类中的字段都是通过属性实现public string _name;public string Name{get;set;    //自动属性进行预留,以防后期需要添加限定}public char _gender;//定义属性Gender//通常我们将get与set称为访问器,有四种://1>既读又写 同时包含get和set//2>只读 只包含get//3>只写 只包含set//4>自动 getpublic char Gender{get     //get可以对取值进行限定{if (_gender != '女' && _gender != '男')_gender = 'N';return _gender;}set     //set可以对赋值进行限定{ _gender = value; }}public int _age;//定义属性Agepublic int Age{get     //get可以对取值进行限定{return _age;}set     //set可以对赋值进行限定{if (value < 0 || value > 120) value = 0;_age = value;}}public string _department;public string Department{get;set;    //自动属性进行预留,以防后期需要添加限定}public int _workYears;public int WorkYears{get;set;    //自动属性进行预留,以防后期需要添加限定}public void Print(){Console.WriteLine("我叫{0},{1}生,今年{2}岁,我已经在{3}工作{4}年了。", this.Name, this.Gender, this.Age, this.Department, this.WorkYears);//this关键字表示当前类对象}}

2、主体方法调用类:

    class Program{static void Main(string[] args){//将类实例化后分别赋值,调用方法Clerk c1 = new Clerk();//直接调用c1.Name = "程饱饱";c1.Gender = '男';c1.Age = 24;c1.Department = "数据库开发维护部";c1.WorkYears = 2;c1.Print();//通过属性调用Console.WriteLine("通过属性访问字段:Gender:{0},Age:{1}。",c1.Gender,c1.Age);Console.ReadKey();          }}

9.7 构造函数和析构函数

9.7.1 构造函数

构造函数是用于初始化对象的特殊方法,它有以下特性:
① 它在创建对象时自动调用,并用于设置对象的初始状态。
② 名称与类的名称相同,并且没有返回类型。
③ 可以具有参数(参数化构造函数),用于在创建对象时传递参数。
④ 参数化构造函数可以接受不同类型和数量的参数。
⑤ 构造函数支持重载。

【示例代码】

1、类和方法的定义

    public enum Gender{,}class Clerk{private string _name;public string Name{get { return _name; }set { _name = value; }}private Gender _gender;public Gender Gender{get{ return _gender; }set{ _gender = value; }}      private int _age;public int Age{get{return _age;}set{_age = value;}}private string  _department;public string Department{get { return _department; }set { _department = value; }}private int _workYears;public int WorkYears{get { return _workYears; }set { _workYears = value; }}public void Print(){Console.WriteLine("我叫{0},{1}生,今年{2}岁,我已经在{3}工作{4}年了。", this.Name, this.Gender, this.Age, this.Department, this.WorkYears);}//构造函数:是一种特殊的方法,没有返回值但是不能使用void,必须public,且构造函数的名称必须跟类名一致public Clerk(string name,Gender gender,int age,string department,int workYears){this.Name = name;this.Gender = gender;this.Age = age;this.Department = department;this.WorkYears = workYears;}}

2、主体方法的调用
① 如果没有定义构造函数Clerk,需要实例化类然后赋值并调用:

    class Program{static void Main(string[] args){Clerk c1 = new Clerk();c1.Name = "程饱饱";c1.Gender = Gender.;c1.Age = 24;c1.Department = "数据库维护开发部";c1.WorkYears = 2;c1.Print();Console.ReadKey();}}
我叫程饱饱,男生,今年24岁,我已经在数据库维护开发部工作2年了。

② 定义构造函数Clerk后,可简化实例化及赋值代码:

    class Program{static void Main(string[] args){Clerk c1 = new Clerk("程饱饱",Gender.,24, "数据库维护开发部",2);c1.Print();Console.ReadKey();}}
我叫程饱饱,男生,今年24岁,我已经在数据库维护开发部工作2年了。

new 关键字:
1)在内存中开辟空间
2)在开辟空间中创建对象
3)对对象进行初始化,将各个属性值赋值

在创建类中会存在一个默认的无参数的构造函数,一旦定义了新的构造函数,不论新的构造函数是否有有参数,原默认的无参数的构造函数都会被覆盖掉
在这里插入图片描述

9.7.2 析构函数

析构函数 是在销毁对象时自动调用的特殊方法:
① 它的名称与类的名称相同,但在方法名前加上一个波浪号(~)。
② 析构函数没有参数,没有访问修饰符和返回类型。
③ 析构函数不需要手动调用,CLR(Common Language Runtime)会自动在对象销毁时调用析构函数。
④ 析构函数常用于执行一些清理操作,例如释放非托管资源、关闭文件、释放数据库连接等。

需要注意:
C#中的析构函数不像其他语言(如C++)那样可靠,无法保证准确的释放资源。因此,在C#中常用的是使用 Dispose( ) 方法和 using 语句来释放资源。

以下是析构函数的基本语法:

public class MyClass
{~MyClass() // 析构函数的声明{// 析构函数的代码}
}

关于析构函数:
1、析构函数的执行时机:
① 析构函数在对象被销毁时自动调用,也就是当对象的生命周期结束时(例如,对象离开作用域、对象被赋予其他引用、程序终止等)。
② 析构函数不能被显式调用,也不能手动触发对象的销毁。

2、析构函数的清理操作:
① 析构函数主要用于执行清理操作,例如释放非托管资源(如文件、数据库连接等)或其他资源的释放和关闭。
② 在析构函数中可以使用任何合法的C#代码,具体的清理操作根据需求来决定。

3、析构函数的注意事项:
① 析构函数通常用于释放非托管资源。对于托管资源(例如,使用垃圾回收管理的资源),不需要在析构函数中进行额外的处理,因为垃圾回收器会自动释放托管资源。
② 由于析构函数的执行时间是无法确定的,不要在析构函数中依赖于外部资源或其他对象的状态。
析构函数不能被继承、重载或显式调用。
③ 一个类只能有一个析构函数。

4、垃圾回收器(Garbage Collector)和析构函数:
① 垃圾回收器负责管理和释放托管内存,它会自动回收不再使用的对象以释放内存空间。
② 与垃圾回收器不同,析构函数主要用于释放非托管资源,并在对象销毁时执行其他清理操作(如关闭文件、释放数据库连接)。

9.8 类的继承

面向对象编程(Object-oriented programming)的三个基本特征是封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)。

9.9 类的封装

面向对象编程(Object-oriented programming)的三个基本特征是封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)。

9.10 类的多态

面向对象编程(Object-oriented programming)的三个基本特征是封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

非阻塞 IO(NIO)

文章目录 非阻塞 IO(NIO)模型驱动程序应用程序模块使用 非阻塞 IO(NIO) 上一节中 https://blog.csdn.net/tyustli/article/details/135140523&#xff0c;使用等待队列头实现了阻塞 IO 程序使用时&#xff0c;阻塞 IO 和非阻塞 IO 的区别在于文件打开的时候是否使用了 O_NONB…

Zookeeper的学习笔记

Zookeeper概念 Zookeeper是一个树形目录服务&#xff0c;简称zk。 Zookeeper是一个分布式的、开源的分布式应用程序的协调服务 Zookeeper提供主要的功能包括&#xff1a;配置管理&#xff0c;分布式锁&#xff0c;集群管理 Zookeeper命令操作 zk数据模型 zk中的每一个节点…

15-高并发-如何扩容

对于一个发展初期的系统来说&#xff0c;不太确定商业模型到底行不行&#xff0c;最好的办法是按照最小可行产品方法进行产品验证&#xff0c;因此&#xff0c;刚开始的功能会比较少&#xff0c;是一个大的单体应用&#xff0c;一般按照三层架构进行设计开发&#xff0c;使用单…

数字信号的理解

1 数字信号处理简介 数字信号处理 digital signal processing&#xff08;DSP&#xff09;经常与实际的数字系统相混淆。这两个术语都暗示了不同的概念。数字信号处理在本质上比实际的数字系统稍微抽象一些。数字系统是涉及的硬件、二进制代码或数字域。这两个术语之间的普遍混…

理解按需自动导入 unplugin-auto-import unplugin-vue-components

文章目录 unplugin-auto-import基础使用构建工具引入插件配置插件 import&#xff1a;配置自动导入规则使用预设自动引入第三方库自动导入 TypeScript 类型vue 预设的自动导入配置 dts&#xff1a;让编辑器环境识别 ts 类型eslintrc&#xff1a;解决 eslint 检查错误dirs&#…

使用PE信息查看工具和Dependency Walker工具排查因为库版本不对导致程序启动报错问题

目录 1、问题说明 2、问题分析思路 3、问题分析过程 3.1、使用Dependency Walker打开软件主程序&#xff0c;查看库与库的依赖关系&#xff0c;查看出问题的库 3.2、使用PE工具查看dll库的时间戳 3.3、解决办法 4、最后 VC常用功能开发汇总&#xff08;专栏文章列表&…

链表常见题型(1)

1.反转链表 1.1反转链表 如果我们想要反转链表&#xff0c;那应该有head的next指针指向空&#xff0c;其余结点的next指针反过来&#xff0c;指向它的上一个结点&#xff0c;那我们在执行该操作的时候就需要定义变量cur(current)表示我们当前遍历到的结点&#xff0c;变量pre(…

【后台报错】插入时sql报错,varchar撑爆

后台的一个报错。按照正常的需要复现&#xff0c;或者查一下日志。但是凭借多年经验和大胆猜测&#xff0c;以及对自己代码要自信 引用一下文章 目测7*15 105项。每个id有9个数字加上分隔符刚好十个。大概就是超过了定义的一千的varchar长度。直接改数据库就好了。 简单粗暴…

【金猿CIO展】乖宝宠物CIO王天刚:以数据为核心,转变业务模式

‍ 王天刚 本文由乖宝宠物CIO王天刚撰写并投递参与“数据猿年度金猿策划活动——2023大数据产业年度趋势人物榜单及奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 随着社会经济的快速发展&#xff0c;“宠物经济”悄然崛起&#xff0c;宠物在家中的角色地位有时…

c语言:计算1+2+3……+n的和|练习题

一、题目 输入一个数n&#xff0c;计算123……n的和 二、代码截图【带注释】 三、源代码【带注释】 #include int main() { int num0; printf("请输入要运算的数:"); scanf("%d",&num); sumResult(num);//相加结果函数 } //计算打印…

【智能家电】东胜物联离在线语音方案为厨电企业赋能,实现厨房智能化控制

近年来&#xff0c;我国厨电市场蓬勃发展。据行业统计数据显示&#xff0c;至今年6月&#xff0c;市场规模已达356亿元&#xff0c;同比增长8.8%。随着数字科技、物联网和人工智能的兴起&#xff0c;厨电产品正在朝着更智能、多功能化的方向迅速发展。 为此厨电厂商正在积极布…

EarMaster Pro 7 简体中文破解版 v7.2.0.42 电脑版

软件介绍 EarMaster破解版一款功能强大的专业级别多媒体音乐教育学习软件&#xff0c;EarMaster破解版提供了大量音乐相关的学习内容&#xff0c;用户在这里可以学习基础的和弦、音阶、节奏&#xff0c;也可以提升自己的音感&#xff0c;如果基础已经很扎实了&#xff0c;还可…

加拿大 ANUSPLIN 网格气候数据集

ANUSPLIN 网格气候数据集 加拿大 ANUSPLIN 网格气候数据集是使用澳大利亚国立大学样条 (ANUSPLIN) 模型生成的基于站点的插值数据集。它由加拿大农业和农业食品部生产&#xff0c;覆盖加拿大全境。该数据集提供 1950 年至 2015 年期间每日和每月时间步长的最高气温、最低气温和…

OpenFeign 万字教程详解

OpenFeign 万字教程详解 目录 一、概述 1.1.OpenFeign是什么&#xff1f;1.2.OpenFeign能干什么1.3.OpenFeign和Feign的区别1.4.FeignClient 二、OpenFeign使用 2.1.OpenFeign 常规远程调用2.2.OpenFeign 微服务使用步骤2.3.OpenFeign 超时控制2.4.OpenFeign 日志打印2.5.O…

【小黑嵌入式系统第十二课】μC/OS-III程序设计基础(二)——系统函数使用场合、时间管理、临界区管理、使用规则、互斥信号量

上一课&#xff1a; 【小黑嵌入式系统第十一课】μC/OS-III程序设计基础&#xff08;一&#xff09;——任务设计、任务管理&#xff08;创建&基本状态&内部任务&#xff09;、任务调度、系统函数 文章目录 一、系统函数使用场合1.1 时间管理1.1.1 控制任务的执行周期1…

CSS新手入门笔记整理:CSS3弹性盒模型

特点 子元素宽度之和小于父元素宽度&#xff0c;所有子元素最终的宽度就是原来定义的宽度。子元素宽度之和大于父元素宽度&#xff0c;子元素会按比例来划分宽度。在使用弹性盒子模型之前&#xff0c;必须为父元素定义“display:flex;”或“display:inline-flex;”。 弹性盒子…

一款基于.NET Core的快速开发框架、支持多种前端UI、内置代码生成器

前言 经常看到有小伙伴在技术群里问有没有什么好用且快速的开发框架推荐的&#xff0c;今天就给大家分享一款基于MIT License协议开源、免费的.NET Core快速开发框架、支持多种前端UI、内置代码生成器、一款高效开发的利器&#xff1a;WalkingTec.Mvvm框架&#xff08;简称WTM…

CyclicBarrier实战应用——实现异步多线程业务处理,异常情况回滚全部子线程

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; CyclicBarrier实战应用——实现异步多线程业务处理&#xff0c;异常情况…

Linux笔记本电脑投屏到电视,用网页浏览器就能投屏到电视!

Linux系统的电脑如果要投屏到安卓电视屏幕上&#xff0c;可以使用投屏工具AirDroid Cast的网页版和TV版一起实现。 首先&#xff0c;在Linux系统的电脑里用chrome浏览器或edge浏览器打开网址webcast.airdroid.com。这个网址就是AirDroid Cast的网页版。你可以看到中间白色框框的…

Canal使用详解

Canal介绍 Canal是阿里巴巴开发的MySQL binlog增量订阅&消费组件&#xff0c;Canal是基于MySQL二进制日志的高性能数据同步系统。在阿里巴巴集团中被广泛使用&#xff0c;以提供可靠的低延迟增量数据管道。Canal Server能够解析MySQL Binlog并订阅数据更改&#xff0c;而C…