C#面试十问

news2024/10/7 8:28:03

    • 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.coloradmin.cn/o/963336.html

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

相关文章

随机游走任务中时间差分(0)和常数α蒙特卡罗方法的比较

一、说明 在这篇文章中,我们讨论了常α MC 方法和 TD(0) 方法之间的区别,并比较了它们在随机游走任务中的性能。TD方法在本文的所有测试中都覆盖了MC方法,因此将TD视为强化学习任务的方法是更可取的选择。 二、方法库介…

算法通关村第10关【白银】| 数组中第k大的数

思路:快速排序,每次都定位一个元素,找指定位置的元素还得有序,很容易就想到快排思想 小优化之处就是当前归位元素比目标元素小就继续往右,比目标元素大就往左,相等就返回 class Solution {public int fin…

【算法竞赛宝典】稀疏数组

【算法竞赛宝典】稀疏数组 题目描述代码展示 题目描述 代码展示 random.cpp #include <iostream>using namespace std;int main() {freopen("zip5.in", "w", stdout);int n, m;cin >> n >> m;cout << n << << m <…

小白入门python

建议用vscode进行代码学习 vscode下载地址:Download Visual Studio Code - Mac, Linux, Windows 左侧点击扩展安装python,右下角选择python版本&#xff0c;记得配置系统环境变量&#xff0c;python在系统(cmd)的版本由环境变量优先级决定,在编程软件中由自己选择解释器

4.1 链式栈StackT

C关键词&#xff1a;内部类/模板类/头插 C自学精简教程 目录(必读) C数据结构与算法实现&#xff08;目录&#xff09; 栈的内存结构 空栈&#xff1a; 有一个元素的栈&#xff1a; 多个元素的栈&#xff1a; 成员函数说明 0 clear 清空栈 clear 函数负责将栈的对内存释放…

为什么磁盘满可能导致cpu使用率飙升

先说原因 因为当文件在安装和卸载的时候&#xff0c;会使硬盘中的数据排列非常分散或者断断续续的&#xff0c;让电脑在查找时速度变慢&#xff0c;就造成大量的使用CPU资源。这时就需要更换CPU。 案例 事件描述 公司监控系统事件报警某个应用的磁盘满了。通过后端执行命令发现…

linux编程--进程--进程相关概念

5个问题了解进程&#xff1a; 什么是程序&#xff0c;什么是进程&#xff0c;有什么区别如何查看系统中有哪些进程&#xff1f;什么是进程标识符&#xff1f;什么叫父进程&#xff0c;什么叫子进程&#xff1f;c程序的存储空间是如何分配的&#xff1f; 1.程序是静态的概念&a…

【力扣】96. 不同的二叉搜索树 <动态规划>

【力扣】96. 不同的二叉搜索树 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5 示例 2&#xff1a; 输入&am…

算法竞赛备赛之数学知识训练提升,暑期集训营培训

1.质数 在大于1的整数&#xff0c;如果质包含1和本身这两个约数&#xff0c;就称之为素数/质数。 1.质数的判定&#xff08;试除法&#xff09; 优化后的&#xff1a; #include<iostream> #include<algorithm> ​ using namespace std; ​ bool is_prime(int n…

Multisim14.0仿真(五)三角波发生器

一、仿真原理图&#xff1a; 二、仿真效果&#xff1a;

微服务架构|go-zero 的自适应熔断器

原文链接&#xff1a; go-zero 的自适应熔断器 上篇文章我们介绍了微服务的限流&#xff0c;详细分析了计数器限流和令牌桶限流算法&#xff0c;这篇文章来说说熔断。 熔断和限流还不太一样&#xff0c;限流是控制请求速率&#xff0c;只要还能承受&#xff0c;那么都会处理&…

Meta AI的Nougat能够将数学表达式从PDF文件转换为机器可读文本

大多数科学知识通常以可移植文档格式&#xff08;PDF&#xff09;的形式存储&#xff0c;这也是互联网上第二突出的数据格式。然而&#xff0c;从这种格式中提取信息或将其转换为机器可读的文本具有挑战性&#xff0c;尤其是在涉及数学表达式时。 为了解决这个问题&#xff0c…

Sharding-JDBC(九)5.3.0版本,实现按月分表、自动建表、自动刷新节点

目录 一、简介二、Maven依赖三、配置文件application.ymlsharding.yaml 四、代码实现1.自动建表、自动刷新节点思路2.创建表结构3.TimeShardingAlgorithm.java 分片算法类4.ShardingAlgorithmTool.java 分片工具类5.ShardingTablesLoadRunner.java 初始化缓存类6.SpringUtil.ja…

xss前十二关靶场练习

目录 一、xss原理和分类 1.原理 2.分类&#xff1a;xss分为存储型和反射型以及dom型 &#xff08;1&#xff09;反射性 &#xff08;2&#xff09;存储型 &#xff08;3&#xff09;dom型 二、靶场关卡练习​编辑 1.第一关 2.第二关 3.第三关 4.第四关 5.第五关 6…

flutter plugins插件【三】【Flutter Intl】

3、 Flutter Intl 多语言国际化 在Android Studio中菜单Tools找到flutter intl创建多语言配置。 创建后会在pubspec.yaml出现 flutter_intl:enabled: true 在工程的lib会生成l10n与generated文件夹 l10n包含 intl_en.arb intl_zn.arb 我们在intl_en.arb添加 { home: &quo…

常见的存储结构

分析&回答 本文只作为了解&#xff0c;让大家理解 B数跟透传&#xff0c;可以不刷哈。 常见的存储结构&#xff1a; 我们计算机的主存基本都是随机访问存储器(Random-Access Memory&#xff0c;RAM)&#xff0c;他分为两类&#xff1a;静态随机访问存储器&#xff08;SRA…

iPhone 15 Ultra都要来啦?顶配8GB 内存、2TB存储,满足任何想象

据相关媒体透露&#xff0c;苹果计划在今年9月推出全新的iPhone 15系列。除了已确认的iPhone 15 Pro和iPhone 15 Pro Max之外&#xff0c;还有一款名为iPhone 15 Ultra至尊版的机型将会问世。 这款iPhone 15 Ultra将成为苹果旗舰系列的巅峰之作&#xff0c;预计将配备更高配置和…

【算法竞赛宝典】语言之争

【算法竞赛宝典】语言之争 题目描述代码展示 题目描述 代码展示 //语言之争 #include<fstream> #include<string>using namespace std;ifstream cin("language.in"); ofstream cout("language.out");string a; int n;int main() {int i;bool …

快速建设数字工厂管理系统,需要做好哪些准备

随着工业4.0的推进&#xff0c;数字工厂管理系统已经在全球范围内得到了广泛的应用。在中国&#xff0c;许多制造业企业也逐步认识到数字化转型的重要性&#xff0c;开始积极探索和实施数字工厂管理系统。那么&#xff0c;在快速建设数字工厂管理系统的过程中&#xff0c;需要做…

SpringBoot 使用MyBatis分页插件实现分页功能

SpringBoot 使用MyBatis分页插件实现分页功能 1、集成pagehelper2、配置pagehelper3、编写代码4、分页效果 案例地址&#xff1a; https://gitee.com/vinci99/paging-pagehelper-demo/tree/master 1、集成pagehelper <!-- 集成pagehelper --> <dependency><gr…