Android笔试面试题AI答之Kotlin(18)

文章目录

  • 86. 阐述Kotlin中性能优化之局部函数 ?
      • 局部函数的优点
      • 间接的性能优化
      • 注意事项
  • 87. 简述Kotlin中性能优化之数组使用 ?
      • 1. 选择合适的数组类型
      • 2. 避免不必要的数组创建
      • 3. 优化数组访问
      • 4. 合理使用数组遍历方式
      • 5. 利用Kotlin的集合操作API
      • 6. 注意数组扩容问题
      • 7. 使用数组池化技术
  • 88. 简述 Kotlin 空安全?
      • 1. 可为null的类型
      • 2. 空安全检查
      • 3. 安全调用运算符(?.)
      • 4. Elvis运算符(?:)
      • 5. 非空断言(!!)
      • 6. 安全转换(as?)
      • 7. let函数
      • 总结
  • 89. 简述 Kotlin 变量声明方式 ?
      • 1. 可变变量(var)
      • 2. 不可变变量(val)
      • 类型推断
      • 延迟初始化
      • 总结
  • 90. 简述Kotlin如何处理空指针异常?
      • 1. 可空类型与非空类型
      • 2. 安全调用操作符(?.)
      • 3. Elvis操作符(?:)
      • 4. 非空断言操作符(!!)
      • 5. 局部变量和类的属性的初始化
      • 6. 空安全的集合和映射
      • 7. 密封类和枚举类
      • 8. 编译时检查
  • 91. 解释Kotlin类的默认行为?
      • 1. 类的可见性
      • 2. 类的继承性
      • 3. 构造函数
      • 4. 成员变量(属性)
      • 5. 成员方法(函数)
      • 总结

86. 阐述Kotlin中性能优化之局部函数 ?

在Kotlin中,局部函数(也称为嵌套函数或内部函数)是定义在另一个函数体内的函数。这些函数只能在其外部函数的作用域内被访问,并且它们提供了一种将复杂逻辑分解为更小、更易于管理的部分的方式。虽然局部函数本身并不直接针对性能优化而设计,但它们可以通过提高代码的可读性、可维护性和可重用性来间接地促进性能优化。

局部函数的优点

  1. 提高代码可读性:通过将大型函数分解为多个局部函数,你可以使代码更加模块化,每个函数都专注于一个特定的任务。这有助于读者更快地理解代码的逻辑和目的。

  2. 促进代码重用:局部函数可以在其外部函数内部被多次调用,这有助于减少重复代码,并促进代码的重用。

  3. 减少作用域污染:局部函数的作用域被限制在其外部函数内部,这有助于减少全局作用域中的变量和函数数量,从而降低命名冲突和错误的风险。

  4. 更好的封装:局部函数提供了一种将相关逻辑封装在一起的方式,这有助于隐藏实现细节,并保护数据不被外部代码意外修改。

间接的性能优化

虽然局部函数本身不直接提供性能上的优势(如减少CPU或内存使用),但它们通过提高代码的可读性、可维护性和可重用性来间接地促进性能优化:

  1. 减少错误:更清晰的代码结构有助于减少错误,因为开发者可以更容易地理解代码的逻辑和目的。这减少了调试和修复错误所需的时间,从而提高了开发效率。

  2. 优化热点代码:当使用性能分析工具识别出代码中的热点(即执行时间最长的部分)时,你可以更容易地定位到这些热点,并考虑是否可以通过重构局部函数来优化它们。例如,你可以将重复的代码提取到局部函数中,并使用更高效的算法或数据结构来改进这些函数。

  3. 促进并行处理:在某些情况下,局部函数可能有助于你更容易地将代码分解为可以并行执行的部分。虽然Kotlin本身并不直接提供并行处理机制(除了协程和并发工具类之外),但通过将任务分解为更小的、独立的函数,你可以更容易地利用现代硬件的并行处理能力(如果编译器或运行时环境支持)。

注意事项

  • 避免过度嵌套:虽然局部函数很有用,但过度嵌套可能会导致代码难以理解和维护。请确保你的局部函数保持适当的规模和复杂度。

  • 注意作用域:局部函数只能在其外部函数的作用域内被访问,这可能会限制它们的可重用性。请仔细考虑你的设计,以确保局部函数的使用是合理的。

总之,局部函数是Kotlin中一种强大的语言特性,它们通过提高代码的可读性、可维护性和可重用性来间接地促进性能优化。在编写Kotlin代码时,请考虑使用局部函数来分解复杂逻辑,并优化你的代码结构。

87. 简述Kotlin中性能优化之数组使用 ?

在Kotlin中,数组的使用对于性能优化至关重要。数组是一种基础的数据结构,用于在内存中连续存储相同类型的数据。正确地使用数组可以显著提高数据处理的效率和性能。以下是一些关于Kotlin中数组使用的性能优化建议:

1. 选择合适的数组类型

Kotlin提供了多种数组类型,如IntArrayDoubleArray等原生类型数组,以及Array<T>这样的泛型数组。在性能敏感的场景下,应优先使用原生类型数组,因为它们避免了装箱和拆箱的开销,直接操作内存中的值,从而提高了性能。

2. 避免不必要的数组创建

在循环或频繁调用的函数中创建数组会增加内存分配和垃圾回收的压力。应尽量避免在这些场景中创建新的数组实例,而是考虑重用已有的数组或通过其他方式(如使用集合的toTypedArray()方法)来减少数组创建的开销。

3. 优化数组访问

数组访问是数组操作中最为频繁的操作之一。为了提高数组访问的效率,应尽量避免在访问数组时进行复杂的计算或条件判断。此外,使用局部变量来缓存数组的长度或索引值也可以减少访问开销。

4. 合理使用数组遍历方式

Kotlin提供了多种遍历数组的方式,如使用for循环、forEach函数等。在选择遍历方式时,应根据具体场景和性能需求进行选择。例如,在需要索引的场景下,使用for循环可能更为高效;而在只需要遍历数组元素时,使用forEach函数可能更为简洁。

5. 利用Kotlin的集合操作API

Kotlin的集合操作API(如mapfilterreduce等)提供了丰富的数据处理能力。虽然这些操作在底层可能会使用数组或其他数据结构来实现,但它们通过抽象和封装简化了数据处理的复杂性,并允许开发者以声明式的方式编写代码。在需要处理大量数据时,合理利用这些API可以显著提高代码的可读性和性能。

6. 注意数组扩容问题

在使用可变大小的数组(如ArrayList等)时,应注意其扩容问题。当数组容量不足以容纳更多元素时,它会自动进行扩容操作,这可能会涉及到内存分配和元素复制等开销较大的操作。因此,在预估到数组大小可能会发生变化时,应合理设置初始容量以减少扩容次数。

7. 使用数组池化技术

对于需要频繁创建和销毁数组的场景(如线程池中的任务执行),可以考虑使用数组池化技术来减少内存分配和垃圾回收的开销。数组池化技术通过预分配一定数量的数组实例并重用它们来避免频繁的内存分配和回收操作。

综上所述,Kotlin中数组使用的性能优化涉及多个方面,包括选择合适的数组类型、避免不必要的数组创建、优化数组访问、合理使用数组遍历方式、利用Kotlin的集合操作API、注意数组扩容问题以及使用数组池化技术等。通过综合考虑这些因素并采取相应的优化措施,可以显著提高Kotlin程序中数组操作的性能和效率。

88. 简述 Kotlin 空安全?

Kotlin的空安全是一种设计特性,旨在减少程序中的空指针异常(NullPointerException),提高代码的健売性和稳定性。以下是Kotlin空安全的主要方面:

1. 可为null的类型

在Kotlin中,类型系统区分了可以为null的类型和不可为null的类型。默认情况下,Kotlin中的类型是不允许为null的。如果需要一个变量可以持有null值,你需要在类型后面显式地添加一个问号(?)来标记这个类型为可空类型。例如:

var name: String? = "Kotlin" // 可空类型
var age: Int = 30 // 不可为空

2. 空安全检查

Kotlin编译器在编译时会检查潜在的null值问题。如果你尝试访问一个可空类型的属性或方法而没有进行null检查,编译器会报错。这促使开发者显式地处理null值,比如通过条件判断或安全调用运算符。

3. 安全调用运算符(?.)

安全调用运算符(?.)允许你安全地调用可空类型对象的属性或方法。如果对象不为null,则正常调用;如果对象为null,则调用链会在当前点返回null,而不是抛出NullPointerException。例如:

val length: Int? = name?.length

4. Elvis运算符(?:)

Elvis运算符(?:)提供了一种简洁的方式来处理null值。它接受两个操作数,如果第一个操作数不为null,则返回第一个操作数的值;如果第一个操作数为null,则返回第二个操作数的值。这常用于为可能为null的表达式提供一个默认值。例如:

val defaultName: String = name ?: "Unknown"

5. 非空断言(!!)

非空断言(!!)是一个显式地告诉编译器某个可空类型变量在特定点上一定不是null的运算符。如果变量实际上是null,而你又使用了!!来断言它非空,那么运行时将抛出NullPointerException。因此,应谨慎使用!!以避免意外的空指针异常。例如:

val length: Int = name!!.length // 如果name为null,这里会抛出NullPointerException

6. 安全转换(as?)

Kotlin还提供了安全转换运算符(as?),它尝试将值转换为指定的类型,如果转换失败(例如,如果值是null或者不是目标类型的实例),则返回null而不是抛出ClassCastException。这提供了一种比Java中的强制类型转换更安全的方式。

7. let函数

let函数允许你在对象不为null的情况下执行一个代码块,并将该对象作为代码块的参数。这在处理可能为null的对象时特别有用,因为它可以避免在每次访问对象时都进行null检查。

总结

Kotlin的空安全特性通过显式地标记可空类型、在编译时检查潜在的null值问题、提供安全调用运算符和Elvis运算符等机制,有效地减少了程序中的空指针异常,提高了代码的健壮性和可维护性。开发者在编写Kotlin代码时,应充分利用这些特性来编写更加安全、可靠的代码。

89. 简述 Kotlin 变量声明方式 ?

Kotlin中的变量声明方式与许多其他编程语言相似,但也有一些独特的特性。Kotlin支持两种类型的变量:可变变量(var)和不可变变量(val)。这两种类型的主要区别在于它们的值是否可以在声明之后被重新赋值。

1. 可变变量(var)

使用var关键字声明的变量是可变的,即它们的值可以在声明之后被重新赋值。声明var变量时,需要指定变量的类型(除非使用了Kotlin的类型推断功能)并初始化它,或者至少在声明时提供一个类型但不立即初始化(但必须在使用前初始化)。

var name: String = "Kotlin" // 声明并初始化
var age: Int // 声明但未初始化,需要在使用前赋值
age = 30

2. 不可变变量(val)

使用val关键字声明的变量是不可变的,即它们的值在声明并初始化之后就不能被重新赋值。这种变量通常用于那些一旦设置就不需要改变的数据,如配置值、常量等。

val pi: Double = 3.14 // 声明并初始化
// pi = 3.14159 // 这行会编译错误,因为val变量不可变

类型推断

Kotlin具有强大的类型推断能力,这意味着在很多情况下,你不需要显式地指定变量的类型。编译器可以根据变量初始化时的值自动推断出变量的类型。

var name = "Kotlin" // 类型被推断为String
val age = 30 // 类型被推断为Int

延迟初始化

对于var变量,如果你希望延迟初始化(即不在声明时立即初始化),并且你的变量是非空的(即你不打算将其设置为null),你可以使用lateinit关键字。但是,请注意,lateinit只能用于非空的var变量,并且这些变量在对象构造函数结束之前必须被初始化。

class Person {lateinit var name: String // 延迟初始化,但必须在构造函数结束前赋值init {name = "Kotlin" // 初始化name}
}

总结

Kotlin提供了varval两种变量声明方式,分别用于需要改变值的变量和一旦设置就不需要改变的常量。Kotlin还支持类型推断,使得代码更加简洁。对于需要延迟初始化的非空var变量,可以使用lateinit关键字。

90. 简述Kotlin如何处理空指针异常?

Kotlin通过其独特的空安全机制来有效处理空指针异常(NullPointerException),这种机制在编译时和运行时都提供了保障,极大地减少了空指针异常的发生。以下是Kotlin处理空指针异常的几个关键方面:

1. 可空类型与非空类型

Kotlin在类型系统中明确区分了可空类型(使用问号?后缀表示,如String?)和非空类型(没有问号后缀,如String)。这种区分使得编译器能够在编译时检查潜在的空引用,从而帮助开发者避免空指针异常。

2. 安全调用操作符(?.)

Kotlin提供了安全调用操作符?.,它允许在调用对象的方法或属性之前检查该对象是否为空。如果对象为空,则安全调用操作符会立即返回null,而不会抛出空指针异常。这种方式鼓励开发者编写更加安全的代码,通过显式地处理可能为null的情况来避免运行时错误。

3. Elvis操作符(?:)

Elvis操作符?:允许为可空变量提供一个默认值。当变量为null时,将返回这个默认值,这有助于在某些情况下避免空指针异常。例如,当尝试访问一个可能为null的字符串的长度时,可以使用Elvis操作符来提供一个默认值,如val length = string?.length ?: 0

4. 非空断言操作符(!!)

虽然非空断言操作符!!在某些情况下可能看起来方便,因为它会在运行时检查变量是否为null并抛出空指针异常(如果为null的话),但通常建议避免使用它。因为它破坏了Kotlin的空安全特性,可能会导致意外的运行时错误。然而,在某些你确信变量不会为null,但编译器无法确定的情况下,可以使用非空断言操作符来告诉编译器“相信我,这个不会是null”。但使用时需要格外小心。

5. 局部变量和类的属性的初始化

Kotlin要求局部变量和类的属性通常需要显式初始化。这有助于确保变量在使用前总是有一个有效的值,从而避免了空指针异常。对于类的属性,可以使用构造函数或初始化块来确保它们在使用前被初始化。

6. 空安全的集合和映射

Kotlin的集合和映射API也提供了空安全的操作。例如,可以使用filterNotNull方法来过滤掉集合中的null元素,或者使用getOrNull方法来尝试从映射中获取一个值,如果该值不存在则返回null而不是抛出异常。

7. 密封类和枚举类

密封类和枚举类可以帮助限制变量的可能值,从而避免由于意外的null值而导致的空指针异常。密封类允许定义一组有限的子类,而枚举类则提供了一组固定的常量。

8. 编译时检查

Kotlin将空指针异常的检查提前到了编译时期,如果存在空指针异常的风险,那么在编译的时候会直接报错,从而要求开发者修正代码后才能成功运行。这种机制使得Kotlin程序在编写阶段就能发现和解决潜在的空指针问题。

综上所述,Kotlin通过其强大的类型系统和一系列空安全的操作符和函数,为开发者提供了一种优雅且安全的方式来处理空值和避免空指针异常。通过合理利用这些特性,可以编写出更加健壮和可靠的代码。

91. 解释Kotlin类的默认行为?

Kotlin类的默认行为涉及多个方面,包括类的可见性、继承性、构造函数以及成员变量的默认行为等。以下是对Kotlin类默认行为的详细解释:

1. 类的可见性

  • 默认公开(Public):在Kotlin中,如果没有显式指定类的可见性修饰符,那么该类默认是公开的(public)。这意味着该类可以被任何其他类访问。这与Java中的默认包级私有(没有修饰符时)有所不同。

2. 类的继承性

  • 默认不可继承(Final):Kotlin中的类默认是final的,即它们不能被其他类继承。如果希望一个类可以被继承,需要使用open关键字来修饰该类。

    open class MyBaseClass {// ...
    }
    

    与之相反,Java中的类默认是可以被继承的(除非显式声明为final)。

3. 构造函数

  • 主构造函数:Kotlin中的类可以有一个主构造函数,其参数直接定义在类头中。主构造函数是可选的,如果不显式定义,则默认存在一个无参的主构造函数。
  • 次构造函数:Kotlin允许定义次构造函数(也称为辅助构造函数),它们使用constructor关键字声明,并且必须直接或间接地委托给主构造函数。次构造函数可以有多个。
  • 默认参数值和额外的无参构造函数:如果主构造函数的所有参数都有默认值,编译器会生成一个额外的无参构造函数,该构造函数将使用参数的默认值进行初始化。

4. 成员变量(属性)

  • 属性声明:Kotlin中的成员变量称为属性,它们可以直接在类体中声明。属性可以具有初始值,也可以不包含初始值(但必须在构造函数中初始化,除非它们是延迟初始化的)。
  • 延迟初始化:对于非空的var属性,如果它们的值在构造函数执行结束之前还无法确定,可以使用lateinit关键字进行延迟初始化。但是,请注意,lateinit只能用于var属性,并且它们必须在声明后的某个时间点被初始化。
  • by lazy:Kotlin还提供了by lazy委托,它允许属性在第一次访问时延迟初始化。这对于那些初始化开销较大,但又不是在类实例化时立即需要的属性非常有用。

5. 成员方法(函数)

  • 默认行为:Kotlin中的成员函数(方法)默认是公开的,并且可以被子类覆盖(如果它们不是final的)。如果希望一个方法不能被覆盖,可以使用final关键字(尽管在Kotlin中这更多是通过省略open关键字来实现的,因为默认情况下方法不是open的)。

总结

Kotlin类的默认行为包括默认公开性、默认不可继承性、默认的主构造函数(如果存在)以及默认的属性初始化规则(如果未指定)。这些默认行为旨在提供清晰和安全的编程模型,同时减少模板代码的需要。然而,开发者可以通过使用适当的修饰符和委托机制来覆盖这些默认行为,以满足特定的编程需求。

答案来自文心一言,仅供参考

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

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

相关文章

go 系列之 once

一、简介 once 方法用于保证指定函数只执行一次。例如配置懒加载&#xff0c;客户端获取密钥等场景&#xff0c;都可以用到once。 二、技术实现 2.1 Once.go type Once struct {done atomic.Uint32m Mutex }func (o *Once) Do(f func()) {if o.done.Load() 0 {o.doSlow(…

红黑树的特点和使用场景

红黑树&#xff08;Red-Black Tree&#xff09;是一种 自平衡二叉搜索树&#xff0c;它在插入、删除和查找操作时保持了树的平衡性&#xff0c;从而保证了这些操作的时间复杂度为 O(log n)。红黑树在实际应用中广泛使用&#xff0c;例如在操作系统的内核中用于管理进程调度、文…

rabbitmq镜像集群搭建

用到的ip地址 ip地址端口192.168.101.65&#xff08;主&#xff09;15672192.168.101.7515672192.168.101.8515672 安装erlang和rabbitmq 安装 安装三个包 yum install esl-erlang_23.0-1_centos_7_amd64.rpm -y yum install esl-erlang-compat-18.1-1.noarch.rpm -y rpm -…

探索CompletableFuture:高效异步编程的利器

目录 一、CompletableFuture基本功能安利 二、CompletableFuture使用介绍 &#xff08;一&#xff09;任务创建使用 1.supplyAsync创建带有返回值的异步任务 2.runAsync创建没有返回值的异步任务 &#xff08;二&#xff09;异步回调使用 1.异步回调&#xff1a;thenApp…

基于Sringboot+Vue个人驾校预约管理系统--论文pf

TOC springboot503基于SringbootVue个人驾校预约管理系统--论文pf 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。…

XSS-games

XSS 1.XSS 漏洞简介2.XSS的原理3.XSS的攻击方式4.XSS-GAMESMa SpaghetJefffUgandan KnucklesRicardo MilosAh Thats HawtLigmaMafiaOk, BoomerWW3svg 1.XSS 漏洞简介 ​ XSS又叫CSS&#xff08;Cross Site Script&#xff09;跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Sc…

Nginx服务器申请及配置免费SSL证书

免费SSL证书申请 背景&#xff1a; 我的情况是这样&#xff0c;域名解析是华为云的&#xff0c;然后免费证书在腾讯云申请。但是大致的配置流程都是一样的 在腾讯云平台申请免费的SSL证明(目前有效期是90天)&#xff0c;申请步骤如下 主要步骤说明 申请免费SSL证书根据申请时说…

对商品评论进行文本分析(NLP)的实战项目

文本分析技术是指使用计算机程序或算法处理、分析和理解文本数据的一系列方法。这种技术在自然语言处理&#xff08;NLP&#xff09;领域中非常重要&#xff0c;它可以应用于多种场景&#xff0c;包括但不限于情感分析、主题识别、信息提取、文本分类等。以下是一些常见的文本分…

使用Python+os模块创建文件和文件夹

一、使用Python的open函数创建文件 # 创建文件 with open(/home/Download/my_directory/my_file.txt, w) as f:f.write(世界你好)open(name[, mode[, buffering]])参数详解 name : 一个包含了你要访问的文件名称的字符串值。 mode : mode 决定了打开文件的模式&#xff1a;只…

GAP技术:实现隔离网络之间安全数据交换的创新方案

在当今高度互联的世界中&#xff0c;网络安全和数据隐私已经成为企业和组织最为关注的课题之一。特别是在一些高度敏感的环境中&#xff0c;如金融、国防、医疗等领域&#xff0c;网络隔离是防止数据泄露和网络攻击的关键手段。然而&#xff0c;如何在保持网络隔离的前提下&…

CryptoJS hex模式前端

CryptoJS 加密&#xff1a; aesJson (str, secretKey, aesIv, padding) {let keylet ivkey CryptoJS.enc.Utf8.parse(secretKey)iv CryptoJS.enc.Utf8.parse(aesIv)let plaintText str // CryptoJS.enc.Utf8.parse(str) 明文stringlet encrypted CryptoJS.AES.encrypt(pl…

如何在本地和远程删除 Git 分支?

如何在本地和远程删除 Git 分支&#xff1f; 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开发者社区主理人 擅长.n…

[240821] NVIDIA Edify:助力开发者创建定制化 AI 模型 | Ubuntu 24.04.1 LTS 版本延期发布

目录 NVIDIA Edify&#xff1a;助力开发者创建定制化 AI 模型Ubuntu 24.04.1 LTS 版本延期发布 NVIDIA Edify&#xff1a;助力开发者创建定制化 AI 模型 NVIDIA Edify&#xff0c;一种多模态 AI 架构&#xff0c;可以帮助开发者构建生成式 AI 工具。 Edify 的主要优势&#x…

江西学术会议:第五届计算机、大数据与人工智能国际会议

第五届计算机、大数据与人工智能国际会议(ICCBDAI 2024)将于2024年11月1日-3日在江西景德镇召开。本届会议由景德镇陶瓷大学主办&#xff0c;西安交通大学、暨南大学、南京邮电大学、景德镇学院、ELSP&#xff08;爱迩思出版社&#xff09;、ESBK国际学术交流中心、AC学术平台协…

Transformer模型中的Position Embedding实现

引言 在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;Transformer模型自2017年提出以来&#xff0c;已成为许多任务的基础架构&#xff0c;包括机器翻译、文本摘要和问答系统等。Transformer模型的核心之一是其处理序列数据的能力&#xff0c;而Position Embedding在…

你是如何克服编程学习中的挫折感的?(-@-^-0-)

在编程学习中遇到挫折感是极为常见且正常的现象&#xff0c;因为编程往往涉及解决复杂问题、理解抽象概念以及不断试错的过程。 以下是一些建议&#xff0c;帮助你在面对挫折时调整心态&#xff0c;继续前行&#xff1a; 接受失败是成长的一部分&#xff1a;首先要认识到&#…

专题---自底向上的计算机网络(计算机网络相关概述)

目录 计算机网络相关概述 物理层 数据链路层 网络层 运输层 应用层 网络安全 1.计算机网络相关概述&#xff08;具体细节http://t.csdnimg.cn/NITAW&#xff09; 什么是计算机网络&#xff1f; 计算机网络是将一个分散的&#xff0c;具有独立功能的计算机系统&#x…

测绘程序设计|初识C#编程语言|C#源码结构|面向对象|MFC、WinFrom与WPF

由于微信公众号改变了推送规则&#xff0c;为了每次新的推送可以在第一时间出现在您的订阅列表中&#xff0c;记得将本公众号设为星标或置顶喔~ 根据笔者经验&#xff0c;分享了C#编程语言、面向对象以及MFC、WinForm与WPF界面框架相关知识~ &#x1f33f;前言 c#作为测绘程序…

海外媒体投稿:怎样在法国媒体发稿宣传中获得成功

法国是一个充满机遇的销售市场&#xff0c;而媒体发稿营销推广是企业在法国市场里扩张曝光度和提升知名度的有效途径。下面我们就共享如何运用低投资得到高收益的办法&#xff0c;帮助企业在法国媒体发稿推广过程中获得成功。 第一步&#xff1a;掌握目标群体在进行法国媒体发稿…

AI时代来临:数字人主播,虚拟代言人正颠覆行业!

数字人主播、虚拟代言人……你的身边有“数字同事”了吗&#xff1f;近年来&#xff0c;越来越多的数字人开始活跃在各个行业&#xff0c;承担起直播带货、知识讲解、新闻播报和品牌代言等任务。就在刚刚过去的五一假期&#xff0c;当大多数人还在休息时&#xff0c;不少数字人…