c#快速入门(下)

在这里插入图片描述

欢迎来到Cefler的博客😁
🕌博客主页:那个传说中的man的主页
🏠个人专栏:题目解析
🌎推荐文章:题目大解析2

在这里插入图片描述


目录

  • 👉🏻Inline和lambda
    • 委托和lambda
  • 👉🏻Linq
    • from,where,select关键字
  • 👉🏻聊聊c#中的静态
  • 👉🏻 实例构造函数、静态构造函数、析构函数
    • this 关键字
  • 👉🏻重写和多态
  • 👉🏻接口
    • 什么是接口?
    • 接口实现多态
  • 👉🏻解耦
  • 👉🏻事件
  • 👉🏻泛型

👉🏻Inline和lambda

在C#中,inline和lambda都是用于函数的简写方式。inline函数是一种将函数体直接插入到调用点的函数,而lambda函数是一种匿名函数,可以在需要时定义和使用。
下面是一些示例:👇🏻

// Inline function example
public class MyClass
{
  
    public static int Add(int a, int b)
    {
        return a + b;
    }
}

// Lambda function example
public class Program
{
    static void Main(string[] args)
    {
    //Func<int, int> square = new  Func<int, int>((int x)=>{return x*x;});
        Func<int, int> square = x => x * x;
        Console.WriteLine(square(5)); // Output: 25
    }
}

委托和lambda

在C#中,委托是一种类型,它可以封装一个或多个方法,并允许将这些方法作为参数传递给其他方法。委托可以让你编写更灵活、更可扩展的代码,从而提高代码的可维护性和可重用性。委托的声明语法如下:

delegate void MyDelegate(int arg);

在这个示例中,我们定义了一个名为MyDelegate的委托,它可以封装一个参数为int类型、返回值为void的方法。

委托还可以使用匿名方法和Lambda表达式来创建。例如,下面是一个使用Lambda表达式创建委托的示例:

MyDelegate del = arg => Console.WriteLine("The argument is: " + arg);
del(10); // outputs "The argument is: 10"

在这个示例中,我们使用Lambda表达式创建了一个MyDelegate对象,并将其赋值给del变量。Lambda表达式定义了一个参数为arg的方法体,它输出arg的值。然后,我们调用MyDelegate对象,并传递一个int类型的参数。由于MyDelegate对象封装了Lambda表达式,因此在调用MyDelegate对象时,实际上是调用了Lambda表达式。

👉🏻Linq

在C#中,LINQ是一种用于查询数据的语言集成查询(Language Integrated Query)技术。它允许你使用类似于SQL的语法来查询各种数据源,包括数组、集合、数据库和XML文档等。下面是一些示例:

// Querying an array
int[] numbers = { 1, 2, 3, 4, 5 };
var evenNumbers = from n in numbers
                  where n % 2 == 0
                  select n;

// Querying a collection
List<Person> people = new List<Person>();
people.Add(new Person { Name = "John", Age = 30 });
people.Add(new Person { Name = "Jane", Age = 25 });
var adults = from p in people
             where p.Age >= 18
             select p;

// Querying a database
var db = new MyDatabaseContext();
var customers = from c in db.Customers
                where c.City == "New York"
                select c;

// Querying an XML document
var doc = XDocument.Load("data.xml");
var products = from p in doc.Descendants("product")
               where (int)p.Element("price") < 50
               select new {
                   Name = (string)p.Element("name"),
                   Price = (decimal)p.Element("price")
               };

在这些示例中,我们使用LINQ查询了不同类型的数据源。在每个查询中,我们使用from子句指定要查询的数据源,然后使用where子句指定要筛选的条件,最后使用select子句指定要返回的结果。在查询结果中,我们可以使用var关键字来推断出返回的类型,也可以使用匿名类型来返回自定义的结果。

from,where,select关键字

from🌞
from子句用于指定要查询的数据源,可以是数组、集合、数据库表或XML文档等。例如,我们可以使用from子句查询一个整数数组中的所有偶数:

int[] numbers = { 1, 2, 3, 4, 5 };
var evenNumbers = from n in numbers
                  where n % 2 == 0
                  select n;

where🌞
where子句用于指定要筛选的条件,可以是任何返回布尔值的表达式。例如,我们可以使用where子句筛选一个人员列表中的所有成年人:

List<Person> people = new List<Person>();
people.Add(new Person { Name = "John", Age = 30 });
people.Add(new Person { Name = "Jane", Age = 25 });
var adults = from p in people
             where p.Age >= 18
             select p;

select🌞
select子句用于指定要返回的结果,可以是任何表达式。例如,我们可以使用select子句返回一个整数数组中的所有偶数的平方:

int[] numbers = { 1, 2, 3, 4, 5 };
var evenSquares = from n in numbers
                  where n % 2 == 0
                  select n * n;

👉🏻聊聊c#中的静态

c#中为什么要有静态类,静态成员,静态函数,意义是什么呢? 🤔

实际上,静态类、静态成员和静态函数是用于在类级别上定义数据和行为的方法。它们与实例成员不同,因为它们不需要实例化对象就可以访问
静态类🌙
静态类是一种只包含静态成员的类。它们不能被实例化,因为它们没有实例构造函数。静态类通常用于定义全局数据和行为,例如数学函数库或常量集合。下面是一个示例:

public static class MathUtils
{
    public const double Pi = 3.14159265358979323846;

    public static double DegreesToRadians(double degrees)
    {
        return degrees * Pi / 180.0;
    }
}

静态成员🌙
静态成员是在类级别上定义的数据和行为。它们与实例成员不同,因为它们不需要实例化对象就可以访问。静态成员通常用于定义全局数据和行为,例如单例模式或全局计数器。下面是一个示例:

public class MyClass
{
    private static int instanceCount = 0;

    public MyClass()
    {
        instanceCount++;
    }

    public static int InstanceCount
    {
        get { return instanceCount; }
    }
}

静态函数🌙
静态函数是在类级别上定义的行为。它们与实例函数不同,因为它们不需要实例化对象就可以访问。静态函数通常用于定义全局行为,例如工具函数工厂方法。下面是一个示例:

public class StringUtils
{
    public static bool IsNullOrEmpty(string value)
    {
        return string.IsNullOrEmpty(value);
    }
}

👉🏻 实例构造函数、静态构造函数、析构函数

在C#中,实例构造函数、静态构造函数和析构函数是用于类的特殊方法。它们分别在创建对象、初始化类和销毁对象时被调用。它们具有与类相同的名称,并且没有参数或返回类型
一、构造函数
实例构造函数是用于创建对象时初始化对象的方法。具有与类相同的名称,并且没有返回类型。例如,下面是一个示例:

public class MyClass
{
    public int MyProperty { get; set; } 

    public MyClass(int myProperty)
    {
        MyProperty = myProperty;
    }
}

二、静态构造函数
静态构造函数是用于初始化类的静态成员的方法。具有与类相同的名称,并且没有参数或返回类型。例如,下面是一个示例:

public class MyClass
{
    public static int MyStaticProperty { get; set; }

    static MyClass()
    {
        MyStaticProperty = 42;
    }
}

三、析构函数
析构函数是用于销毁对象时执行清理操作的方法。具有与类相同的名称,但前面加上一个波浪号(~),并且没有参数或返回类型。例如,下面是一个示例:

public class MyClass
{
    ~MyClass()
    {
        // Cleanup code here
    }
}

this 关键字

在C#中,this关键字用于引用当前对象。它可以用于访问当前对象的成员变量成员函数构造函数。在以下情况下,你可以使用this关键字:

  1. 区分局部变量和成员变量:如果一个成员变量和一个局部变量同名,你可以使用this关键字来引用成员变量。例如
public class MyClass
{
    private int myProperty;

    public void SetMyProperty(int myProperty)
    {
        this.myProperty = myProperty;
    }
}

在这个示例中,我们定义了一个名为MyClass的类,它包含一个名为myProperty的成员变量和一个名为SetMyProperty的函数。当我们调用SetMyProperty函数时,我们使用this关键字来引用成员变量myProperty,以区分它和函数参数myProperty。

  1. 在构造函数中调用其他构造函数:如果一个类有多个构造函数,你可以使用this关键字在一个构造函数中调用另一个构造函数。例如:
public class MyClass
{
    private int myProperty;

    public MyClass() : this(0)
    {
    }

    public MyClass(int myProperty)
    {
        this.myProperty = myProperty;
    }
}

在这个示例中,我们定义了一个名为MyClass的类,它包含一个名为myProperty的成员变量和两个构造函数。第一个构造函数调用第二个构造函数,并将myProperty初始化为0。第二个构造函数接受一个整数参数,并将myProperty初始化为该参数的值。

总结🧊:

在C#中,你可以使用this关键字来引用当前对象。它可以用于访问当前对象的成员变量、成员函数和构造函数。在构造函数或方法中引用成员变量时,你可以选择使用或不使用this关键字,因为它的意义就是为了方便你区分局部变量和成员变量。如果一个成员变量和一个局部变量同名,你可以使用this关键字来引用成员变量,以区分它和函数参数。
2.
在C#中,this关键字用于引用当前对象,它可以用于访问当前对象的成员变量、成员函数和构造函数。然而,this关键字只能用于访问实例成员,而不能用于访问静态成员。静态成员是在类级别上定义的数据和行为,它们与实例成员不同,因为它们不需要实例化对象就可以访问。因此,如果你想访问静态成员,你应该使用类名来引用它们,而不是使用this关键字

👉🏻重写和多态

在C#中,重写和多态是面向对象编程的两个重要概念。重写是指在派生类重新定义基类中已有的成员函数,以便在派生类中提供更具体的实现。多态是指在运行时根据对象的实际类型来调用相应的成员函数,以便实现动态绑定。
重写可以通过在派生类中使用override关键字来实现。例如,下面是一个示例:

public class Animal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("The animal makes a sound");
    }
}

public class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("The dog barks");
    }
}

在这个示例中,我们定义了一个名为Animal的基类和一个名为Dog的派生类。Animal类包含一个名为MakeSound的虚函数,它在派生类中可以被重写。Dog类重写了MakeSound函数,并提供了更具体的实现。
多态可以通过在基类中使用虚函数和在派生类中使用重写函数来实现。例如,下面是一个示例:

Animal animal = new Animal();
animal.MakeSound(); // The animal makes a sound

Animal dog = new Dog();
dog.MakeSound(); // The dog barks

在这个示例中,我们创建了一个Animal对象和一个Dog对象,并调用它们的MakeSound函数。由于Animal类的MakeSound函数是虚函数,因此在运行时会根据对象的实际类型来调用相应的成员函数,从而实现了多态

我可以简单理解多态就是实例化一个对象后,对这个对象进行实时传参实现动态变化,然后这就叫做多态吗?
答案是
在这里插入图片描述

多态是指在运行时根据对象的实际类型来调用相应的成员函数,以便实现动态绑定。它可以让你编写更灵活、更可扩展的代码,从而提高代码的可维护性和可重用性。实现多态需要使用虚函数和重写函数。虚函数是在基类中声明的函数,它可以在派生类中被重写。重写函数是在派生类中重新定义基类中已有的成员函数,以便在派生类中提供更具体的实现。因此,多态的实现前提是要先创建虚函数并且重写函数。

👉🏻接口

什么是接口?

在C#中,接口是一种定义类之间协作的契约。它定义了一组方法、属性和事件,这些方法、属性和事件可以被实现该接口的类所使用。接口声明的语法如下

interface IMyInterface
{
    void MyMethod();
    int MyProperty { get; set; }
    event EventHandler MyEvent;
}

在这个示例中,我们定义了一个名为IMyInterface的接口,它包含一个名为MyMethod的方法、一个名为MyProperty的属性和一个名为MyEvent的事件。实现该接口的类必须实现这些成员。例如:

class MyClass : IMyInterface
{
    public void MyMethod()
    {
        // implementation
    }

    public int MyProperty { get; set; }

    public event EventHandler MyEvent;
}

在这个示例中,我们定义了一个名为MyClass的类,它实现了IMyInterface接口。我们必须实现IMyInterface接口中定义的所有成员,包括MyMethod方法、MyProperty属性和MyEvent事件。现在,我们可以创建一个MyClass对象,并使用它的成员,例如:

IMyInterface obj = new MyClass();
obj.MyMethod();
obj.MyProperty = 10;
obj.MyEvent += (sender, args) => Console.WriteLine("Event raised");

在这个示例中,我们创建了一个IMyInterface对象,并将MyClass对象传递给它。由于MyClass类实现了IMyInterface接口,因此我们可以使用IMyInterface类型的参数来传递它。这种方式可以让我们在不知道对象的具体类型的情况下,使用它的成员。

接口实现多态

在C#中,接口是一种用于定义行为的抽象类型。它们是一组方法、属性和事件的声明,没有实现。接口可以被类或结构体实现,以便提供特定的行为。接口可以用于实现多态和解耦,从而提高代码的可维护性和可扩展性。

下面是一个示例

public interface IShape
{
    double Area { get; }
    double Perimeter { get; }
}

public class Rectangle : IShape
{
    public double Width { get; set; }
    public double Height { get; set; }

    public double Area
    {
        get { return Width * Height; }
    }

    public double Perimeter
    {
        get { return 2 * (Width + Height); }
    }
}

public class Circle : IShape
{
    public double Radius { get; set; }

    public double Area
    {
        get { return Math.PI * Radius * Radius; }
    }

    public double Perimeter
    {
        get { return 2 * Math.PI * Radius; }
    }
}

在这个示例中,我们定义了一个名为IShape的接口,它包含两个属性:Area和Perimeter。我们还定义了两个类:Rectangle和Circle,它们都实现了IShape接口。Rectangle类实现了Area和Perimeter属性,以便计算矩形的面积和周长。Circle类实现了Area和Perimeter属性,以便计算圆形的面积和周长。

接口可以用于实现多态,例如

IShape shape1 = new Rectangle { Width = 10, Height = 20 };
IShape shape2 = new Circle { Radius = 5 };

Console.WriteLine("Shape 1 area: {0}", shape1.Area);
Console.WriteLine("Shape 1 perimeter: {0}", shape1.Perimeter);

Console.WriteLine("Shape 2 area: {0}", shape2.Area);
Console.WriteLine("Shape 2 perimeter: {0}", shape2.Perimeter);

在这个示例中,我们创建了一个Rectangle对象和一个Circle对象,并将它们赋值给IShape类型的变量。由于Rectangle和Circle类都实现了IShape接口,因此我们可以使用IShape类型的变量来访问它们的Area和Perimeter属性,从而实现了多态。

👉🏻解耦

在C#中,解耦是指将代码中的不同部分分离开来,以便实现更高的可维护性和可扩展性。解耦可以通过使用接口抽象类委托事件等技术来实现。例如,使用接口可以将代码中的实现与接口分离开来,从而使得代码更容易维护和扩展。
下面是一个示例:

public interface ILogger
{
    void Log(string message);
}

public class ConsoleLogger : ILogger
{
    public void Log(string message)
    {
        Console.WriteLine(message);
    }
}

public class FileLogger : ILogger
{
    public void Log(string message)
    {
        // write message to file
    }
}

public class MyClass
{
    private readonly ILogger _logger;

    public MyClass(ILogger logger)
    {
        _logger = logger;
    }

    public void DoSomething()
    {
        // do something
        _logger.Log("Something was done");
    }
}

在这个示例中,我们定义了一个名为ILogger的接口,它包含一个名为Log的方法。我们还定义了两个类:ConsoleLogger和FileLogger,它们都实现了ILogger接口。MyClass类包含一个名为DoSomething的方法,它使用ILogger类型的参数来记录日志。现在,我们可以创建一个MyClass对象,并将ConsoleLogger或FileLogger对象传递给它的构造函数,例如:

var myClass = new MyClass(new ConsoleLogger());
myClass.DoSomething(); // logs "Something was done" to the console

var myClass2 = new MyClass(new FileLogger());
myClass2.DoSomething(); // logs "Something was done" to a file

在这个示例中,我们创建了一个MyClass对象,并将ConsoleLogger或FileLogger对象传递给它的构造函数。由于ConsoleLogger和FileLogger类都实现了ILogger接口,因此我们可以使用ILogger类型的参数来传递它们。这种方式可以将代码中的实现与接口分离开来,从而使得代码更容易维护和扩展。

我是否可以认为,解耦就是将接口中的方法具体扩展成其它方法实现更多功能,比如接口中的方法只是一个传参函数,但是我通过接口实现对该传参函数的加减功能,这样理解对吗?

将接口中的方法具体扩展成其他方法实现更多功能是一种实现解耦的方式。例如,你可以定义一个接口,其中包含一个名为DoSomething的方法,然后在实现该接口的类中,通过重写DoSomething方法来实现不同的功能。例如:

public interface IMyInterface
{
    void DoSomething(int value);
}

public class MyClass : IMyInterface
{
    public void DoSomething(int value)
    {
        Console.WriteLine("The value is: " + value);
    }
}

public class MyOtherClass : IMyInterface
{
    public void DoSomething(int value)
    {
        Console.WriteLine("The value plus 1 is: " + (value + 1));
    }
}

在这个示例中,我们定义了一个名为IMyInterface的接口,它包含一个名为DoSomething的方法。我们还定义了两个类:MyClass和MyOtherClass,它们都实现了IMyInterface接口。MyClass类实现了DoSomething方法,以便输出传入的值。MyOtherClass类重写了DoSomething方法,并在输出传入的值之前将其加1。现在,我们可以创建一个IMyInterface对象,并将MyClass或MyOtherClass对象传递给它,例如:

IMyInterface obj1 = new MyClass();
obj1.DoSomething(10); // outputs "The value is: 10"

IMyInterface obj2 = new MyOtherClass();
obj2.DoSomething(10); // outputs "The value plus 1 is: 11"

在这个示例中,我们创建了一个IMyInterface对象,并将MyClass或MyOtherClass对象传递给它。由于MyClass和MyOtherClass类都实现了IMyInterface接口,因此我们可以使用IMyInterface类型的参数来传递它们。这种方式可以将接口中的方法具体扩展成其他方法实现更多功能,从而实现解耦。

👉🏻事件

在C#中,事件是一种特殊的委托,它允许对象在发生特定的操作时通知其他对象。
事件的声明语法如下:

public event EventHandler MyEvent;

在这个示例中,我们定义了一个名为MyEvent的事件,它使用EventHandler委托作为其类型。EventHandler委托是一种预定义的委托,它可以封装一个没有参数和返回值的方法。现在,我们可以创建一个包含MyEvent事件的类,并在该事件发生时通知其他对象,例如:

public class MyClass
{
    public event EventHandler MyEvent;

    public void DoSomething()
    {
        // do something
        OnMyEvent();
    }

    protected virtual void OnMyEvent()
    {
        MyEvent?.Invoke(this, EventArgs.Empty);
      
    }
}

public class MyOtherClass
{
    public void HandleMyEvent(object sender, EventArgs e)
    {
        Console.WriteLine("MyEvent was raised");
    }
}

MyClass obj1 = new MyClass();
MyOtherClass obj2 = new MyOtherClass();
obj1.MyEvent += obj2.HandleMyEvent;
obj1.DoSomething(); // outputs "MyEvent was raised"

MyEvent?.Invoke(this, EventArgs.Empty)是一个调用MyEvent事件的语句,它会触发MyEvent事件,并将当前对象和一个空的EventArgs对象作为参数传递给事件处理程序。这个语句中的==问号是一个空值条件运算符,它可以确保在MyEvent为null时不会引发NullReferenceException异常。
在这个语句中,this指的是包含MyEvent事件的类的实例,也就是MyClass的实例。因此,MyEvent?.Invoke(this, EventArgs.Empty)会将MyClass的实例和一个空的EventArgs对象作为参数传递给事件处理程序。

在这个示例中,我们定义了一个名为MyClass的类,它包含一个名为MyEvent的事件和一个名为DoSomething的方法。当DoSomething方法被调用时,它会调用OnMyEvent方法,以便触发MyEvent事件。我们还定义了一个名为MyOtherClass的类,它包含一个名为HandleMyEvent的方法,用于处理MyEvent事件。现在,我们可以创建一个MyClass对象和一个MyOtherClass对象,并将MyOtherClass对象的HandleMyEvent方法注册到MyClass对象的MyEvent事件上。当MyClass对象的DoSomething方法被调用时,它会触发MyEvent事件,并调用MyOtherClass对象的HandleMyEvent方法。

在我们之前的示例中,MyClass类是事件的拥有者,它包含了一个名为MyEvent的事件。MyOtherClass类是事件的响应者,它包含了一个名为HandleMyEvent的方法,用于处理MyEvent事件。MyClass类中的OnMyEvent方法是事件处理器,它用于触发MyEvent事件。MyClass类中的MyEvent事件是事件订阅,它允许其他对象将其方法注册到该事件上,以便在事件发生时得到通知。

🌈事件还可以使用自定义委托来声明。
例如,下面是一个使用自定义委托声明事件的示例:

public delegate void MyEventHandler(object sender, MyEventArgs e);

public class MyClass
{
    public event MyEventHandler MyEvent;

    public void DoSomething()
    {
        // do something
        OnMyEvent(new MyEventArgs());
    }

    protected virtual void OnMyEvent(MyEventArgs e)
    {
        MyEvent?.Invoke(this, e);
    }
}

public class MyEventArgs : EventArgs
{
    // event data
}

public class MyOtherClass
{
    public void HandleMyEvent(object sender, MyEventArgs e)
    {
        Console.WriteLine("MyEvent was raised");
    }
}

MyClass obj1 = new MyClass();
MyOtherClass obj2 = new MyOtherClass();
obj1.MyEvent += obj2.HandleMyEvent;
obj1.DoSomething(); // outputs "MyEvent was raised"

在这个示例中,我们定义了一个名为MyEventHandler的自定义委托,它可以封装一个包含两个参数的方法:一个object类型的sender参数和一个MyEventArgs类型的e参数。我们还定义了一个名为MyEventArgs的类,它继承自EventArgs类,并包含一些事件数据。现在,我们可以创建一个MyClass对象和一个MyOtherClass对象,并将MyOtherClass对象的HandleMyEvent方法注册到MyClass对象的MyEvent事件上。当MyClass对象的DoSomething方法被调用时,它会触发MyEvent事件,并调用MyOtherClass对象的HandleMyEvent方法。

👉🏻泛型

泛型可以让你定义一种通用的类型或方法,它可以在编译时确定具体的类型或参数。
泛型的声明语法如下:

class MyClass<T>
{
    // class definition
}

void MyMethod<T>(T arg)
{
    // method body
}

在这个示例中,我们定义了一个名为MyClass的泛型类,它使用T作为其类型参数。现在,我们可以创建一个MyClass对象,并指定T的具体类型,例如:

MyClass<int> obj = new MyClass<int>();

在这个示例中,我们创建了一个MyClass对象,并指定T的具体类型为int。这意味着我们可以在MyClass类中使用int类型的变量和方法。类似地,我们还可以定义一个名为MyMethod的泛型方法,并使用T作为其类型参数。现在,我们可以调用MyMethod方法,并传递一个具体的参数,例如:

MyMethod<int>(10);

使用场景🌊:

  1. 集合类:C#中的集合类(如List、Dictionary等)都是使用泛型实现的。这意味着你可以使用这些集合类来存储任何类型的数据,而不需要进行类型转换。

  2. 数据库访问:在访问数据库时,你可能需要编写一些通用的代码来处理不同类型的数据。使用泛型可以让你编写更灵活、更可重用的代码,从而提高代码的可维护性和可重用性。

  3. 委托和事件:在C#中,委托和事件都可以使用泛型来实现。这意味着你可以定义一种通用的委托或事件,并在编译时确定具体的参数类型。

  4. LINQ:LINQ是C#中的一种查询语言,它可以让你使用类似SQL的语法来查询数据。LINQ使用泛型来实现,这意味着你可以在查询时使用任何类型的数据。


如上便是本期的所有内容了,如果喜欢并觉得有帮助的话,希望可以博个点赞+收藏+关注🌹🌹🌹❤️ 🧡 💛,学海无涯苦作舟,愿与君一起共勉成长
在这里插入图片描述
在这里插入图片描述


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

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

相关文章

操作系统(2.8)--线程的实现

目录 线程的实现方式 1.内核支持线程(KST) 2.用户级线程(ULT) 3.组合方式 线程的实现 1.内核支持线程的实现 2.用户级线程的实现 线程的创建和终止 线程的实现方式 1.内核支持线程(KST) 内核支持线程&#xff0c;与进程相同&#xff0c;是在内核的支持下运行的&#x…

前端使用tailwindcss 快速实现主题切换方案

使用Tailwind CSS在黑暗模式下为你的网站设计样式。 现在&#xff0c;黑暗模式是许多操作系统的第一流功能&#xff0c;为你的网站设计一个黑暗版本以配合默认设计&#xff0c;变得越来越普遍。 为了使这一点尽可能简单&#xff0c;Tailwind包括一个暗色变体&#xff0c;让你…

JVM之类的初始化与类加载机制

类的初始化 clinit 初始化阶段就是执行类构造器方法clinit的过程。此方法不需定义&#xff0c;是javac编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并而来。构造器方法中指令按语句在源文件中出现的顺序执行。clinit不同于类的构造器。(关联&#xff1a;…

连锁药店系统:如何提高效率和客户满意度?

连锁药店系统是一种用于提高效率和客户满意度的软件系统&#xff0c;它能够管理多个药店的日常营运。通过这种系统&#xff0c;药店可以更好地管理库存、员工、销售和客户信息等方面&#xff0c;从而提高整体的经营效率。 首先&#xff0c;连锁药店系统能够帮助药店管理库存。系…

算法刷题总结 (十一) 二叉树

算法总结11 二叉树 一、二叉树的概念1.1、什么是二叉树&#xff1f;1.2、二叉树的常见类型1.2.1、无数值&#xff08;1&#xff09;、满二叉树&#xff08;2&#xff09;、完全二叉树 1.2.2、有数值&#xff08;3&#xff09;、二叉搜索树&#xff08;4&#xff09;、平衡二叉搜…

数字孪生与物流园区:优化布局规划的关键

随着全球贸易的增长和物流行业的发展&#xff0c;物流园区作为重要的物流枢纽和供应链管理中心&#xff0c;扮演着至关重要的角色。而数字孪生技术的出现为物流园区的运营和管理带来了革命性的变化。数字孪生技术是一种将实体物体与其数字化模型相结合的创新技术&#xff0c;通…

【UEFI】BIOS 阶段全局变量类型

BIOS的几个阶段需要不同阶段的数据传递&#xff0c;下面介绍4个全局变量。 1 固件存储介绍 本规范描述了应该如何在非易失性存储器中存储和访问文件。固件实现必须支持标准的PI固件卷和固件文件系统格式&#xff08;下文所述&#xff09;&#xff0c;但可能支持其他存储格式。…

什么是一致性哈希?一致性哈希是如何工作的?如何设计一致性哈希?

1.什么是一致性哈希&#xff1f;一致性哈希是如何工作的&#xff1f;如何设计一致性哈希&#xff1f;05-25 2.系统设计&#xff1a;从零用户扩展到百万用户05-28 收起 如果你有 n 个缓存服务器&#xff0c;一个常见的负载均衡方式是使用以下的哈希方法&#xff1a; 服务器索…

强连通分量-tarjan算法缩点

一. 什么是强连通分量&#xff1f; 强连通分量&#xff1a;在有向图G中&#xff0c;如果两个顶点u,v间&#xff08;u->v&#xff09;有一条从u到v的有向路径&#xff0c;同时还有一条从v到u的有向路径&#xff0c;则称两个顶点强连通(strongly connected)。如果有向图G的每…

NLP实战:调用Gensim库训练Word2Vec模型

目录 一、准备工作 1. 安装Gensim库 2. 对原始语料分词 二、训练Word2Vec模型 三、模型应用 1.计算词汇相似度 ​编辑 2. 找出不匹配的词汇 3. 计算词汇的词频 四、总结 &#x1f368; 本文为[&#x1f517;365天深度学习训练营]内部限免文章&#xff08;版权归 *K同学…

Flask-RESTful的使用

Flask-RESTful的使用 Flask-RESTful基本使用安装定义资源Resources创建API实例添加资源到API运行Flask应用 请求处理请求解析参数校验 响应处理数据序列化定制返回格式 其他功能蓝图装饰器集合路由命名规范路由名称 Flask-RESTful Flask-RESTful是一个用于构建RESTful API的扩展…

C++类和对象 -- 知识点补充

补充 const成员函数static成员友元内部类匿名对象拷贝对象时的一些编译器优化 const成员函数 将const修饰的成员函数称为const成员函数&#xff0c;const修饰类成员函数&#xff0c;实际是修饰该成员函数隐含的this指针&#xff0c;表明在该成员函数中不能对类的成员进行修改。…

使用MockJS进行前端开发中的数据模拟

在前端开发中&#xff0c;有时我们需要在没有后端接口的情况下进行前端页面的开发和测试。这时&#xff0c;我们可以使用MockJS来模拟数据&#xff0c;以便进行开发和调试。MockJS是一个用于生成随机数据和拦截Ajax请求的JavaScript库&#xff0c;它能够帮助我们快速搭建起一个…

Linux---用户切换命令(su命令、sudo命令、exit命令)

1. su命令 root用户拥有最大的系统操作权限&#xff0c;而普通用户在许多地方的权限是受限的。 普通用户的权限&#xff0c;一般在其HOME目录内是不受限的。 一旦出了HOME目录&#xff0c;大多数地方&#xff0c;普通用户仅有只读和执行权限&#xff0c;无修改权限。 su 是…

【操作系统】01.操作系统概论

操作系统的发展历史 未配置操作系统 手工操作阶段 用户独占全机&#xff0c;人机速度矛盾导致系统资源利用率低 脱机输入输出方式 为了缓解主机cpu和IO设备之间速度不匹配的矛盾&#xff0c;出现了脱机IO技术 在外围机的控制下&#xff0c;通过输入设备&#xff0c;将数据输…

耗时1周整理了网络安全学习路线,非常详细!

前言 这一期就出一个怎么学习网络安全的学习路线和方法&#xff0c;觉得有用的话三连收藏下 首先咱们聊聊&#xff0c;学习网络安全方向通常会有哪些问题 1、打基础时间太长 学基础花费很长时间&#xff0c;光语言都有几门&#xff0c;有些人会倒在学习linux系统及命令的路上…

数论专题(3)逆元

目录 初步认识 逆元 定义 应用 费马小定理 好久没有更新我们的数论专题板块了&#xff0c;今天&#xff0c;我们就来探究一下新知——逆元。 初步认识 在数据非常大的情景下&#xff0c;我们通常会对数据先进行取模运算&#xff0c;来计算在一定的范围内进行处理。而运算…

Java 进阶 -- 集合(一)

本节描述Java集合框架。在这里&#xff0c;您将了解什么是集合&#xff0c;以及它们如何使您的工作更轻松&#xff0c;程序更好。您将了解组成Java Collections Framework的核心元素——接口、实现、聚合操作和算法。 介绍告诉您集合是什么&#xff0c;以及它们如何使您的工作…

day4,day5 -java集合框架

List、Set、Map等常用集合类的特点和用法。 常用集合类&#xff08;List、Set、Map 等&#xff09;是 Java 中提供的数据结构&#xff0c;用于存储和操作一组数据。以下是它们的特点和用法&#xff1a; List&#xff08;列表&#xff09;: 特点&#xff1a;有序集合&#xff0…

《深入理解计算机系统(CSAPP)》第8章 异常控制流 - 学习笔记

写在前面的话&#xff1a;此系列文章为笔者学习CSAPP时的个人笔记&#xff0c;分享出来与大家学习交流&#xff0c;目录大体与《深入理解计算机系统》书本一致。因是初次预习时写的笔记&#xff0c;在复习回看时发现部分内容存在一些小问题&#xff0c;因时间紧张来不及再次整理…
最新文章