C#面试十问

    • 1:C#中变量类型分为哪两种?它们的区别是什么?
    • 2:Class和Struct的区别?
    • 3:C#中类的修饰符和类成员的修饰符有哪些?
    • 4:面向对象的三个特征(特点)是什么?
    • 5:面向对象和面向过程的区别?
    • 6:什么是装箱和拆箱?
    • 7:什么是IOC?
    • 8:什么是OOP?
    • 9:什么是AOP?
    • 10:什么是DI?

1:C#中变量类型分为哪两种?它们的区别是什么?

  • C#中的变量类型可以分为值类型和引用类型。

值类型可以存储其实际的值,如整数、浮点数、布尔值等。

引用类型存储的是对象的引用,而不是实际的值。

值类型和引用类型的主要区别在于它们在内存中存储和访问数据的方式。值类型存储在栈上,而引用类型的对象存储在堆上

2:Class和Struct的区别?

  • struct 是值类型,而 class 是引用类型。这意味着在使用 struct 时,实际上是在使用它的副本,而在使用 class 时,实际上是在使用它的引用。
  • struct 不能继承其他类型,而 class 可以继承其他类型。
  • struct 默认有一个无参构造函数,但是 class 没有默认无参构造函数
  • struct 适用于小型、简单的数据类型,而 class 更适用于大型、复杂的数据类型。

3:C#中类的修饰符和类成员的修饰符有哪些?

image-20230902110620019

在C#中,类的修饰符可以分为以下几种:

  • public:表示类对外公开,可以从任何地方访问。
  • internal:表示类只能在当前程序集内访问,不能跨程序集访问。
  • protected:表示类只能在当前类和子类中访问。
  • private:表示类只能在当前类内部访问。

类成员的修饰符包括:

  1. public:表示成员对外公开,可以从任何地方访问。
  2. internal:表示成员只能在当前程序集内访问,不能跨程序集访问。
  3. protected:表示成员只能在当前类和子类中访问。
  4. private:表示成员只能在当前类内部访问。
  5. static:表示成员属于类型本身,而不是实例。可以通过类名直接访问,无需创建对象。
  6. sealed:表示成员或类是密封的,不能被继承或重写。
  7. abstract:表示成员或类是抽象的,只能在抽象类中定义,并且要求子类实现或重写该成员。
  8. virtual:表示成员可以被子类重写,允许在子类中进行自定义实现。
  9. override:表示成员在派生类中重写基类的实现。
  10. readonly:表示成员只能在声明时或构造函数中初始化,并且不能再被修改
  11. new:只能用于嵌套的类,表示对继承父类同名类型的隐藏.
  12. const:表示该成员为常量,值在编译时确定并且不能再修改。

4:面向对象的三个特征(特点)是什么?

OOP

  1. 封装(Encapsulation):封装是将数据和操作数据的方法封装在一起,形成一个类。通过封装,我们可以隐藏实现的细节,只暴露出对外提供的接口。这样做的好处是提高了代码的可维护性和复用性,并且可以控制对数据的访问权限。
  2. 继承(Inheritance):继承是指一个类可以从另一个类中派生出来,并且继承了父类的属性和方法。通过继承,子类可以直接使用父类的功能,并且可以根据需要进行扩展或修改。继承可以提高代码的重用性、可扩展性和可维护性。
  3. 多态(Polymorphism):多态是指一个对象可以表现出多种形态。在面向对象编程中,多态可以通过继承和接口实现。多态性可以提高代码的灵活性和可扩展性。通过多态,可以在不改变原有代码的情况下,方便地增加新的功能。

这三个特征是面向对象编程的核心概念,它们使得代码更加灵活、可维护和可扩展。通过封装、继承和多态,能够更好地组织和管理代码,提高开发效率和代码质量。

5:面向对象和面向过程的区别?

C#面向对象编程(OOP)和面向过程编程(POP)是两种不同的编程范式,其主要区别在于以下几个方面:

  1. 抽象程度:面向对象编程更加抽象和模块化,将程序组织成由对象组成的类层次结构。每个对象都有自己的属性和方法,并且可以通过消息传递进行交互。而面向过程编程更加注重步骤和流程,将程序组织成一系列的函数或过程。
  2. 数据和行为的关联:面向对象编程将数据和操作数据的方法封装在一起形成对象,通过对象的方法来操作数据。而面向过程编程将数据和操作数据的函数分离开来,通过参数传递数据给函数进行操作。
  3. 继承和多态:面向对象编程支持继承和多态,可以通过继承来扩展已有的类,并且可以通过多态来实现动态绑定。而面向过程编程没有继承和多态的概念,函数之间的调用是静态的。
  4. 可重用性和可扩展性:面向对象编程通过封装、继承和多态实现了代码的重用性和可扩展性,可以通过继承和多态来扩展已有的类并且重写父类的方法。而面向过程编程较为复杂,需要在函数中手动管理数据和流程,代码的重用性和可扩展性较低。

总的来说,面向对象编程更加注重对问题进行抽象和建模,通过封装、继承和多态实现代码的重用性和可扩展性;而面向过程编程更加注重步骤和流程,将问题分解成一系列的函数或过程。选择使用哪种编程范式取决于具体的需求和问题的特点。

6:什么是装箱和拆箱?

  • 装箱(Boxing):将值类型(Value Type)转换为引用类型(Reference Type)。
  • 拆箱(Unboxing):将引用类型转换为值类型的过程。

装箱是指将值类型的数据封装为一个对象,在堆上创建一个引用类型的实例,并将值类型的值复制到该实例中。装箱操作会导致数据从栈上复制到堆上,增加了额外的开销。

拆箱是指将装箱后的对象重新还原为值类型数据。它是通过将堆上的对象拷贝到栈上来完成的,同时将其转换为相应的值类型。拆箱操作也会增加额外的开销。

装箱和拆箱常用于值类型和引用类型之间的转换,例如将值类型存储到集合类(如ArrayList)中,或者从集合类中获取值类型数据。在进行装箱和拆箱操作时,需要注意性能问题,因为装箱和拆箱操作会产生额外的开销和内存分配。

为了避免装箱和拆箱带来的性能损耗,可以使用泛型集合类(如List)或者适当地设计代码结构,以避免不必要的装箱和拆箱操作。

7:什么是IOC?

在C#中,IOC代表控制反转(Inversion of Control)。IOC是一种软件设计原则,它通过将对象的创建、依赖解析和管理交给容器来实现。传统的编程模式中,对象之间的依赖关系由对象自己负责创建和管理,而在IOC中,这种依赖关系的控制权被反转,交由容器来负责。

IOC的核心思想是将应用程序的控制权从具体的实现类中解耦出来,通过将对象的依赖关系外部化到配置文件或者代码中,实现了组件之间的松耦合。这样一来,可以很容易地替换、扩展或者重用组件,提高了代码的可维护性和可测试性。

在C#中,常见的IOC容器有多种选择,例如:

  1. Unity:Unity是一个流行的开源IOC容器框架,它提供了依赖注入(Dependency Injection)的功能,并且支持构造函数注入、属性注入和方法注入等方式。
  2. Autofac:Autofac是另一个常用的IOC容器框架,它提供了强大的依赖注入功能,支持构造函数注入、属性注入、方法注入和模块化配置等。
  3. Ninject:Ninject是一个轻量级的IOC容器框架,它支持构造函数注入和属性注入,并且具有简单易用的语法。

8:什么是OOP?

OOP指的是面向对象编程(Object-Oriented Programming)。它是一种编程范式,通过将数据和操作封装到对象中来建模现实世界的概念和关系。

在C#中,OOP的基本概念包括以下几个方面:

  1. 类(Class):类是抽象数据类型的模板,用于描述对象的属性(字段)和行为(方法)。它定义了对象的结构和行为,并提供了创建对象的蓝图。
  2. 对象(Object):对象是类的实例,是内存中实际存在的数据。每个对象都有自己的状态(属性值)和行为(方法调用),并与其他对象进行交互。
  3. 封装(Encapsulation):封装是一种将数据和相关行为组合在一起的机制。通过将数据和方法封装到类中,可以隐藏内部实现细节,只暴露必要的接口给外部使用。
  4. 继承(Inheritance):继承是一种通过从现有类派生出新类的机制。派生类可以继承父类的属性和方法,同时还可以添加自己的特定功能。继承提供了代码重用和层次化组织的方式。
  5. 多态(Polymorphism):多态性允许不同类型的对象对同一个消息做出不同的响应。它使得可以使用通用的接口来操作不同类型的对象,提高了代码的灵活性和可扩展性。

通过使用OOP的概念和技术,可以将复杂的问题分解为更小的模块,并通过定义类和对象来组织和管理代码。这样可以提高代码的可读性、可维护性和可重用性,并使开发人员更加专注于问题的领域建模和业务逻辑的实现。

9:什么是AOP?

AOP指的是面向切面编程(Aspect-Oriented Programming)。它是一种编程范式,通过将横切关注点(Cross-Cutting Concerns)从主要业务逻辑中分离出来,以模块化的方式进行处理。

在C#中,AOP可以通过以下方式实现:

  1. 切面(Aspect):切面是横切关注点的具体实现。它包含了一系列的通用行为或功能,如日志记录、异常处理、事务管理等。每个切面都可以在不同的地方和时间点被应用到目标代码中。
  2. 连接点(Join Point):连接点是在执行过程中可以应用一个切面的特定位置。例如,方法的调用、属性的访问、异常抛出等都可以作为连接点。
  3. 通知(Advice):通知是切面在连接点执行前、执行后或出现异常时所执行的代码。它定义了切面在何时、何地和如何被应用到目标代码中。
  4. 切入点(Pointcut):切入点定义了哪些连接点将被应用一个或多个切面。通过指定切入点,可以选择性地将切面应用到目标代码中的特定位置。
  5. 织入(Weaving):织入是将切面应用到目标代码中的过程。它可以在编译时、运行时或加载时进行。织入可以通过静态代理、动态代理、IL重写等方式实现。

使用AOP的好处包括:

  • 提高代码可读性和可维护性:将横切关注点与主要业务逻辑分离,使代码更加清晰和易于理解。
  • 降低代码耦合度:通过切面的模块化方式处理通用行为,减少了代码间的直接依赖。
  • 重用性:可以将相同的切面应用到不同的目标代码中,提高了代码的重用性。
  • 可扩展性:通过添加新的切面,可以在不修改原始代码的情况下增加新的功能。

在C#中,可以使用第三方库如PostSharp来实现AOP。这些库提供了注解或配置的方式来定义切面和连接点,并在编译或运行时进行织入。

10:什么是DI?

DI指的是依赖注入(Dependency Injection)。它是一种设计模式,用于解耦组件之间的依赖关系,提高代码的可测试性、可维护性和可扩展性。

在C#中,依赖通常指一个对象需要依赖另一个对象才能完成某个功能。传统的方式是在使用对象之前,手动创建和管理其依赖的对象实例。而使用依赖注入,可以将对象的依赖关系委托给外部容器来管理。

依赖注入有三种主要的方式:

  1. 构造函数注入(Constructor Injection):通过构造函数将依赖对象作为参数传递进来,并在对象创建时进行注入。例如:
public class MyClass
{private readonly IDependency _dependency;public MyClass(IDependency dependency){_dependency = dependency;}
}

​ 2.属性注入(Property Injection):通过公共属性将依赖对象注入到目标对象中。例如:

public class MyClass
{public IDependency Dependency { get; set; }
}

3.方法注入(Method Injection):通过方法参数将依赖对象注入到目标对象中。例如:

public class MyClass
{public void SetDependency(IDependency dependency){// ...}
}

通过使用依赖注入,可以实现以下好处:

  • 解耦依赖关系:将对象的创建和管理权交给外部容器,减少了对象之间的直接依赖。

  • 提高代码可测试性:可以轻松地通过传递模拟的依赖对象来进行单元测试,而无需依赖真实对象。

  • 简化代码维护:将依赖关系从代码中解耦出来,使得代码更加清晰、简洁和可维护。

  • 支持可扩展性:通过配置不同的依赖对象实现,可以方便地更换或增加新的实现。

  • 解耦依赖关系:将对象的创建和管理权交给外部容器,减少了对象之间的直接依赖。

  • 提高代码可测试性:可以轻松地通过传递模拟的依赖对象来进行单元测试,而无需依赖真实对象。

  • 简化代码维护:将依赖关系从代码中解耦出来,使得代码更加清晰、简洁和可维护。

  • 支持可扩展性:通过配置不同的依赖对象实现,可以方便地更换或增加新的实现。

在C#中,可以使用第三方库如Autofac、Unity、Ninject等来实现依赖注入。这些库提供了容器和依赖解析器,用于管理对象的创建和注入。

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

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

相关文章

MySQL MHA高可用配置及故障切换

目录 MHA MHA 的组成 MHA 的特点 MHA工作原理 故障切换时MHA会做的动作 MHA注意问题 搭建 MySQL MHA 修改Mysql主配置文件 Master 节点 Slave1 节点 Slave2 节点 创建软连接 配置 mysql 一主两从 安装MHA所有组件 配置无密码认证 manager 节点 master节点 slave…

【java】【项目实战】[外卖九]项目优化(缓存)

目录 一、问题说明 二、环境搭建 2.1 Git管理代码 2.1.1 创建本地仓库 2.1.2 创建远程仓库 2.1.3 创建分支--》推送到远程仓库 2.2 maven坐标 2.3 配置文件application.yml 2.4 配置类RedisConfig 三、缓存短信验证码 3.1 实现思路 3.2 代码改造 3.2.1 UserContro…

时序预测 | MATLAB实现EEMD-SSA-LSTM、EEMD-LSTM、SSA-LSTM、LSTM时间序列预测对比

时序预测 | MATLAB实现EEMD-SSA-LSTM、EEMD-LSTM、SSA-LSTM、LSTM时间序列预测对比 目录 时序预测 | MATLAB实现EEMD-SSA-LSTM、EEMD-LSTM、SSA-LSTM、LSTM时间序列预测对比预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 时序预测 | MATLAB实现EEMD-SSA-LSTM、E…

《向量数据库指南》——腾讯云向量数据库(Tencent Cloud VectorDB) SDK 正式开源

腾讯云向量数据库 SDK 宣布正式开源。根据介绍,腾讯云向量数据库(Tencent Cloud VectorDB)的 Python SDK 与 Java SDK 是基于数据库设计模型,遵循 HTTP 协议,将 API 封装成易于使用的 Python 与 Java 函数或类,为开发者提供了更加友好、更加便捷的数据库使用和管理方式。…

数据分享|R语言用lme4多层次(混合效应)广义线性模型(GLM),逻辑回归分析教育留级调查数据...

全文链接:http://tecdat.cn/?p22813 本教程为读者提供了使用频率学派的广义线性模型(GLM)的基本介绍。具体来说,本教程重点介绍逻辑回归在二元结果和计数/比例结果情况下的使用,以及模型评估的方法(点击文末“阅读原文…

Java版企业电子采购招标系统源码

一、立项管理 1、招标立项申请 功能点:招标类项目立项申请入口,用户可以保存为草稿,提交。 2、非招标立项申请 功能点:非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点:对草稿进行编辑&#x…

【Unity3D赛车游戏优化篇】【九】Unity中如何让汽车丝滑漂移?

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

软件测试人需要掌握的测试知识架构体系(上)

软件计划与可行性研究(问题定义、可行性研究);需求分析;软件设计(概要设计、详细设计);编码;软件测试;运行与维护。 一、软件的生命周期(SDLC) 1、生存周期划分 各阶段…

软路由ip的优势与劣势:了解其适用场景和限制

在网络技术的快速发展中,软路由IP作为一种灵活且功能强大的网络设备,越来越受到人们的关注。然而,正如任何技术一样,软路由IP也有其优势和劣势。本文将深入探讨软路由IP的优势、劣势以及其适用场景和限制,帮助你更好地…

字节二面:如果高性能渲染十万条数据?

前言 最近博主在字节面试中遇到这样一个面试题,这个问题也是前端面试的高频问题,作为一名前端开发工程师,我们虽然可能很少会遇到后端返回十万条数据的情况,但是了解掌握如何处理这种情况,能让你对前端性能优化有更深的…

Redis 缓存预热+缓存雪崩+缓存击穿+缓存穿透

面试题: 缓存预热、雪萌、穿透、击穿分别是什么?你遇到过那几个情况?缓存预热你是怎么做的?如何造免或者减少缓存雪崩?穿透和击穿有什么区别?他两是一个意思还是载然不同?穿适和击穿你有什么解…

uniApp webview 中调用底座蓝牙打印功能异常

背景: 使用uniApp, 安卓底座 webView 方式开发; 调用方式采用H5 向 底座发送消息, 底座判断消息类型, 然后连接打印机进行打印; 内容通过指令集方式传递给打印机; 过程当中发现部分标签可以正常打印, 但又有部分不行,打印机没反应, 也没有报错; 原因分析: 对比标签内容…

leetcode 141. 环形链表

2023.9.5 环形链表相遇问题,可以定义一对快慢指针,快指针每次向前走两步,慢指针每次向前走一步,如果链表是环形的最终一定会相遇。 代码如下: /*** Definition for singly-linked list.* struct ListNode {* int…

Unity 顶点vertices,uv,与图片贴图,与mesh

mesh就是组成3d物体的三角形们。 mesh由顶点组成的三角形组成,三角形的大小 并不 需要一样,由顶点之间的位置决定。 mesh可以是一个或者多个面。 贴图的原点在左下角,uv是贴图的坐标,数量和顶点数一样(不是100%确定…

unity tolua热更新框架教程(2)

Lua启动流程 增加脚本luamain,继承luaclient 建立第一个场景GameMain,在对象GameMain挂载脚本LuaMain,启动场景 看到打印,lua被成功加载 lua入口及调用堆栈 这里会执行main.lua文件的main函数 C#接口导出 在此处配置C#导出的代码 …

CLion远程Linux开发环境搭建及找不到Linux头文件的解决方法

CLion远程开发环境搭建及找不到Linux头文件的解决方法 文章目录 CLion远程开发环境搭建及找不到Linux头文件的解决方法1.前言2.远程开发3.远程编译4.远程调试5.远程开发Linux头文件找不到&#xff08;比如pthread.h、<sys/socket.h>&#xff09;6.最后 1.前言 在某些时候…

苹果“嘴硬”?下载超出预期,否认开发者对 Vision Pro 兴趣不高

据报道&#xff0c;苹果于上个月在全球多个城市开设了Vision Pro开发者实验室&#xff0c;旨在让开发者尽早体验并研发这款令人期待的头显技术。这一为期一天的实验室活动邀请了一些开发人员前来测试和上手Vision Pro头显&#xff0c;并亲身体验其应用的真实效果。 在活动中&am…

【zookeeper】zookeeper的shell操作

Zookeeper的shell操作 本章节将分享一些zookeeper客服端的一些命令&#xff0c;实验操作有助于理解zookeeper的数据结构。 Zookeeper命令工具 在前一章的基础上&#xff0c;在启动Zookeeper服务之后&#xff0c;输入以下命令&#xff0c;连接到Zookeeper服务。连接成功之后&…

【ROS】例说mapserver静态地图参数(对照Rviz、Gazebo环境)

文章目录 例说mapserver静态地图参数1. Rviz中显示的地图2. mapserver保存地图详解3. 补充实验 例说mapserver静态地图参数 1. Rviz中显示的地图 在建图过程中&#xff0c;rviz会显示建图的实时情况&#xff0c;其输出来自于SLAM&#xff0c;浅蓝色区域为地图大小&#xff0c…

SeaTunnel扩展Transform插件,自定义转换插件

代码结构 在seatunnel-transforms-v2中新建数据包名&#xff0c;新建XXXTransform&#xff0c;XXXTransformConfig&#xff0c;XXXTransformFactory三个类 自定义转换插件功能说明 这是个适配KafkaSource的转换插件&#xff0c;接收到的原文格式为&#xff1a; {"path&…