【C# 12新特性必学】:主构造函数的3种高效用法,90%开发者还不知道

第一章:C# 12主构造函数概述

C# 12 引入了主构造函数(Primary Constructors),显著简化了类和结构体中构造逻辑的声明方式。这一特性允许开发者在类定义级别直接声明构造参数,并将其用于初始化属性或字段,从而减少样板代码,提升代码可读性与维护性。

语法结构与基本用法

主构造函数的参数紧跟在类名后的括号中,这些参数可在整个类体内被访问,常用于初始化私有字段或自动属性。例如:
// 使用主构造函数定义Person类
public class Person(string name, int age)
{
    public string Name { get; } = name;
    public int Age { get; } = age;

    public void Introduce()
    {
        Console.WriteLine($"Hello, I'm {Name}, {Age} years old.");
    }
}
上述代码中,name 和 age 是主构造函数的参数,直接用于属性初始化,无需显式编写构造函数体。

适用场景与优势

主构造函数特别适用于数据承载类或需要简洁初始化逻辑的场景。其主要优势包括:
  • 减少冗余代码,避免手动编写构造函数和参数赋值
  • 提升类定义的紧凑性和表达力
  • 与记录类型(record)协同使用时,进一步强化不可变数据模型的构建能力
特性传统构造函数主构造函数
代码量较多较少
可读性一般高
适用类型所有类推荐用于轻量级、初始化简单的类
需要注意的是,主构造函数不支持访问修饰符(如 public、private)直接修饰参数,且当前仅适用于非静态类和结构体。同时,一个类型只能定义一个主构造函数。

第二章:主构造函数的核心语法与原理

2.1 主构造函数的声明方式与参数传递机制

在现代编程语言中,主构造函数是类初始化的核心入口。它通常与类定义体直接关联,并通过参数列表接收初始化数据。
构造函数的基本声明
以 Kotlin 为例,主构造函数使用 `constructor` 关键字声明,参数直接定义在类名后的括号中:
class User constructor(name: String, age: Int) {
    init {
        println("Initialized with name: $name and age: $age")
    }
}
上述代码中,`name` 和 `age` 是主构造函数的参数,仅用于初始化。`init` 块会在实例化时执行,体现参数的传递时机。
参数可见性与属性提升
通过添加 `val` 或 `var`,可将构造参数直接升级为类属性:
class User(val name: String, var age: Int)
此时,`name` 成为只读属性,`age` 为可变属性,编译器自动生成对应的字段与访问器。
  • 主构造函数限制:不能包含代码逻辑,逻辑需置于 `init` 块中
  • 参数可设默认值,支持可选参数调用

2.2 与传统构造函数的对比分析

在现代JavaScript中,类(class)提供了一种更清晰、更面向对象的方式来创建对象,相较于传统的构造函数语法更具可读性。
语法简洁性
ES6类屏蔽了原型操作的复杂性。例如:

class Person {
  constructor(name) {
    this.name = name;
  }
  greet() {
    console.log(`Hello, I'm ${this.name}`);
  }
}
上述代码逻辑等价于传统构造函数:

function Person(name) {
  this.name = name;
}
Person.prototype.greet = function() {
  console.log(`Hello, I'm ${this.name}`);
};
类语法将方法集中定义,提升维护性。
继承实现对比
  • 传统方式需手动管理原型链
  • class通过extends和super实现继承,语义明确
特性构造函数Class
可读性较低高
继承支持复杂简洁

2.3 编译器如何生成幕后字段与属性初始化

在C#等高级语言中,自动实现的属性(auto-implemented properties)看似仅包含get和set访问器,但编译器会在背后生成私有的、匿名的“幕后字段”(backing field)来存储数据。
幕后字段的生成过程
当定义一个自动属性时,如:
public string Name { get; set; }
编译器会将其转换为类似以下结构:
private string <Name>k__BackingField;
public string Name
{
    get { return <Name>k__BackingField; }
    set { <Name>k__BackingField = value; }
}
其中 `<Name>k__BackingField` 是由编译器生成的命名约定字段,确保封装性。
属性初始化的时机
使用对象初始化器或构造函数时,属性赋值会直接操作该幕后字段。编译器确保所有访问路径统一经过getter/setter,从而支持数据验证、通知机制等高级行为。

2.4 参数验证与异常处理的最佳实践

统一异常响应结构
为提升API的可维护性,建议定义标准化的错误响应格式。使用统一结构便于前端解析和日志追踪。
字段类型说明
codeint业务错误码
messagestring用户可读提示
detailsobject调试信息(如参数名)
服务端参数校验示例
type CreateUserRequest struct {
    Name  string `json:"name" validate:"required,min=2"`
    Email string `json:"email" validate:"required,email"`
}

// 使用validator库自动校验
if err := validate.Struct(req); err != nil {
    return ErrorResponse(400, "invalid_params", err.Error())
}
上述代码通过结构体标签声明校验规则,避免手动编写重复判断逻辑。required确保字段存在,email确保格式合规,提升代码可读性与安全性。

2.5 避免常见语法陷阱与编译错误

在Go语言开发中,理解常见的语法陷阱是提升代码健壮性的关键。初学者常因忽略变量作用域或误用短声明操作符导致意外行为。
短声明与重新声明陷阱
if val, err := someFunc(); err != nil {
    return err
} else if val, err := anotherFunc(); err != nil { // 错误:val 被重复声明
    return err
}
上述代码中,else if 分支试图使用 := 声明已存在的 val 和 err,但仅当变量在当前作用域未被声明时才可使用短声明。应改为:
var newVal int
var err error
newVal, err = anotherFunc()
常见编译错误对照表
错误现象原因分析
undefined: xxx包未导入或拼写错误
no new variables on left side of :=使用 := 对已声明变量赋值

第三章:在不同场景下的应用模式

3.1 在记录类型(record)中简化不可变对象创建

Java 14 引入的记录类型(record)为创建不可变数据载体提供了极简语法。通过一行声明,自动生生成构造函数、访问器、equals、hashCode 和 toString 方法。
基本语法示例
public record Person(String name, int age) {}
上述代码等价于编写一个包含所有样板代码的类。字段隐式为 final,确保不可变性。
优势对比
特性传统类记录类型
构造函数需手动编写自动生成
不可变性依赖开发者实现语言级保障
记录类型显著减少冗余代码,提升开发效率与代码可读性。

3.2 与依赖注入结合实现服务类的简洁声明

在现代应用架构中,依赖注入(DI)极大简化了服务类的声明与管理。通过将依赖关系交由容器处理,开发者可专注于业务逻辑而非对象创建。
声明式服务注册
使用依赖注入框架时,服务类可通过注解或配置自动注册到容器中:

type UserService struct {
    db *sql.DB
}

func NewUserService(db *sql.DB) *UserService {
    return &UserService{db: db}
}
上述代码通过构造函数注入数据库连接,避免硬编码依赖,提升可测试性与模块化程度。
依赖注入的优势
  • 降低耦合度:服务间依赖由容器管理,减少手动实例化
  • 增强可维护性:统一配置入口,便于替换实现
  • 支持生命周期管理:如单例、作用域实例等模式原生支持
结合 DI 容器(如 Wire、Dagger 或 Spring),服务类声明变得极简且语义清晰。

3.3 在领域模型中提升代码可读性与维护性

在复杂业务系统中,清晰的领域模型是保障代码长期可维护的关键。通过合理封装业务逻辑,能够显著降低模块间的耦合度。
使用值对象增强语义表达
值对象(Value Object)用于表达无唯一标识的业务概念,其相等性由属性决定,而非身份。这提升了代码的可读性。

type Money struct {
    Amount int
    Currency string
}

func (m Money) Equals(other Money) bool {
    return m.Amount == other.Amount && 
           m.Currency == other.Currency
}
上述代码定义了一个 `Money` 值对象,通过结构体字段明确表达了金额和币种的业务含义。`Equals` 方法确保比较逻辑集中管理,避免散落在各处的判断条件,提升一致性。
聚合根控制数据一致性
聚合根是领域模型中的核心实体,负责维护其边界内的业务规则一致性。
  • 聚合内部对象通过工厂方法创建,避免非法状态
  • 所有变更必须经过聚合根,确保业务规则校验被执行
  • 外部仅持有聚合根引用,简化依赖管理

第四章:性能优化与高级技巧

4.1 减少冗余代码提升编译效率

在大型项目中,冗余代码不仅增加维护成本,还会显著拖慢编译速度。通过提取公共逻辑、使用模板或泛型机制,可有效减少重复代码量。
函数抽象消除重复逻辑
将重复出现的代码封装为独立函数,是降低冗余的基本手段:

func processUser(data []byte, typ string) (*User, error) {
    var user User
    if err := json.Unmarshal(data, &user); err != nil {
        return nil, fmt.Errorf("failed to unmarshal %s: %w", typ, err)
    }
    if err := validateUser(&user); err != nil {
        return nil, fmt.Errorf("invalid %s data: %w", typ, err)
    }
    return &user, nil
}
上述函数整合了解析与校验逻辑,避免在多个处理路径中重复实现,提升可读性与编译缓存命中率。
编译性能对比
代码结构文件行数平均编译时间(s)
冗余实现240018.3
抽象优化后180012.7

4.2 结合表达式体成员实现极简语法风格

C# 中的表达式体成员允许将方法、属性等成员的实现简化为单一表达式,显著提升代码可读性与简洁度。
语法形式对比
传统属性写法:
public string GetDisplayName()
{
    return firstName + " " + lastName;
}
使用表达式体后:
public string DisplayName => firstName + " " + lastName;
箭头语法(=>)直接关联表达式,省略大括号与 return 语句,适用于单行逻辑。
适用成员类型
  • 只读属性:用 => 返回计算值
  • 方法:适用于返回简单表达式的函数
  • 构造函数与析构函数:可简化初始化逻辑
该语法不仅减少冗余结构,还强化了函数式编程风格,使代码更贴近数学表达式的直观性。

4.3 使用主构造函数优化DTO与API模型定义

在现代C#开发中,主构造函数(Primary Constructors)极大简化了数据传输对象(DTO)和API模型的定义。通过将构造参数直接内联到类声明中,开发者可减少样板代码,提升可读性。
简洁的模型定义方式
public class UserDto(string name, int age)
{
    public string Name => name;
    public int Age => age;
}
上述代码利用主构造函数自动捕获参数,并可在属性中直接使用。编译器自动生成私有字段,避免手动编写构造逻辑。
优势对比
方式代码量可维护性
传统构造函数高中
主构造函数低高
结合记录类型,还能进一步实现值语义和不可变性,适用于REST API请求/响应模型的高效建模。

4.4 避免内存泄漏:正确管理引用类型参数

在Go语言中,引用类型(如切片、map、chan、指针)作为参数传递时,仅拷贝引用而非底层数据。若未正确管理生命周期,可能导致本应被释放的对象持续被引用,引发内存泄漏。
常见泄漏场景
当函数接收一个大容量切片并长期持有其子切片时,即使原对象不再使用,底层数组仍无法释放。

func process(data []int) []int {
    return data[:10] // 仅需前10个元素,但引用整个底层数组
}
上述代码虽返回小切片,但仍指向原始大数组。正确做法是复制数据:

func safeProcess(data []int) []int {
    result := make([]int, 10)
    copy(result, data[:10])
    return result // 拥有独立底层数组
}
最佳实践
  • 避免在闭包中长期持有大引用对象
  • 及时将局部引用置为 nil 以促发GC
  • 使用 sync.Pool 复用临时对象,减少分配压力

第五章:未来趋势与开发者建议

边缘计算与AI模型的本地化部署
随着物联网设备性能提升,越来越多AI推理任务正从云端迁移至终端。例如,在工业质检场景中,使用轻量级模型在边缘设备上实现实时缺陷检测已成为主流方案。

// 示例:在Go中调用TensorFlow Lite进行本地推理
model, err := tflite.NewModelFromFile("model.tflite")
if err != nil {
    log.Fatal(err)
}
interpreter := tflite.NewInterpreter(model, nil)
interpreter.AllocateTensors()
input := interpreter.GetInputTensor(0)
copy(input.Float32s(), inputData) // 输入预处理图像数据
interpreter.Invoke() // 执行推理
output := interpreter.GetOutputTensor(0).Float32s()
全栈TypeScript的技术栈统一
现代Web开发趋向于使用TypeScript贯穿前后端与配置层。Next.js + Prisma + Zod的组合显著提升了类型安全与开发效率。
  • 使用Zod定义API输入输出契约,避免运行时类型错误
  • Prisma Schema统一数据库结构与ORM访问
  • 通过tRPC实现类型安全的端到端函数调用
开发者工具链的智能化演进
AI辅助编程工具已深度集成至主流IDE。GitHub Copilot不仅能生成代码片段,还可根据上下文自动编写单元测试。
工具应用场景优势
Copilot XCI/CD脚本生成减少模板代码编写时间
Sourcegraph Cody跨仓库代码理解快速定位遗留系统逻辑
代码提交 CI测试 自动化部署
C# 11 新特性解析与实战应用 插值字符串处理器(Interpolated String Handlers)允许自定义处理插值字符串的逻辑,扩展了字符串插值的功能。C# 11 引入的这些新特性强化了语言的表达力、提高了代码的可读性和可维护性,同时也为应对现代编程挑战提供了更丰富的工具箱。C# 11 继续推进语言的现代化和易用性,引入了若干旨在提高代码可读性、简化编程模型和增强类型系统的特性。表达式中的模式匹配得到了增强,支持更多类型的模式,包括类型模式、可空模式、递归模式和组合模式。表达式可以处理更复杂的类型检查和条件分支。 阅读详情

相关推荐

上位机介绍:C# 开发者的必知基础

上位机是指在工业控制系统中,位于上层、负责人机交互和数据管理的计算机/软件,与“下位机”(PLC、传感器、变频器、单片机等硬件设备)相对应,核心是“向下通信控制设备,向上展示交互数据”。下位机:一线干活的“工人”(执行采集、控制指令);上位机:指挥管理的“办公室人员”(发指令、看数据、做报表)。C#开发者掌握上位机开发的核心是“通信+UI+稳定性基础层:搞懂WinForms/WPF基础、串口/Modbus通信,能实现核心功能;进阶层:掌握分层设计、异步编程、工业级容错(断线重连、数据校验);

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1559

【Kotlin】Kotlin 构造函数 ( 主构造函数 | 主构造函数声明属性 | init 初始化代码块 | 次构造函数 | 构造函数委托 | 调用构造函数创建实例对象 )

I . 主构造函数 II . 主构造函数声明属性 III . init 初始化代码块 IV . 主构造函数参数 和 成员变量访问方式 V . 主构造函数 可见性 设置 VI . 次构造函数 ( 常用情况 ) VII . 次构造函数 ( 没有主构造函数 ) VIII . 构造函数 代码执行顺序 IX . 调用 主构造函数 / 次构造函数 创建类实例对象

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 4094

工业以太网协议C#实现:Profinet/OPC UA 入门实战+工业级开源库推荐(完整可运行)

在工业自动化上位机开发(C#)领域,Profinet和OPC UA是当前最主流、最核心的两大工业以太网协议,没有之一,二者互补共存、缺一不可✅Profinet底层设备通信协议,西门子主导的工业以太网标准,主打高速、实时、确定性,用于PLC与IO模块、变频器、伺服、传感器等底层设备的直接通信,是产线控制的「神经末梢」;✅OPC UA工业互联统一标准协议,工业界的「通用语言」,主打跨品牌、跨协议、跨平台、高安全、高可靠,用于上位机与PLC、上位机与上位机、MES/ERP与现场设备。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 737

C#12:主构造函数

record:record可以在定义类型时带参,这个参数会转成默认的属性public record PersonRecord(string FirstName, string LastName) { public string Name => $"{FirstName} {LastName}"; }在实例化完对象后,是可以直接使用这些属性的,但用record定义的类型,不会有默认构造函数。v...

dotNET跨平台 656

给jetson nano 安装AX200网卡驱动

几经波折,因为在网上看到的基本都是amd版本而非arm版,然后最终选定V5.5是因为更新的几个版本的arm版本是false的(在https://kernel.ubuntu.com/~kernel-ppa/mainline/处选择版本时,得看在arm64上是false还是build succeeded,之前没经验呀刚刚才顿悟的) 1,参考文章https://blog.youkuaiyun.com/MIRANA0/article/details/106696334 学到了得下载如下四个: wget https://k

发嘎嘎的博客 2345

RADIOML 2018.01A调制信号数据集介绍及处理

RadioML 2018.01A 由 DeepSig 发布,是专门针对自动调制识别(Automatic Modulation Recognition, AMR)和无线信号分类研究设计的基准数据集。它在原有 RadioML 2016.10a 的基础上,扩展并精细化了信道仿真模型,使得信号更接近真实无线环境下的表现。该数据集广泛用于机器学习模型的训练与评估,为各类深度学习算法提供了统一、可重复的实验条件。

weixin_56527269的博客 1895

深入理解 C# 中的主构造函数

深入理解 C# 中的主构造函数

鲤籽鲲的博客 1652

量化策略分享之ST股弱转强,回测年化123%

本策略的核心是精选ST股票,国九条过滤,防止直接暴雷退市,只做ST股票的弱转强,弱转强的认定标准是前日涨停但昨日不涨停,昨日收盘价大于前一日最低价,昨日收盘价大于10日线,昨日成交量大于前一日的成交量但小于前一日成交量的10倍,股价大于1;这类股票强势,有资金介入,能获得超额收益。

qq_29301281的博客 1268

2025年必学:TouchSocket网络框架零基础到实战全指南——解决90%的.Net通信难题

当你面对TCP黏分包、协议解析复杂、多通信模块整合困难等问题时,是否感到束手无策?作为.Net开发者,你是否希望有一个一站式解决方案,能够轻松应对从基础Socket到高级RPC的各种通信需求?TouchSocket正是为解决这些痛点而生的全能网络通信框架。 本文将带你全面掌握TouchSocket的安装与使用,读完后你将能够: - 快速搭建TCP、UDP、HTTP等多种通信服务 - 优雅解决TC...

gitblog_01429的博客 788

Zabbix-获取客户端的SNMP数据

网口状态(ifOperStatus)的 OID 是1.3.6.1.2.1.2.2.1.8,查询时需要用1.3.6.1.2.1.2.2.1.8.1(第 1 个网口)、1.3.6.1.2.1.2.2.1.8.2(第 2 个网口)等。表格对象是指 “包含多个同类实例的对象”(如设备的多个网口、多个进程等,每个实例需要单独标识)。在 SNMP 规范中,标量对象的完整 OID 必须以.0结尾,.0是标量对象的唯一实例编号。标量对象是指 “单一值的对象”(如设备的名称、温度、状态等,整个设备只需要一个值来表示)。

徐子元 1727

PCB布局规范及其注意事项(纯干货)

这样做的好处是信号1,3层不会有串扰,4和5作为电源有紧密的耦合,3个信号层都有GND平面可以参考,且不会互相产生串扰,唯一的缺点是布线的层面只有3个信号层(信号03的是最适合来传输高速信号,因为该层的二面都有屏蔽,防止干扰传出,也防止干扰传入)33、影响阻抗匹配的参数(ER介电常数(1GHZ以下默认为4.2,以上的话问板厂),H介质厚度(就是内层压合的PP片厚度),W走线的线宽,T走线的厚度(铜厚/减小线的厚度可以增大阻抗))我这里使用的是CITS25来计算阻抗。

qq_42379138的博客 8846

测试开发知识体系-推荐教材:《C#硬件编程实战》

的能力,薪资溢价可达30%-50%。书中案例可直接用于求职作品集,技术要点覆盖90%硬件测试岗位要求。SerialPort类/Modbus RTU。仪器控制库(VISA/SCPI).NET Core工业应用实践。SCPI命令生成器/错误处理。async/await异步。内存映射文件/环形缓冲区。掌握本书内容后,您将具备。配套GitHub代码库。内存映射文件/线程同步。.NET Core移植。:每次编码后问三个问题。设备通信超时重试机制。第2版(2022年)

jiaworld的博客 599

福建公共资源交易平台 portal-sign与响应Data解密逆向实录

本文分析了福建公共资源交易电子公共服务平台的接口加密机制。通过抓包和代码分析,发现请求头中的portal-sign由MD5算法生成,包含固定秘钥和排序后的参数拼接。响应数据采用AES-256-CBC加密,需使用特定Key和IV解密。文章详细介绍了签名生成规则、参数处理流程及加密常量定位方法,为接口对接提供了技术参考。整个过程展示了如何通过逆向工程还原前端加密逻辑,最终实现脱离浏览器环境的纯协议调用。

自成背后的博客 1157

Unity.Mathematics核心函数速查:math静态类的15个必学方法

Unity.Mathematics是Unity引擎中用于向量运算和数学计算的高性能C#库,提供了类似着色器语法的简洁API。本文将介绍math静态类中15个最常用的核心方法,帮助开发者快速掌握向量、矩阵和四元数的基础操作。 ## 一、向量基础操作 ### 1. dot:向量点积计算 点积用于计算两个向量的夹角和投影关系,是物理碰撞、光照计算的基础。 ```csharp float dotPro

gitblog_00797的博客 500

【异常】OpenClaw调用火山引擎大模型提示词 Agent failed before reply: All models failed (6): volcengine/kimi-k2-5-26

摘要: 本文针对OpenClaw调用火山引擎大模型服务时触发的全量熔断报错(All models failed)提供全链路排查方案。报错核心为服务熔断(cooldown)和模型不可用(model_not_found),主要源于账号权限、API凭证失效或模型标识错误。解决方案按优先级分步实施:1)校验账号状态与AK/SK有效性;2)核对官方模型标识;3)重启服务解除熔断;4)修复配置文件;5)通过原生API测试定位网络或服务端问题。日志分析(openclaw logs)可快速识别HTTP状态码(如401/40

奶爸的编程之路,也就一周冷个三天 837

时空智友企业流程化管控系统文件上传漏洞

时空智友企业流程化管控系统是一个功能丰富、灵活可定制的企业管理工具。通过该系统,企业能够实现流程的自动化、协同的提升、数据的洞察和决策的优化,从而提高工作效率、管理水平和企业竞争力。时空智友企业流程化管控系统 formservice接口处存在任意文件上传漏洞,未经认证的攻击者可通过此接口上传后门文件,最终可导致服务器失陷。

holyxp的博客 1032

C#入门实战指南:从语法基础到上位机与数据处理

编程语言的学习从来不是背诵语法,而是理解它背后的运行机制与典型应用场景。C#以类型安全、生态完善著称,其泛型与委托机制让代码更通用且复用性更强,而async/await异步模型则解决了界面卡顿与高并发读写的核心痛点。在工程实践中,数据读写与设备通信是两大高频需求:无论是通过ADO.NET读取Access或Excel,还是用SqlBulkCopy实现大批量数据入库,都要求开发者具备扎实的异常处理与资源管理能力。工业自动化领域常用的C#上位机开发,更将串口通信、多线程与UI更新融为一体,成为C#就业的主流方向之

weixin_29274337的博客 231

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C++/Java/C#实现2048游戏:对比核心算法与语言特性

数组是编程中最基础的数据结构之一,用于存储和操作有序的元素集合。其核心原理是通过索引快速访问元素,在内存中通常连续分配,这使得它在处理网格化数据(如游戏棋盘)时效率极高。掌握数组操作是理解更复杂数据结构(如列表、矩阵)和算法(如排序、搜索)的重要基础。在游戏开发、科学计算和数据处理等应用场景中,数组的二维形式常被用来表示地图、图像像素或棋盘状态。本文以经典的2048游戏为例,通过C++、Java和C#三种主流语言分别实现其核心逻辑,深入探讨了在**二维数组**上实现**移动合并算法**的具体方法,并对比了不

weixin_34274029的博客 366

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

2023十大最牛编程语言排行榜以及各语言的优缺点

我们掌握不了所有的编程语言,但我们掌握的语言越多,在未来的发展与可塑性上就越强,就越容易受到企业的青睐,如果是作为自由开发者的话,也就越会有客户和开发团队与我们合作。 考虑到这一点,希望各位小伙伴能规划好自己的学习计划,并开始一一学习,以成为某一细分领域的技术专家或者某个蓬勃发展领域的顶级专家。

易编橙 · 终身成长社群,相遇已是上上签! 4万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: 【Entity Framework Core事务处理终极指南】:掌握高性能事务编程的5大核心技巧
下一篇: 从新手到专家:C# 9模式匹配必须掌握的6大核心场景,错过等于降级编码
FuncFun
博客等级 码龄1年 133粉丝 1996原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值