1. 表达题:字段和属性的区别
在类中包含get和set方法的是属性,不包含的是字段。在进行窗体传值操作时因为传入的内容一般不需要进行修改所以一般选择使用字段来接收。属性是对字段的包装器,它本质上编译成get和set两个方法,在访问时需要添加验证逻辑或对内容进行修改时选择属性。
2. 表达题:重载和重写的区别
重载是在同一个类中定义多个同名方法,但参数的个数、类型或顺序不同,和返回类型无关。重载发生在编译时,编译器根据传入参数的类型和数量决定调用哪个版本,属于编译时多态。重写是子类使用override关键字重新实现父类标记为virtual或abstract的方法,方法签名必须完全一致,不能改变参数或返回类型。
3. 表达题:常见的架构模式有哪些(提示:详细说一下MVC和MVVM)
常见的架构模式包括三层架构、MVP、MVC和MVVM。
MVC分为Model、View和Controller三部分。Model负责数据和业务逻辑,View负责界面展示,Controller接收用户输入并协调Model和View,Controller更新Model后刷新View,View通常是被动展示。
MVVM分为Model、View和ViewModel,Model同样负责数据业务逻辑,View负责界面,ViewModel是View的抽象,暴露可绑定的属性和命令。
1.日志的5个级别:Debug、Info、Warn、Error、Fatal
2.INI 后缀是初始化配置文件
3.端口名称,波特率,数据位,奇偶校验,停止位
4.文本文件的后缀,用来存储表格数据(如Excel表格)
问题1:结构体和类的区别
结构体是值类型,分配在栈上或内联在堆中,赋值时复制整个数据。类是引用类型,分配在托管堆上,赋值时复制引用地址。结构体不支持继承但可以实现接口,类支持单继承和接口实现。结构体不能有无参构造,必须在创建时完全初始化,类可以有显式无参构造。结构体适合轻量级不可变数据,类适合需要共享和修改的复杂对象。
问题2:ref和out的区别
ref和out都是按引用传递参数,传递的是变量的内存地址。区别在于ref要求传入前变量必须已经初始化,而out不需要初始化传入,但方法内部必须在返回前对out参数赋值。ref用于需要读取并修改传入变量的场景,out用于方法需要返回多个值且其中某些值可能是未初始化的场景。
问题3:委托的关键字有哪些
第一个是delegate关键字,用于声明自定义委托类型。第二个是Func关键字,代表有返回值且参数可变的泛型委托。第三个是Action关键字,代表无返回值且参数可变的泛型委托。第四个是event关键字,它基于委托实现事件封装,限制外部只能订阅和取消订阅。第五个是lambda运算符,用于定义简洁的内联委托实例。
问题4:委托怎么调用
委托调用分同步调用和异步调用。同步调用直接用委托变量加括号执行,当前线程会等待方法完成才继续,方式简单直观。异步调用使用BeginInvoke和EndInvoke方法,委托会在线程池上执行,调用方线程不阻塞,适用于耗时操作。区别在于同步调用简化了流程但会阻塞,异步调用不阻塞但需要管理回调或等待结果。
问题5:你对单继承和多继承怎么理解
单继承指一个类只能直接继承一个基类,优点是类层次清晰,避免了菱形继承和命名冲突问题。多继承是一个类可以继承多个基类,C++支持但容易引起歧义。C#不支持类的多继承,但可以通过接口实现多重行为组合,接口不包含实现,所以不存在冲突,既能达到类似多继承的效果又保持了简单性。
问题6:哪些方法可以被重写
只有标记为virtual、abstract或override的方法可以被重写。virtual方法提供默认实现,派生类可以选择重写。abstract方法没有实现,强制派生类必须重写。override用于在派生类中重写基类的虚方法或抽象方法。静态方法和私有方法不能被重写,因为静态方法属于类型不参与多态,私有方法对派生类不可见。
问题7:static加和不加有什么区别
static修饰的成员属于类型本身而不是实例,访问时不需要创建对象,直接用类名加成员名调用。非static成员属于对象实例,必须通过对象访问。静态字段在内存中只存在一份,所有实例共享,非静态字段每个对象有独立副本。静态方法不能访问非静态成员,不能使用this关键字,而非静态方法可以访问静态成员。
问题8:浅谈你对GC的理解
GC是.NET的自动内存管理器,负责回收不再使用的托管堆内存。它通过分代假设工作,第0代存放新对象,第1代是过渡,第2代存放长生命周期对象。GC在内存压力不足时触发,会暂停所有托管线程,标记所有存活对象,然后压缩堆空间。GC的优点是避免手动释放内存,减少内存泄漏,但缺点是回收时会出现不可预测的卡顿,频繁分配大对象会触发第2代回收影响性能。
问题9:匿名函数是什么
匿名函数是没有名字的内联代码块,可以作为委托参数传递或赋值给委托变量。定义匿名函数有两种方式:匿名方法用delegate关键字加参数列表和代码块,Lambda表达式用=>运算符,左边参数右边表达式或语句块。Lambda更简洁,支持类型推断,可以捕获外部变量形成闭包。
连接相机的准备工作
1.相机的接口有哪些?
USB(短慢),Gige(网线)(长适中),Cameralink(长快)
2.硬件组成:相机、镜头、光源、工控机、机械机构
3.网络配置:
IP:相机IP的前三位必须与工控机的IP前三位保持一致,第四位必须不一致。
4.如何连接多个相机?
多个相机的网线连接到交换机/路由器
5.相机取像失败可能的原因?
接口松动
网络波动(IP发生变动)
传输速度有问题(巨型帧不为9000)
6.相机连接后的可调参数
曝光:时间(毫秒、微秒),曝光时间需要具体计算
亮度
对比度
触发模式:软触发/硬触发
分辨率
增益:不建议调,可以让图像变亮,会引入噪声
7.镜头的可调参数
光圈环:圈越大,进光量越多,图像越亮,景深越浅(与F成正比)
焦距环:调整成像的清晰度
8.C#与VP联合编程时如何连接相机
方案一:选择CogAcqFifoTool工具,配置好后另存为vpp文件。
方案二:帧抓取器(纯代码),可控但麻烦
方案三:官方的SDK(软件开发工具包),不好改
9.造成内存泄漏的场景有哪些
a.委托订阅后未释放
b.定时器开启后未关闭
c.子线程代码未结束
10.定义委托/代理关键字
delegate:定义委托关键字比较复杂
Action:无返回值
Func:有返回值
:返回布尔值
11.调用委托的方式有哪些
直接像方法一样调用dowhat();不推荐空时会报错
Dowhat?.Invoke(); 阻塞
Dowhat?.BeginInvoke(); 非阻塞
12.callback是什么
回调
回调的实现?通过委托实现
13.事件总线的使用步骤
发布
订阅
A->B A发布、B订阅
a.如何发布:SimpleEventBus
14.C#中的高级技术(开发岗必会)
反射
特性:类继承自Attribute就叫特性
15.子线程更新主线程UI
报错:System.InvalidOperationException:"线程间操作无效: 从不是创建控件"tbrButtons"的线程访问它。
报错原因:子线程不允许更新主线程UI
解决方法:委托
16.构造方法和析构方法
构造方法:初始化字段、打开文件、连接数据库...只做一次
析构方法:清空字段、关闭文件、断开数据库...只做一次
17.事件总线第三方工具:wdleventbus
发布
cs
EventBus.Publish("good", ctb);
订阅
cs
public VppEditF()
{
InitializeComponent();
EventBus.Subscribe<CogToolBlock>(good);
}
private void good(EventData<CogToolBlock> data)
{
cogToolBlockEditV21.Subject = data.Data;
}
事件总线用到的设计模式有哪些?
观察者模式、中介者模式、单例模式...
18.Async异步sync同步
19.相机的选型参数有哪些?
灰度相机/彩色相机
面阵相机/线阵相机
CCD/CMOS
分辨率=视野范围宽/精度 * 视野范围高/精度
接口:USB,GIGE,Cameralink
快门:全局快门:适合动态项目
卷帘快门:适合静态项目
20. 几种数据存储适用方面
Ini:适配存配置
JSON:适合一次性的读写数据
CSV:适合存检测结果
数据库:适合存储大量数据
21.路径的拼接符号
/ 出现在linux操作系统
\ 一般出现在win操作系统
22.正则表达式Regex
常用的正则符号:
\d 0-9 表示0-9的数字 ^表示以xx开头 $表示以xx结尾
a-z表示a-z的字母 {3}重复3次 {3,5}表示至少3次,至多5次
.*?
正则的应用场景:校验密码强度Match;提取目标数据Matches;关键字屏蔽Replace;字符串分割Split。
使用步骤:创建正则,调用对应方法
23.抽象类怎么实例化/接口怎么实例化?
这两种都不能进行实例化,一般充当父类,用来规范子类。
24.VP联合编程是怎么做的?
编写ToolBlock算法文件(重点),保存为.vpp文件。在C#中通过反序列化技术将vpp转化为ToolBlock实例。输入->运行->输出
25.时间戳是什么?
时间戳是一个用于标识某一时刻的数值或字符信息,在计算机领域通常指从1970年1月1日0时0分0秒(UTC时间)起,到当前时刻所经过的秒数或毫秒数。
26.反射与特性
a.反射的核心就是获取类型
获得一个实例/类的真正类型
实例:xxx.GetType()
类:typeof(xxx)
反射的作用:能够修改任意的属性或字段,能够调用任意方法。
27.常见的编码格式
GB=国标
GBK
GB18030
GB2312
UTF-8 全球通用编码格式
Unicode
27.委托和事件
委托的订阅可以+=或=,但事件的订阅不能使用=;委托的调用在类内和类外都能调用,事件只能在类内调用;
委托关键字:delegate,Action,Func
事件关键字:event
28.串口的使用总结
串口通信参数:串口名称、波特率、数据位、停止位、校验位。
参数是怎么设置的? 由电气工程师告诉具体参数,我来调通。
串口的通信协议是什么?RS485/RS232
串口的常用功能?发送和接收
29.图表(Echart)展示
柱状图、饼状图、折线图、雷达图
30. 网络七层协议从上到下分别是什么
自上而下的顺序是:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
40. 传输层协议有哪些?TCP和UDP的区别有哪些?
传输层主要有两个核心协议:TCP和UDP。此外还有SCTP流控制传输协议,但应用较少。
TCP的特点:
面向连接:TCP在通信前需要通过"三次握手"建立连接,确保双方准备就绪。
可靠传输:TCP提供确认机制和超时重传,确保数据完整性和顺序性。
流量控制:通过滑动窗口机制控制数据发送速率,避免网络拥塞。
数据有序性:TCP通过序号确保数据按顺序到达。
适用场景:适用于对数据传输可靠性要求高的场景,如文件传输、邮件服务和网页浏览。
UDP的特点:
无连接:UDP无需建立连接,直接发送数据,减少了通信延迟。
不可靠传输:UDP不提供确认和重传机制,数据可能丢失或乱序。
轻量级:UDP头部开销小,传输效率高。
适用场景:适用于对实时性要求高但对可靠性要求低的场景,如视频会议、在线游戏和实时广播。
主要区别:
连接方式:TCP是面向连接的,UDP是无连接的。
可靠性:TCP提供可靠传输,UDP不保证数据可靠性。
速度:UDP传输速度快,适合实时应用;TCP因可靠性机制较慢。
数据顺序:TCP保证数据按顺序到达,UDP不保证顺序
41.日志管理
日志:存储项目发生的所有事情
数据格式:时间+操作+结果
日志文件的后缀:***.log
作用:通过分析日志有助于项目bug的修复;有助于历史的回溯
日志的级别:Info信息、Warning警告、Debug调试、Error错误、Fatal致命错误
日志工具:log4net,使用时需要进行配置
- 导入工具类
- 安装第三方工具
- 添加配置文件log4net.config
- 将log4net.config的复制模式修改为始终复制
- 在AssemblyInfo.cs中指定配置
- 在需要生成日志的位置调用
42.Socket通讯
Socket:套接字
Socket通讯包含TCP通讯、UDP通讯
应用层:http:超文本传输协议
https:超文本传输协议(安全)
FTP:文件传输协议
http的请求方法有哪些?
1、Get查:浏览网页
2、post增:上传头像、注册账号
3、put改、
4、delete删
http的请求的状态码?1xx,2xx表示OK,302表示重定向,404客户端错误,500服务端错误
网络七层协议:1.应用层
2.表示层
3.会话层
4.传输层:TCP:传输控制协议
UDP:用户数据报协议
TCP和UDP的区别:TCP面向连接UDP无连接;UDP速度快,TCP慢;TCP可靠性好,UDP不一定可靠;
TCP的三层握手和四次挥手
三次握手用于连接:a2b我想连接,b2a你可以连接,a2b现在进行连接
四次挥手用于断开:a2b我想断开,b2a等我检查数据传输是否结束,b2a传输完毕可以断开,a2b现在断开
TCP的两个端:客户端Client
服务端Server几乎不关闭
客户端连接服务端的参数:IP地址:客户端IP和服务端一致
端口:客户端端口与服务端端口一致
客户端和服务端的对应关系:1个客户端对应1个服务端,一个服务端对应多个客户端。
端口范围:0到65535;可用端口范围建议:8000以上
MySQL:3306; http网站端口:80;https网站端口443
5.网络层
6.数据链路层、
7.物理层。
43.TCP意外断开怎么重连?
心跳包技术:定时向服务端连接
44.csv的文件存储
csv是什么?本质是一个表格文件,数据和数据之间用逗号隔开