当前位置: 首页 > news >正文

C#中面试的常见问题001

1、c#访问修饰符有哪些

  1. public:公共访问级别,成员可以被任何其他代码访问。
  2. private:私有访问级别,成员只能在定义它的类内部访问。
  3. protected:受保护的访问级别,成员可以被定义它的类及其子类访问。
  4. internal:内部访问级别,成员只能在同一个程序集(Assembly)中访问。
  5. protected internal:受保护的内部访问级别,成员可以在同一个程序集中访问,也可以被定义它的类及其子类访问。
  6. private protected:私有受保护的访问级别,成员只能在定义它的类及其子类中访问,但不能在同一个程序集中的其他类中访问。

2、值类型和引用类型

值类型(Value Types)

值类型存储在栈(Stack)上,它们直接包含数据。值类型的变量直接存储值本身。值类型的常见类型包括:

  1. 基本数据类型:如 intfloatdoubledecimalboolchar 和 byte 等。
  2. 结构体(struct):自定义的结构体类型。
  3. 枚举(enum):枚举类型,它是一种特殊的值类型,用于表示一组命名的常量。

值类型的一些特点:

  • 值类型是不可变的,除非它们被明确地修改。
  • 值类型在方法调用时是通过值传递的,即每次传递都会创建该值的一个副本。
  • 值类型不能为 null(除了Nullable类型)。

引用类型(Reference Types)

引用类型存储在堆(Heap)上,它们包含指向数据的引用。引用类型的变量存储的是指向实际数据的内存地址。引用类型的常见类型包括:

  1. 类(class):自定义的类类型。
  2. 接口(interface):接口类型。
  3. 数组(array):数组类型,即使数组的元素是值类型,数组本身也是引用类型。
  4. 委托(delegate):委托类型。

引用类型的一些特点:

  • 引用类型是可变的,它们的值可以在不改变引用的情况下被修改。
  • 引用类型在方法调用时是通过引用传递的,即传递的是指向数据的引用。
  • 引用类型可以为 null,表示它们不引用任何对象。

Nullable类型

C# 还支持可空类型(Nullable Types),它允许值类型存储 null 值。例如,int? 表示一个可以存储 int 值或 null 的变量。

装箱和拆箱

值类型和引用类型之间可以进行转换:

  • 装箱(Boxing):将值类型转换为引用类型的过程,通常是隐式的。
  • 拆箱(Unboxing):将引用类型转换回值类型的过程,这通常是显式的,并且需要类型转换。

3、托管代码和非托管代码

在C#和.NET框架中,托管代码(Managed Code)和非托管代码(Unmanaged Code)是两种不同的代码类型,它们在内存管理、类型安全、安全性和平台兼容性等方面有所不同。

托管代码(Managed Code)

托管代码是指在.NET环境中运行的代码,由公共语言运行时(Common Language Runtime,CLR)管理。C#、VB.NET和F#等.NET语言编写的代码都是托管代码。托管代码的特点包括:

  1. 内存管理:CLR自动管理托管代码的内存分配和释放,包括垃圾回收(Garbage Collection)。
  2. 类型安全:CLR在运行时检查数据类型,确保类型安全。
  3. 安全性:托管代码可以利用.NET框架提供的安全机制,如代码访问安全性(Code Access Security)。
  4. 跨语言集成:不同.NET语言编写的托管代码可以轻松集成,因为它们共享相同的运行时和库。
  5. 平台兼容性:托管代码可以在不同的操作系统和硬件平台上运行,只要这些平台支持.NET运行时。
  6. 异常处理:托管代码使用.NET框架的异常处理机制。

非托管代码(Unmanaged Code)

非托管代码是指不在.NET环境中运行的代码,不由CLR管理。C、C++等语言编写的代码通常是非托管代码。非托管代码的特点包括:

  1. 内存管理:开发者需要手动管理内存分配和释放,使用如 malloc 和 free(在C/C++中)等函数。
  2. 类型安全:非托管代码不提供运行时的类型检查,类型安全需要开发者自己保证。
  3. 平台依赖性:非托管代码通常与特定的操作系统和硬件平台紧密相关,移植性较差。
  4. 性能:非托管代码可以提供更接近硬件层面的操作,因此在某些情况下性能可能优于托管代码。
  5. 安全性:非托管代码的安全性需要开发者自己管理,没有.NET框架提供的安全机制。
  6. 异常处理:非托管代码使用各自语言的异常处理机制,如C++中的 trycatch 和 throw

交互

托管代码和非托管代码可以相互交互:

  • P/Invoke(Platform Invocation Services):托管代码可以通过P/Invoke调用非托管代码,如Windows API。
  • C++/CLI:C++的一个扩展,允许C++代码与托管代码交互。
  • COM互操作:允许托管代码和COM组件(非托管代码)之间进行通信。

4、GC回收机制

垃圾回收(Garbage Collection,简称GC)是.NET框架中的一个重要特性,它自动管理内存,释放不再使用的内存空间。这对于开发者来说是一个巨大的优势,因为它减少了内存泄漏和其他内存管理错误的风险。以下是GC的一些关键点:

工作原理

  1. 对象分配:当程序创建新对象时,这些对象被分配在堆(Heap)上。
  2. 根对象:GC使用一组“根”对象(如静态字段、局部变量等)作为起点,通过这些根对象可达的对象被认为是活跃的。
  3. 可达性分析:GC定期执行可达性分析,检查哪些对象是可达的(即被根对象直接或间接引用)。
  4. 清理:不可达的对象被认为是垃圾,GC将回收这些对象所占用的内存。

分代收集

.NET的GC使用分代收集策略,将对象分为三代:0代、1代和2代。

  1. 0代:新创建的对象首先被分配在0代。如果0代空间不足,GC会执行0代的垃圾回收。
  2. 1代:从0代垃圾回收中存活下来的对象被提升到1代。
  3. 2代:从1代垃圾回收中存活下来的对象被提升到2代。

这种分代策略基于这样一个假设:大多数对象的生命周期都很短,因此它们会在0代或1代的垃圾回收中被清理掉。

触发GC的条件

  1. 内存压力:当托管堆的内存使用量达到一定阈值时,GC会被触发。
  2. 显式调用:开发者可以通过调用 GC.Collect() 方法显式触发GC,但这通常不推荐,因为它可能会影响性能。

性能考虑

  1. 暂停时间:GC可能会引起应用程序的短暂暂停,尤其是在0代和1代的垃圾回收中。2代垃圾回收的暂停时间通常更长,但发生频率较低。
  2. 内存碎片:随着时间的推移,内存碎片可能会成为问题,尤其是在2代中。GC会尝试整理内存以减少碎片。

优化GC性能

  1. 选择合适的GC模式:.NET提供了不同的GC模式,如工作站模式和服务器模式,适用于不同的应用场景。
  2. 监控GC活动:使用性能分析工具监控GC活动,以识别和解决性能瓶颈。
  3. 优化对象生命周期:合理设计对象的生命周期,减少不必要的内存分配和提前释放不再使用的对象。

5、多线程的使用

1. Thread类

System.Threading.Thread 类是最基础的多线程机制,允许你创建一个新线程来执行一个方法。

Thread thread = new Thread(new ThreadStart(MyMethod));
thread.Start();
  • ThreadStart 是一个委托,指向要执行的方法。
  • Start 方法启动线程。

2. 参数化线程

你可以将参数传递给线程执行的方法。

Thread thread = new Thread(new ParameterizedThreadStart(MyMethodWithParams));
thread.Start("parameter");
  • ParameterizedThreadStart 是一个带有对象参数的委托。

3. 线程池

线程池(ThreadPool)是.NET提供的一种资源管理机制,用于避免线程的频繁创建和销毁,提高效率。

ThreadPool.QueueUserWorkItem(new WaitCallback(MyMethod));
  • QueueUserWorkItem 方法将任务添加到线程池中,线程池会分配线程来执行这些任务。

4. Task并行库(TPL)

System.Threading.Tasks.Task 提供了一种更现代的异步编程模型,它比传统的线程更容易使用和控制。

Task task = Task.Run(() => MyMethod());
task.Wait(); // 等待任务完成
  • Task.Run 创建并启动一个新任务。
  • Wait 方法等待任务完成。

5. async和await

C# 5.0引入了asyncawait关键字,使得异步编程更加简洁和易于管理。

public async Task MyAsyncMethod()
{await Task.Run(() => MyMethod());
}
  • async 关键字声明了一个异步方法。
  • await 关键字暂停方法的执行,直到等待的任务完成。

6. 同步原语

.NET提供了多种同步原语来控制线程间的协调,包括:

  • Mutex:互斥锁,确保多个线程不会同时访问共享资源。
  • Monitor:提供进入和退出同步代码块的能力。
  • Semaphore:信号量,控制对特定资源的并发访问数量。
  • AutoResetEvent 和 ManualResetEvent:事件等待句柄,用于线程间的信号传递。

7. 线程安全

多线程编程中,确保数据的线程安全是非常重要的。这可以通过锁定(Lock)、原子操作、不可变对象等方式实现。

8. 死锁和资源管理

多线程编程中需要避免死锁,并且合理管理资源,确保线程可以正确地释放和获取资源。

9. 线程局部存储

ThreadLocal<T> 类允许每个线程存储自己的数据副本,这对于需要线程特定数据的情况非常有用。

6、前台线程和后台线程、线程的生命周期

前台线程(Foreground Thread)

  • 主线程:应用程序的启动线程总是一个前台线程。
  • 行为:前台线程会阻止进程退出,直到所有前台线程都执行完毕。
  • 使用场景:通常用于执行主要的应用程序逻辑,因为它们可以保持应用程序运行,直到所有任务完成。

后台线程(Background Thread)

  • 行为:后台线程不会阻止进程退出。当所有前台线程都结束时,即使有后台线程仍在运行,进程也会退出。
  • 使用场景:适合执行不需要阻止应用程序关闭的任务,如后台数据处理、日志记录等。

线程的生命周期

线程的生命周期包括以下几个阶段:

  1. 创建:通过 Thread 类或 Task 类创建线程。
  2. 启动:通过调用 Thread.Start() 或 Task.Start() 方法启动线程。
  3. 运行:线程开始执行其目标方法或 lambda 表达式。
  4. 阻塞:线程可能因为等待I/O操作、获取锁、调用 Thread.Sleep() 或其他原因而进入阻塞状态。
  5. 死亡:线程执行完毕或被强制终止。
  6. 结束:线程的执行结束,资源被清理。

将线程设置为前台或后台

  • 前台线程:默认情况下,通过 Thread 类创建的线程是前台线程。
  • 后台线程:可以通过 Thread.IsBackground 属性将线程设置为后台线程。
Thread thread = new Thread(new ThreadStart(MyMethod));
thread.IsBackground = true; // 设置为后台线程
thread.Start();

对于 Task 类,可以通过 TaskCreationOptions 参数创建后台任务:

Task task = Task.Run(() => MyMethod(), TaskCreationOptions_ATTACHED_TO_PARENT);

处理线程结束

  • JoinThread.Join() 方法可以等待线程结束。
  • WaitTask.Wait() 方法可以等待任务完成。
  • Cancellation:可以使用 CancellationToken 来取消线程或任务的执行。

线程异常处理

  • ThreadException:可以为线程的 ThreadException 事件添加一个事件处理程序来捕获线程中未处理的异常。
  • Task Exception Handling:可以使用 try-catch 块来捕获任务中的异常,或者使用 Task.ContinueWith 方法来处理异常。

7、线程锁

1. Monitor

Monitor 是.NET提供的一个同步原语,用于保护对共享资源的访问。它基于进入和退出方法的方式来实现锁定和解锁。

object lockObject = new object();public void ThreadSafeMethod()
{lock (lockObject){// 访问或修改共享资源}
}
  • lock 关键字自动调用 Monitor.Enter 和 Monitor.Exit,确保即使在发生异常时也能释放锁。

2. Mutex

Mutex(互斥锁)是一种跨进程的同步原语,但也可以在同一个进程的不同线程之间使用。

Mutex mutex = new Mutex();public void ThreadSafeMethod()
{mutex.WaitOne(); // 请求锁try{// 访问或修改共享资源}finally{mutex.ReleaseMutex(); // 释放锁}
}

3. Semaphore

Semaphore(信号量)用于控制对特定资源的并发访问数量。

Semaphore semaphore = new Semaphore(1, 1); // 初始化为1,最大为1public void ThreadSafeMethod()
{semaphore.WaitOne(); // 请求信号量try{// 访问或修改共享资源}finally{semaphore.Release(); // 释放信号量}
}

4. ReaderWriterLockSlim

ReaderWriterLockSlim 提供了对读者-写者锁的更细粒度控制,允许多个读者同时读取,但写入时需要独占访问。

ReaderWriterLockSlim rwLock = new ReaderWriterLockSlim();public void ReadData()
{rwLock.EnterReadLock();try{// 读取数据}finally{rwLock.ExitReadLock();}
}public void WriteData()
{rwLock.EnterWriteLock();try{// 写入数据}finally{rwLock.ExitWriteLock();}
}

5. SpinLock

SpinLock 是一种轻量级的锁,适用于持有锁的时间短且竞争不激烈的情况。

public void ThreadSafeMethod()
{bool lockTaken = false;try{SpinLock.Enter(spinLock, ref lockTaken);// 访问或修改共享资源}finally{if (lockTaken) SpinLock.Exit(spinLock);}
}

6. Interlocked

Interlocked 类提供了一系列静态方法,用于执行原子操作,如递增、递减、交换和比较交换。

int sharedValue = 0;public void IncrementValue()
{Interlocked.Increment(ref sharedValue);
}

注意事项

  • 避免死锁:确保在所有情况下都能释放锁,避免嵌套锁顺序不一致。
  • 避免活锁:确保线程在等待锁时能够响应外部条件变化。
  • 避免资源竞争:尽量减少锁的持有时间,只在必要时锁定共享资源。

8、事件和委托的区别

委托(Delegate)

委托是一种类型,它定义了方法的类型。委托可以指向一个方法或多个方法(通过 multicast delegate 支持)。委托类似于C或C++中的函数指针,但它们是类型安全的,并且可以引用实例方法和静态方法。

  • 类型安全:委托是类型安全的,编译器会检查委托是否指向了正确签名的方法。
  • 多播:委托支持多播,即一个委托可以附加多个方法,当委托被调用时,这些方法会按顺序执行。
  • 灵活性:委托可以被动态地附加和移除方法。
public delegate int Operation(int x, int y); // 定义一个委托类型
public static int Add(int x, int y) { return x + y; }
public static int Multiply(int x, int y) { return x * y; }Operation op = Add; // 委托实例可以指向一个方法
op += Multiply; // 委托可以附加另一个方法
int result = op(5, 3); // 调用委托,Add 和 Multiply 都会被执行

事件(Event)

事件是一种特殊的多播委托,用于发布-订阅模式。事件是类成员,它们提供了一种机制,允许对象通知其他对象发生了某个动作或到达了某个状态。

  • 封装:事件是类的成员,提供了封装,使得类可以控制对事件的访问。
  • 订阅和取消订阅:客户端代码可以订阅(监听)或取消订阅(停止监听)事件。
  • 线程安全:事件的订阅和取消订阅通常是线程安全的。
  • 触发:事件有一个特殊的语法 event 关键字,用于声明事件,并且有一个 raise 操作符 ?. 用于触发事件。
public class Calculator
{public delegate int Operation(int x, int y);public event Operation CalculateEvent;public void PerformOperation(int x, int y){CalculateEvent?.Invoke(x, y); // 触发事件}
}// 客户端代码
Calculator calc = new Calculator();
calc.CalculateEvent += (sender, e) => Console.WriteLine("Result: " + e(5, 3));
calc.PerformOperation(5, 3);

主要区别

  • 用途:委托是一种通用的类型,可以用于任何需要引用方法的场景。事件是一种特殊的委托,专门用于实现发布-订阅模式。
  • 控制:事件提供了额外的封装,允许类控制对事件的访问和触发。委托则没有这种控制。
  • 触发:事件使用 ?. 操作符触发,这是一种安全的方式,可以避免在没有订阅者时引发异常。委托则直接调用。
  • 订阅:事件提供了订阅和取消订阅的机制,而委托则需要手动附加和移除方法。

9、冒泡事件和隧道事件

冒泡事件(Bubbling Events)

冒泡事件是指事件从最具体的事件源开始,然后逐级向上传播到较为一般的事件源。在用户界面中,这意味着事件从最底层的控件开始,然后冒泡到父控件,一直到达根控件或被处理为止。

  • 特点
    • 事件从目标控件开始,向上冒泡到父控件。
    • 可以在冒泡过程中的任何级别捕获和处理事件。
    • 如果在较低级别(子控件)处理了事件,较高级别(父控件)仍然会接收到事件。
    • 冒泡事件的典型用途是处理用户界面中的鼠标和键盘事件。

隧道事件(Tunneling Events)

隧道事件是指事件从最一般的事件源开始,然后逐级向下传播到较为具体的事件源。在用户界面中,这意味着事件从根控件开始,然后逐级向下传播到目标控件。

  • 特点
    • 事件从根控件开始,向下隧道到目标控件。
    • 可以在隧道过程中的任何级别捕获和处理事件。
    • 如果在较高级别(父控件)处理了事件,较低级别(子控件)仍然会接收到事件。
    • 隧道事件的典型用途是处理需要在事件到达目标控件之前进行干预的情况,例如自定义的输入验证。

事件处理

在.NET中,冒泡和隧道事件都可以通过事件处理程序来处理。对于冒泡事件,通常会使用事件名称(例如Click),而对于隧道事件,通常会使用以Preview前缀开头的事件名称(例如PreviewMouseDown)。

示例

在WPF中,你可以这样处理冒泡和隧道事件:

// 冒泡事件处理程序
private void Button_Click(object sender, RoutedEventArgs e)
{// 处理点击事件
}// 隧道事件处理程序
private void PreviewMouseDown(object sender, MouseButtonEventArgs e)
{// 在事件到达目标控件之前进行处理
}

10、逻辑树和可视化树

逻辑树(Logical Tree)

逻辑树,也称为逻辑结构,是一种抽象的树状结构,它表示控件之间的逻辑关系,包括控件的父子关系、兄弟关系等。这种关系通常是由控件的创建和布局逻辑决定的。

  • 特点
    • 逻辑树包括了所有的控件,无论它们是否可见。
    • 它反映了控件的创建顺序和它们之间的逻辑关系。
    • 在逻辑树中,每个控件都有一个父控件,除了根控件。
    • 逻辑树不关心控件的实际显示位置和布局。

可视化树(Visual Tree)

可视化树是一种具体的树状结构,它表示控件在用户界面上的渲染层次结构。它只包括那些实际参与渲染的控件,即那些可见的控件。

  • 特点
    • 可视化树仅包括那些可见的控件。
    • 它反映了控件在屏幕上的实际布局和渲染顺序。
    • 可视化树中的控件会根据布局逻辑进行排列。
    • 可视化树可以包含透明控件,这些控件不可见,但会影响布局。

区别

  • 包含范围:逻辑树包含所有控件,而可视化树只包含可见控件。
  • 更新频率:逻辑树在控件树结构变化时更新,而可视化树在控件的布局和渲染变化时更新。
  • 父子关系:逻辑树的父子关系是由控件的创建逻辑决定的,而可视化树的父子关系是由控件的布局和渲染逻辑决定的。

示例

在WPF中,你可以使用以下方法来遍历逻辑树和可视化树:

// 遍历逻辑树
for (int i = 0; i < myControl.Items.Count; i++)
{var item = myControl.Items[i];// 处理每个项
}// 遍历可视化树
var descendants = VisualTreeHelper.GetDescendants(myControl);
foreach (var descendant in descendants)
{// 处理每个后代
}

11、MVVM框架的用法和理解

基本结构

  1. Model(模型):代表业务逻辑和数据。它包含了应用程序中用于处理的核心数据对象,通常包含业务规则、数据访问和存储逻辑。

  2. View(视图):用户看到和与之交互的界面。在WPF中,视图通常由XAML定义,包含各种用户界面元素,如按钮、文本框、列表等。

  3. ViewModel(视图模型):视图的抽象,包含视图所需的所有数据和命令。ViewModel通过实现INotifyPropertyChanged接口和使用ICommand对象,将视图的状态和行为抽象化,实现视图和模型的解耦。

用法

  • 数据绑定:ViewModel中的数据属性会与View中的元素进行绑定,当ViewModel中的数据变化时,View会自动更新,反之亦然。
  • 命令绑定:ViewModel中可以定义命令(如ICommand),这些命令可以被View中的控件(如按钮)绑定,从而响应用户操作。
  • 解耦:MVVM模式将视图和业务逻辑分离,使得视图和业务逻辑之间的依赖性降低,提高了代码的可维护性和可测试性。

理解

  • 低耦合:MVVM通过ViewModel层将View和Model解耦,使得Model可以独立于View变化,View也可以独立于Model变化。
  • 可重用性:由于View和Model的解耦,相同的Model可以被不同的View重用,提高了代码的重用性。
  • 可测试性:业务逻辑被封装在Model中,可以独立于View进行单元测试,提高了代码的可测试性。

实践

在实际开发中,通常会创建对应的Model、View和ViewModel文件。例如,对于一个用户信息的编辑功能,可能会有一个UserModel类来表示用户数据,一个XAML文件来定义用户界面,以及一个UserViewModel类来处理用户界面的逻辑和数据绑定。

12、prism框架相对MVVM框架优势

1. 模块化设计

Prism框架支持模块化设计,使得应用程序可以被分解为多个独立的模块。这些模块可以独立开发、测试和部署,从而提高了应用程序的可维护性和可扩展性。这种模块化思想有助于降低耦合度,增强代码的重用性和灵活性。

2. 依赖注入

Prism内置了对依赖注入的支持,这使得组件之间的依赖关系更加清晰和可管理。通过依赖注入,开发者可以轻松地替换或集成不同的实现,从而提高了代码的可测试性和灵活性。

3. 事件聚合器

Prism提供了事件聚合器(EventAggregator),允许不同模块之间进行松散耦合的通信。这种机制使得模块可以在不直接引用彼此的情况下进行交互,进一步降低了模块之间的依赖性。

4. 命令和数据绑定

Prism增强了MVVM模式中的命令和数据绑定机制,提供了更强大的功能来处理用户输入和界面更新。这使得开发者可以更方便地实现复杂的用户交互。

5. 支持多平台

Prism不仅支持WPF,还支持Xamarin.Forms、UWP等多种平台,使得开发者可以在不同的环境中使用相同的设计模式和架构,促进了代码的重用。

6. 社区和文档支持

Prism拥有一个活跃的社区和丰富的文档资源,开发者可以更容易地找到解决方案和最佳实践。这种支持对于新手和经验丰富的开发者都非常重要。

7. 适合复杂应用

对于大型和复杂的应用程序,Prism提供了更全面的解决方案,能够处理复杂的业务逻辑和用户界面需求。相比之下,MVVM模式本身更为基础,可能在处理复杂应用时显得不足。

13、日常当中用到的设计模式

1. 单例模式(Singleton)

确保一个类只有一个实例,并提供一个全局访问点。

用途:配置管理器、线程池、缓存等。

2. 工厂模式(Factory Method)

定义一个创建对象的接口,但让子类决定实例化哪一个类。

用途:创建日志记录器、数据库连接、图形用户界面组件等。

3. 抽象工厂模式(Abstract Factory)

提供一个创建一系列相关或相互依赖对象的接口,而不需要指定它们具体的类。

用途:GUI工具包、创建一系列相关配置对象等。

4. 建造者模式(Builder)

分离复杂对象的构建和表示,以便相同构建过程可以创建不同的表示。

用途:构建复杂对象,如SQL查询构建器、XML文档构建器等。

5. 原型模式(Prototype)

通过拷贝现有实例创建新的实例,而不是通过新建。

用途:需要快速复制对象的场景,如配置信息复制、对象克隆等。

6. 适配器模式(Adapter)

允许不兼容接口之间的相互协作。

用途:系统集成、第三方库的接口适配等。

7. 装饰器模式(Decorator)

动态地给一个对象添加一些额外的职责。

用途:增加功能,如日志装饰器、缓存装饰器等。

8. 门面模式(Facade)

为子系统中的一组接口提供一个统一的高层接口。

用途:简化复杂系统的接口,如文件系统操作、网络通信接口等。

9. 代理模式(Proxy)

为其他对象提供一个代理以控制对这个对象的访问。

用途:访问控制、延迟初始化、远程代理等。

10. 观察者模式(Observer)

对象间的一种一对多的依赖关系,当一个对象改变状态时,所有依赖于它的对象都会得到通知并自动更新。

用途:事件处理系统、状态监控、UI更新等。

11. 策略模式(Strategy)

定义一系列算法,把它们一个个封装起来,并使它们可以相互替换。

用途:支付策略、排序算法、搜索策略等。

12. 命令模式(Command)

将请求封装为一个对象,从而使用户可以使用不同的请求、队列或日志请求。

用途:事务系统、命令历史、宏命令等。

13. 状态模式(State)

允许一个对象在其内部状态改变时改变它的行为。

用途:工作流管理、游戏状态管理等。

14. 责任链模式(Chain of Responsibility)

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。

用途:审批流程、错误处理、日志处理等。

15. 模板方法模式(Template Method)

在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中实现。

用途:框架开发、算法骨架实现等。

14、for和foreach理解和看法

for 循环

for 循环是一种通用的循环结构,适用于需要精确控制循环次数、迭代顺序以及循环变量的场景。

特点

  • 灵活性:可以自定义循环变量的初始值、终止条件和增量。
  • 控制:可以精确控制循环的执行流程,包括在循环体内部修改循环变量。
  • 适用性:适用于需要复杂控制逻辑的循环,如特定的起始和结束条件,以及需要在循环中跳转的情况。

用途

  • 需要根据条件控制循环次数。
  • 需要在循环中修改循环变量。
  • 需要反向迭代或不规则步长。

foreach 循环

foreach 循环是一种专门用于遍历集合(如数组、列表)的循环结构,它隐藏了迭代的具体细节,使得代码更加简洁和易读。

特点

  • 简洁性:代码简洁,不需要显式定义循环变量和迭代逻辑。
  • 易读性:直接表达出遍历集合的意图,提高了代码的可读性。
  • 限制:不能在循环中修改集合的大小,也不能在循环中跳过迭代或改变迭代顺序。

用途

  • 遍历数组、列表或其他集合。
  • 需要对集合中的每个元素执行相同操作。

看法

  • 性能:在大多数情况下,for 和 foreach 的性能差异不大,但foreach 在某些情况下可能会稍微慢一些,因为它通常涉及到更多的封装和间接调用。
  • 可读性foreach 循环通常更易于阅读和理解,尤其是在处理集合时,它直接表达了程序员的意图。
  • 安全性foreach 循环在遍历集合时更安全,因为它避免了对索引的直接操作,减少了越界访问的风险。
  • 适用场景for 循环适用于需要精确控制循环行为的场景,而 foreach 循环适用于简单的集合遍历。

15、优化几百万条数据插入数据库

  1. 批量插入操作:相比于单条插入,批量插入可以显著减少网络往返次数和SQL解析开销,提高数据插入速度。

  2. 调整事务大小:合理调整事务的大小,避免过大的事务占用大量内存和锁资源,影响性能。

  3. 禁用自动提交:在插入操作期间,禁用自动提交可以减少磁盘I/O操作,因为每次提交都要写入事务日志。通过手动管理事务,可以在执行大量插入后一次性提交,提高效率。

  4. 优化索引策略:在插入操作前,评估是否所有索引都是必要的。考虑在数据插入完成后再创建索引,特别是对于大批量的数据导入操作,因为索引会减慢插入速度。

  5. 使用LOAD DATA INFILE语句:对于极大量的数据插入,LOAD DATA INFILE是一个高效的选择。这个命令直接将文件内容批量插入到数据库表中,比使用大量的INSERT语句要快得多。

  6. 配置InnoDB缓冲池大小:对于使用InnoDB存储引擎的表,合理配置InnoDB缓冲池的大小是提高插入性能的关键。缓冲池越大,可以缓存的数据和索引越多,这可以显著减少磁盘I/O操作。

  7. 使用分区表:对于极大的数据集,使用分区表可以提高查询和插入的性能。通过将表数据分散到不同的分区,可以减少单个查询或插入操作需要处理的数据量。

  8. 关闭或调整二进制日志和复制:如果不需要复制或者恢复操作的话,可以考虑关闭二进制日志,以提高插入性能。如果需要复制,考虑使用异步复制或延迟复制策略,以减少对插入性能的影响。

  9. 调整服务器配置:根据具体的服务器硬件配置调整MySQL的配置文件,例如,调整max_allowed_packetinnodb_log_file_sizeinnodb_write_io_threads等参数,可以显著提高插入性能。

  10. 禁用键和锁定表:在插入大量数据前,可以锁定表并禁用键,插入完成后再启用键和解锁表。这可以减少在插入过程中对索引的维护,从而提高插入速度。

  11. 删除表上所有的索引:在插入大量数据前,删除表上的所有索引,插入完成后再重新创建索引。这可以减少索引维护的开销,提高插入速度。

  12. 多线程插入:通过多线程并发插入数据,可以显著提高插入效率。但需要注意线程同步和资源争用问题。

16、提高某个字段查询效率

  1. 索引优化

    • 为经常用于查询条件的列创建索引,可以显著提高查询速度。
    • 避免过度索引,过多的索引会增加数据插入、删除和更新的成本。
    • 使用复合索引,当查询条件涉及多列时,创建复合索引可以提高查询效率。
    • 定期分析和优化索引,随着数据的增长,原有索引可能不再最优。
    • 使用覆盖索引,确保索引包含查询所需的所有列,减少回表查询。
  2. 查询语句优化

    • 避免使用SELECT *,仅选择需要的字段,减少数据传输量,提高查询效率。
    • 优化WHERE子句,使用等号(=)来比较字段,避免使用不等号(<>、!=)和LIKE操作符(特别是以通配符%开头的LIKE)。
    • 使用LIMIT限制结果集,当只需要查询结果集的一部分时,使用LIMIT子句可以限制返回的行数。
  3. 数据库设计优化

    • 使用合适的字段数据类型,选择适当的数据类型可以减小存储空间,提高查询速度。
  4. 硬件与配置优化

    • 优化数据库服务器的硬件配置,如增加内存、使用更快的存储设备等。
  5. 使用缓存

    • 在应用层面缓存查询结果,以减少数据库的访问次数。
  6. 监控与调优

    • 定期检查和维护索引,确保它们仍然有效和高效。
    • 分析查询计划,确保查询条件和排序字段使用了索引。

17、多表查询

内连接(INNER JOIN)

内连接查询返回两个表中匹配的记录。

SELECT columns
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;

2. 左连接(LEFT JOIN 或 LEFT OUTER JOIN)

左连接查询返回左表(第一个表)的所有记录,即使右表(第二个表)中没有匹配的记录。

SELECT columns
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;

3. 右连接(RIGHT JOIN 或 RIGHT OUTER JOIN)

右连接查询返回右表(第二个表)的所有记录,即使左表(第一个表)中没有匹配的记录。

SELECT columns
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;

4. 全连接(FULL JOIN 或 FULL OUTER JOIN)

全连接查询返回两个表中的所有记录,如果某一边没有匹配的记录,则该边的结果将为NULL。

SELECT columns
FROM table1
FULL OUTER JOIN table2
ON table1.column_name = table2.column_name;

5. 交叉连接(CROSS JOIN)

交叉连接返回两个表的所有可能组合的记录,结果集是两个表记录数的乘积。

SELECT columns
FROM table1
CROSS JOIN table2;

6. 自连接(SELF JOIN)

自连接是指同一个表与自己进行连接,通常用于查询表中的相关数据。

SELECT columns
FROM table1 AS a
JOIN table1 AS b
ON a.column_name = b.column_name;

优化多表查询

  • 使用索引:确保连接条件的字段上有索引,可以显著提高查询效率。
  • 选择适当的连接类型:根据需要选择最合适的连接类型,以避免不必要的数据组合。
  • 限制结果集:只选择需要的列,避免使用SELECT *,减少数据传输量。
  • 使用子查询:在某些情况下,使用子查询可以减少连接操作的复杂性。
  • 分析查询计划:使用EXPLAIN等工具分析查询计划,找出性能瓶颈。

注意事项

  • 避免笛卡尔积:在没有指定连接条件的情况下,交叉连接会产生笛卡尔积,这可能导致性能问题。
  • 考虑数据量:在涉及大量数据的表进行连接时,需要特别关注查询性能和资源消耗

18、WPF布局控件

WPF(Windows Presentation Foundation)提供了一系列的布局控件,用于在用户界面中组织和排列元素。以下是一些常用的WPF布局控件:

1. Grid(网格)

Grid控件允许你将界面分割成行和列,类似于表格,可以在特定的单元格中放置控件。

<Grid><Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="*"/></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="100"/><ColumnDefinition Width="*"/></Grid.ColumnDefinitions><!-- 在这里放置控件,并指定行和列 -->
</Grid>

2. StackPanel(堆栈面板)

StackPanel控件将控件垂直(默认)或水平排列成一维集合。

<StackPanel Orientation="Horizontal"><!-- 控件将水平排列 -->
</StackPanel>

3. WrapPanel(包装面板)

WrapPanel控件将控件依次放置在水平或垂直线上,当空间不足时,控件会自动换行或换列。

<WrapPanel><!-- 控件将根据空间自动换行 -->
</WrapPanel>

4. DockPanel(停靠面板)

DockPanel控件允许你将控件停靠在四个方向:上、下、左、右。

<DockPanel><DockPanel.Dock><Dock>Top</Dock></DockPanel.Dock><!-- 控件将停靠在指定方向 -->
</DockPanel>

5. UniformGrid(均匀网格)

UniformGrid控件将控件均匀地排列在网格中,每个单元格的大小相同。

<UniformGrid Rows="2" Columns="2"><!-- 控件将均匀分布在2x2的网格中 -->
</UniformGrid>

6. Canvas(画布)

Canvas控件提供了一个绝对定位的绘图表面,你可以精确控制每个控件的位置。

<Canvas><Canvas.Left><Canvas.Top><!-- 控件将根据Left和Top属性定位 --></Canvas>
</Canvas>

7. ScrollViewer(滚动视图)

ScrollViewer控件允许用户滚动查看超出可视区域的内容。

<ScrollViewer><!-- 超出可视区域的内容可以滚动查看 -->
</ScrollViewer>

8. Viewbox(视图框)

Viewbox控件可以自动缩放内部的单个子元素以填充可用空间。

<Viewbox><!-- 子元素将自动缩放以填充可用空间 -->
</Viewbox>

9. Border(边框)

Border控件可以给内部的控件添加边框、背景等。

<Border BorderBrush="Black" BorderThickness="1"><!-- 内部控件将被边框包围 -->
</Border>

布局注意事项

  • 布局选择:根据需要展示的内容和布局需求选择合适的布局控件。
  • 控件尺寸:合理设置控件的尺寸,使用Auto*Absolute等单位。
  • 响应式设计:使用布局控件创建响应式界面,以适应不同屏幕尺寸和分辨率。
  • 性能:避免过度嵌套布局控件,以减少布局计算的复杂度和提高性能。

19.空间模板的使用

ControlTemplate 的基本结构

ControlTemplate 允许你定义一个控件的视觉树,你可以使用它来改变控件的默认外观。以下是一个按钮的ControlTemplate示例:

<ControlTemplate x:Key="RoundButtonTemplate" TargetType="Button"><Border x:Name="border"Background="{TemplateBinding Background}"BorderBrush="{TemplateBinding BorderBrush}"BorderThickness="{TemplateBinding BorderThickness}"CornerRadius="20"Padding="10"><ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/></Border><ControlTemplate.Triggers><Trigger Property="IsMouseOver" Value="True"><Setter TargetName="border" Property="Background" Value="LightGreen"/></Trigger><Trigger Property="IsPressed" Value="True"><Setter TargetName="border" Property="Background" Value="LightCoral"/></Trigger></ControlTemplate.Triggers>
</ControlTemplate>

在这个例子中,按钮的背景颜色会在鼠标悬停和按下时改变。

定义主题风格的控件模板

你可以定义应用程序范围内的主题风格,使得所有特定类型的控件都使用同一个模板:

<Window.Resources><Style TargetType="Button"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="Button"><Border Background="{TemplateBinding Background}"CornerRadius="10"Padding="10"><ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/></Border></ControlTemplate></Setter.Value></Setter><Setter Property="Background" Value="LightBlue"/><Setter Property="Foreground" Value="White"/></Style>
</Window.Resources>

这将应用到所有Button控件,使它们具有一致的样式。

数据模板(DataTemplate)

数据模板用于自定义数据绑定控件(如ListBoxListViewComboBox等)的显示格式。

项目模板(ItemsPanelTemplate)

项目模板允许你自定义数据控件(如ListBoxListView等)的项目布局方式。例如,你可以使用ItemsPanelTemplateListBox的默认垂直堆叠布局更改为水平排列:

<ListBox.ItemsPanel><ItemsPanelTemplate><StackPanel Orientation="Horizontal"/></ItemsPanelTemplate>
</ListBox.ItemsPanel>

模板绑定(TemplateBinding)与数据绑定

在模板中,你可以使用TemplateBinding绑定到控件的属性,也可以使用Binding绑定到数据上下文:

<ControlTemplate TargetType="Button"><Border Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}"><ContentPresenter Content="{Binding Content, RelativeSource={RelativeSource TemplatedParent}}"HorizontalAlignment="Center"VerticalAlignment="Center"/></Border>
</ControlTemplate>

在这个例子中,TemplateBinding Background绑定到ButtonBackground属性,而Binding Content绑定到控件的数据上下文,即ButtonContent属性。

自定义控件与模板

在创建自定义控件时,你可以定义默认的控件模板:

public class CustomButton : Button
{static CustomButton(){DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomButton), new FrameworkPropertyMetadata(typeof(CustomButton)));}
}

在XAML中定义默认的控件模板:

<Style TargetType="{x:Type local:CustomButton}"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type local:CustomButton}"><Border Background="{TemplateBinding Background}" CornerRadius="10"><ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/></Border></ControlTemplate></Setter.Value></Setter>
</Style>

20.触发器的使用场景

 属性触发器(Property Triggers)

  • 场景:当UI元素的某个属性达到特定值时,属性触发器会被触发。例如,当鼠标悬停在按钮上时,可以改变按钮的背景颜色。
  • 应用:可以用来实现交互效果,如鼠标悬停、获取焦点等状态变化时的视觉反馈。

2. 数据触发器(Data Triggers)

  • 场景:当绑定的数据满足某个条件时,数据触发器会被触发。例如,根据绑定的数据值改变控件的颜色或可见性。
  • 应用:常用于根据数据内容动态调整界面表现,如根据数据的有效性显示不同的颜色或图标。

3. 事件触发器(Event Triggers)

  • 场景:当某个事件被触发时,事件触发器执行相应的操作。例如,当按钮被点击时启动一个动画。
  • 应用:用于响应特定的用户操作或系统事件,执行动画或其他逻辑。

4. 多条件触发器(MultiTriggers 和 MultiDataTriggers)

  • 场景:当多个条件同时满足时触发样式更改。例如,当鼠标悬停在按钮上且按钮处于可用状态时,改变按钮的背景颜色。
  • 应用:适用于需要多个条件同时满足才能触发某种效果的场景,增加了触发器的灵活性和控制力。

5. 动态界面响应

  • 场景:触发器可以用于根据应用程序的状态动态改变界面元素的样式和行为,如根据用户的角色或权限显示或隐藏界面元素。
  • 应用:提高用户体验,使界面更加直观和响应用户的操作和应用状态变化。

相关文章:

C#中面试的常见问题001

1、c#访问修饰符有哪些 public&#xff1a;公共访问级别&#xff0c;成员可以被任何其他代码访问。private&#xff1a;私有访问级别&#xff0c;成员只能在定义它的类内部访问。protected&#xff1a;受保护的访问级别&#xff0c;成员可以被定义它的类及其子类访问。interna…...

webGis 气象站点数据解析渲染

1.站点数据说明 1.1 数据来源 站点数据来源多样。 1.2数据传输 实现前端的展示&#xff0c;数据传输的方式有&#xff1a; json等等 1.2数据格式 let arr [{ lat:1,//经纬度 lng:1, value:2//值 },{},...] 1.3站点数据转格点数据 turf.interpolate克里金插值qgis等ID…...

Vue3+Typescript+Axios+.NetCore实现导出Excel文件功能

前端代码 //导出Excel const exportMaintenanceOrderSettlementItemExcelClick async () > {let url ${VITE_APP_API_URL}/api/app/maintenance/settlement-service-item/${currentMaintenanceOrderId.value}/${currentMaintenanceOrderSettlementRow.value.id};let file…...

专属主机服务器和ECS服务器有什么区别?

‌专属主机服务器和ECS服务器的主要区别在于资源隔离、计费方式、管理权限等方面。‌ 资源隔离 ‌专属主机服务器‌&#xff1a;用户可以独享整台物理服务器资源&#xff0c;与其他租户的服务器物理隔离。这意味着用户不需要与其他租户共享物理资源&#xff0c;可以获取服务器…...

MySQL索引与分区:性能优化的关键

在开发过程中&#xff0c;随着数据量的不断增长&#xff0c;MySQL 查询的性能问题会逐渐显现。特别是在大数据量下&#xff0c;查询变得越来越慢&#xff0c;甚至可能导致系统崩溃。为了优化查询&#xff0c;MySQL 提供了 分区&#xff08;Partitioning&#xff09; 和 索引&am…...

VUE项目部署服务器之后刷新页面异常

情况&#xff1a; vue项目在本地完美运行&#xff0c;经过npm run build之后把dist目录上传到服务后。只有访问文件跟目录可以运行&#xff0c;但刷新之后会找不到相应的页面。 网上都说是hository路由的问题导致&#xff0c;需要修改成hash模式。如果不想修改为hash模式&…...

【实验13】使用预训练ResNet18进行CIFAR10分类

目录 1 数据处理 1.1 数据集介绍 1.2数据处理与划分 2 模型构建- Pytorch高层API中的Resnet18 3 模型训练 4 模型评价 5 比较“使用预训练模型”和“不使用预训练模型”的效果&#xff1a; 6 模型预测 7 完整代码 8 参考链接 1 数据处理 1.1 数据集介绍 数据规模&…...

如何将 GitHub 私有仓库(private)转换为公共仓库(public)

文章目录 如何将 GitHub 私有仓库转换为公共仓库步骤 1: 登录 GitHub步骤 2: 导航到目标仓库步骤 3: 访问仓库设置步骤 4: 更改仓库可见性步骤 5: 确认更改步骤 6: 验证更改注意事项 如何将 GitHub 私有仓库转换为公共仓库 在软件开发领域&#xff0c;GitHub 是一个广受欢迎的…...

进制的问题

蓝桥2015某题 计算数字x在进制p 下的各位数字之和 ​ int calc(int x,int p) {int res0;while(x){resx%p;//取当前位累加x/p;//去掉最低位}return res; }​...

【配置】如何下载和配置Android studio?

下载Android Studio 1、下载链接 https://developer.android.google.cn/studio?hlzh-cn​​​​​​​​​​​​​​​​​​​​ 注意&#xff1a;下载的时候要关闭代理服务器 2、安装软件 根据提示进行安装 3、配置proxy 这里建议配置代理而不是配置国内镜像源 所以…...

CA系统(file.h---申请认证的处理)

#pragma once #ifndef FILEMANAGER_H #define FILEMANAGER_H #include <string> namespace F_ile {// 读取文件&#xff0c;返回文件内容bool readFilename(const std::string& filePath);bool readFilePubilcpath(const std::string& filePath);bool getNameFro…...

Redis开发04:Redis的INFO信息解析

命令解释redis_versionRedis 的版本号&#xff0c;这里是 3.2.100。redis_git_sha1Redis 使用的 Git SHA1 校验值&#xff0c;表示当前代码的版本。redis_git_dirty如果 Redis 当前运行的代码是脏版本&#xff08;未提交的修改&#xff09;&#xff0c;该值为 1&#xff0c;否则…...

《Learn Three.js》学习(2)构建Three.js基本组件

前言&#xff1a; 本章将了解内容包括Three中的主要组件&#xff1b;THERE.SCENE对象的作用&#xff1b;几何图形和格网如何关联&#xff1b;区别正射/透视投影摄像机 基础理论知识&#xff1a; Three.scene&#xff08;场景图&#xff09;保存所有对象、光源和渲染所需的其他…...

VLLM 格式化LLM输出

文章目录 前言guided_jsonguided_choiceguided_regexguided_grammar总结 前言 vllm OpenAI Compatible Server 提供了格式化LLM输出的能力&#xff0c;默认的格式化解码后端应该是outlines 目前提供了四个参数来控制格式化输出&#xff0c;分别是&#xff1a; guided_json: …...

Java篇——Java通过JNA调用c++库时传参含有结构体时数据错乱的解决办法

Java通过JNA调用c库时传参含有结构体时&#xff0c;只继承Structure是不够的&#xff0c;还需要实现Structure.ByValue&#xff0c;或者强制指定结构体字节对齐。示例如下&#xff1a; 1、c库中的结构体定义&#xff1a; 2、java中结构体定义&#xff1a; 3、java中调用 如果没…...

sql分类

SQL&#xff08;Structured Query Language&#xff09;是一种用于管理和操作关系数据库管理系统&#xff08;RDBMS&#xff09;的编程语言。SQL 可以分为几个主要类别&#xff0c;每个类别都有其特定的用途和功能。以下是 SQL 的主要分类&#xff1a; 1. 数据定义语言&#x…...

LayaBox1.8.4实现战争迷雾效果

实现思路&#xff1a; 和Unity实现思路一样&#xff0c;可看我写的下面的一篇文章 战争迷雾FogOfWar---Unity中实现-CSDN博客 根据碰撞点可以计算出需要透明的位置&#xff0c;怎样计算如下&#xff1a; 根据迷雾mesh的长宽和纵向横向的的像素数可以得出&#xff0c;每个小方…...

Python打包元数据困境:约束的重要性

在Python社区中&#xff0c;一项旨在建立新的通用锁文件标准的努力正在展开&#xff0c;这一努力主要在Python讨论论坛上进行。此倡议凸显了创建一个让所有人都满意的标准化方案的难度。不同Python打包工具对锁文件应有的形态和用途有着略微不同的理解。然而&#xff0c;在这些…...

第29天 MCU入门

目录 MCU介绍 MCU的组成与作用 电子产品项目开发流程 硬件开发流程 常用元器件初步了解 硬件原理图与PCB板 常见电源符号和名称 电阻 电阻的分类 贴片电阻的封装说明&#xff1a; 色环电阻的计算 贴片电阻阻值计算 上拉电阻与下拉电阻 电容 电容的读数 二极管 LED 灯电路 钳位作…...

三分钟快速掌握——Linux【vim】的使用及操作方法

一、vim的使用 vim是一个文本编辑器 非常小巧轻便 1.1如何进入vim编辑器 方法一&#xff1a; 首先使用touch 1.c 创建一个源文件 然后使用vim 1.c进入 方法二&#xff1a; 直接使用指令 vim 2.c 会直接创建一个2.c的源文件 退出时记得保存&#xff08;使用wq或者x&am…...

安达发|制造业APS智能优化排产软件的四类制造模型解决方案

在制造业中&#xff0c;APS&#xff08;高级计划和排程系统&#xff09;智能优化排产软件的应用越来越广泛。它通过集成先进的算法和模型&#xff0c;帮助企业提高生产效率、降低成本并提升客户满意度。针对不同类型的生产需求&#xff0c;APS软件提供了四类制造模型解决方案&a…...

屏幕分辨率|尺寸|颜色深度指纹修改

一、前端通过window.screen接口获取屏幕分辨率 尺寸 颜色深度&#xff0c;横屏竖屏信息。 二、window.screen c接口实现&#xff1a; 1、third_party\blink\renderer\core\frame\screen.idl // https://drafts.csswg.org/cssom-view/#the-screen-interface[ExposedWindow ] …...

Mac安装及合规无限使用Beyond Compare

文章目录 Beyond CompareBeyond Compare简介Beyond Compare安装Beyond Compare到期后继续免费使用 Beyond Compare Beyond Compare简介 Beyond Compare 是一款由 Scooter Software 开发的文件和文件夹比较工具。它主要用于对比两个文件或文件夹之间的差异&#xff0c;并支持文…...

记录一次 k8s 节点内存不足的排查过程

背景&#xff1a;前端服务一直报404&#xff0c;查看k8s日志&#xff0c;没发现报错&#xff0c;但是发现pods多次重启。 排查过程&#xff1a; 查看pods日志&#xff0c;发现日志进不去。 kubectrl logs -f -n weave pod-name --tail 100查看pod describe kubectl describ…...

方差分析、相关分析、回归分析

第一章&#xff1a;方差分析 1.1 方差分析概述 作用: 找出关键影响因素&#xff0c;并进行对比分析&#xff0c;选择最佳组合方案。影响因素: 控制因素&#xff08;人为可控&#xff09;和随机因素&#xff08;人为难控&#xff09;。控制变量的不同水平: 控制变量的不同取值…...

【JavaEE初阶 — 网络原理】初识网络原理

目录 1. 网络发展史 1.1 独立模式 1.2 网络互连 1.2.1 网络互联的背景 1.2.2 网络互联的定义 1.3 局域网LAN 1.4 广域网WAN 2. 网络通信基础 2.1 IP地址 2.2 端口号 2.3 认识协议 2.4 五元组 2.5 协议分层 2.5.1 分…...

算法的NPU终端移植:深入探讨与实践指南

目录 ​编辑 引言 算法选择 模型压缩 权重剪枝 量化 知识蒸馏 硬件适配 指令集适配 内存管理 并行计算 性能测试 速度测试 精度测试 功耗测试 案例分析 图像识别算法的NPU移植案例 结论 引言 在人工智能技术的浪潮中&#xff0c;神经网络处理器&#xff08;…...

Lombok :简化 Java 编程的得力工具

在 Java 开发过程中&#xff0c;常常需要编写大量的样板代码&#xff0c;例如构造函数、Getter 和 Setter 方法、equals 和 hashCode 方法等。这些代码虽然逻辑相对固定&#xff0c;但编写起来却较为繁琐且容易出错&#xff0c;并且会使代码显得冗长。Lombok 应运而生&#xff…...

C语言实例_14之求俩数的最大公约数和最小公倍数

1.最大公约数和最小公倍数概述 最大公约数&#xff08;Greatest Common Divisor&#xff0c;简称GCD&#xff09;&#xff1a; 也称为最大公因数&#xff0c;是指两个或多个整数共有约数中最大的一个。例如&#xff0c;对于整数12和18&#xff0c;它们的约数分别为&#xff1…...

wxWidgets-ImageView

wxWidgets实现图片浏览、放大缩小、另存为新的图片格式等 #include "wx/wxprec.h"#ifndef WX_PRECOMP#include "wx/wx.h" #endif#include "wx/filename.h" #include "wx/zstream.h"#include "imageviewctrl.h"class MyFrame…...

什么是Axios,有什么特点

什么是 Axios&#xff1f; Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;可以用于浏览器和 Node.js 环境。它由 Matt Zabriskie 创建&#xff0c;旨在提供一个简单、灵活且功能强大的 HTTP 请求库。Axios 支持所有现代浏览器和 Node.js&#xff0c;可以用于发送 GET、…...

springboot331“有光”摄影分享网站系统pf(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; “有光”摄影分享网站设计与实现 摘 要 自互联网的发展至今&#xff0c;其基础理论与技术都已完善&#xff0c;并积极参与了整个社会各个领域。它容许信息根据媒体传播&#xff0c;并和信息可视化工具一起为大家提供优质的服务。对于…...

3D姿势和跟踪的人体行为识别

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;编程探索专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年11月28日21点20分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文链接 点击开启你的论文编程之旅…...

手机设置了卡2上网,卡1禁止上网,但是卡1还是会偷偷跑流量,这是什么情况???

双卡双待手机&#xff0c;卡2设置为默认上网卡&#xff0c;卡1却会偷偷跑流量&#xff0c;这就很迷。 双卡双待手机&#xff0c;不管是哪个牌子&#xff08;网上有小米&#xff0c;华为&#xff0c;vivo出现这种情况&#xff0c;我的是华为mate20&#xff09;&#xff0c;都存在…...

基于单片机的温度控制系统设计

摘 要 当今社会不断发展&#xff0c;工业以及生活领域对温度控制系统的要求日益增加。以往的设计系统已经不能满足如今的社会需求&#xff0c;因此设计更加符合要求的温度控制系统是大势所趋。采用单片机进行温度控制系统的设计可以使温度的调节更简单、灵活&#xff0c;节约操…...

pjfun.top相册中上传图片获取github apiToken

1、登录github [登录](https://github.com/login) 没有账号就注册2、 点击头像&#xff0c;进入设置settings 3、进入Developer settings 4、点击Fine-grained tokens 再点击 Generate new token 5、填写相关基础信息 Token name&#xff08;随意起名&#xff09; Expiratio…...

S4 UPA of AA :新资产会计概览

通用并行会计&#xff08;Universal Parallel Accounting&#xff09;可以支持每个独立的分类账与其他模块集成&#xff0c;UPA主要是为了支持平行评估、多货币类型、财务合并、多准则财务报告的复杂业务需求 在ML层面UPA允许根据不同的分类账规则对物料进行评估&#xff0c;并…...

单片机学习笔记 11. 外部中断

更多单片机学习笔记&#xff1a;单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘单片机学习笔记 8…...

C++中智能指针的使用及其原理 -- RAII,内存泄漏,shared_ptr,unique_ptr,weak_ptr

目录 1.智能指针的使用场景分析 2.RAII和智能指针的设计思路 3.C标准库智能指针的使用 4.智能指针的原理以及模拟实现 5.shared_ptr循环引用问题和weak_ptr 5.1shared_ptr循环引用问题 5.2weak_ptr的原理和部分接口 5.3weak_ptr的简单模拟实现 6. shared_ptr的线程安…...

DICOM医学影像应用篇——伪彩色映射 在DICOM医学影像中的应用详解

目录 引言 伪彩色映射的概念 基本原理 查找表&#xff08;Look-Up Table, LUT&#xff09; 步骤 示例映射方案 实现伪彩色映射的C代码 代码详解 伪彩色处理效果展示 总结 扩展知识 LUT 的基本概念 LUT 在伪彩色映射中的应用 示例 引言 在医学影像处理中&#xff0c…...

注意http-proxy-middleware要解决跨域问题,想修改origin请求头不要设置changeOrigin=true

在使用http-proxy-middleware的时候&#xff0c;有一个配置是“changeOrigin”&#xff0c;通过名字来看这个字段是用来控制是否修改origin的&#xff0c;但是实际使用下来&#xff0c;你会发现&#xff0c;当设置为true的时候&#xff0c;header中的origin的值并不会修改&…...

SpringBoot宠物领养平台:设计与实现

摘 要 如今社会上各行各业&#xff0c;都在用属于自己专用的软件来进行工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。互联网的发展&#xff0c;离不开一些新的技术&#xff0c;而新技术的产生往往是为了解决现有问题而产生的。针对于宠物领养…...

qt 的udp发送和接收

udp要在.pro中加入 QT network udp接收 //QUdpSocket *udp1; udp1 new QUdpSocket(this); udp1->bind(2024,QUdpSocket::ShareAddress); connect(udp1,SIGNAL(readyRead()),this,SLOT(ReadyOut())); void MainWindow::ReadyOut() { while(udp1->hasPend…...

极狐GitLab 17.6 正式发布几十项与 DevSecOps 相关的功能【五】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…...

中科亿海微SoM模组——波控处理软硬一体解决方案

本文介绍的波控处理软硬一体解决方案主要是面向相控阵天线控制领域&#xff0c;波控处理通过控制不同天线组件的幅相来调整天线波束的方向和增益&#xff0c;实现高精度角度控制和高增益。本方案由波控处理板、波控处理控制软件算法和上位机软件共同构成。波控处理SoM模组原型样…...

vue页面跟数据不同步this.$set

“Vue页面跟数据同步this.$set”可能是指在某些情况下&#xff0c;需要确保数据的响应式特性&#xff0c;即当数据发生变化时&#xff0c;页面上的显示也能实时更新。 如果你遇到数据已经设置&#xff0c;但页面没有更新&#xff0c;可能是因为你没有正确使用 Vue 的响应式系统…...

黑马2024AI+JavaWeb开发入门Day02-JS-VUE飞书作业

视频地址&#xff1a;哔哩哔哩 讲义作业飞书地址&#xff1a;飞书 一、作业1 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge">&l…...

(0基础保姆教程)-JavaEE开课啦!--12课程(Spring MVC注解 + Vue2.0 + Mybatis)-实验10

一、常见的SpringMVC注解有哪些&#xff1f; 1.Controller&#xff1a;用于声明一个类为 Spring MVC 控制器。 2.RequestMapping&#xff1a;用于将 HTTP 请求映射到特定的处理方法上。可以指定请求类型&#xff08;GET、POST等&#xff09;和URL路径。 3.GetMapping&#xff…...

未成年人模式护航,保障安全健康上网

为保护未成年人的上网环境&#xff0c;预防未成年人沉迷网络&#xff0c;帮助未成年人培养积极健康的用网习惯&#xff0c;HarmonyOS SDK 提供未成年人模式功能&#xff0c;在华为设备上加强对面向未成年人的产品和服务的管理。 场景介绍&#xff08;应用跟随系统未成年人模式…...

【实体配置】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列 &#x1f…...