常用的.NET面试问题 - 2

简介:   这里我们接着聊一聊有关.NET面试问题,本章我们将讨论有关.NET类型的问题,并以一种简单的方式给出答案。  问题1:值和引用类型是什么?另外,用实例解释一下装箱和拆箱?  答:  值类型是直接存储数据的类型,值类型存储在堆栈中。大多数基本类型,如int、float和char都是值类型的例子。另一方面,引用类型将引用或内存地址存储在其中,并将相应的数据存储在堆中,引用类型的例子包括类、字符串、数组和对象。装箱是将值类型转换为对象类型时相关的术语,而拆箱只是将对象类型转换为值类型。装箱在托管堆内存中创建一个新对象并复制数据,而拆箱则相反。装箱是隐式的,而拆箱是显式的。如下所示,

  这里我们接着聊一聊有关.NET面试问题,本章我们将讨论有关.NET类型的问题,并以一种简单的方式给出答案。

  问题1:值和引用类型是什么?另外,用实例解释一下装箱和拆箱?

  答:

  值类型是直接存储数据的类型,值类型存储在堆栈中。大多数基本类型,如int、float和char都是值类型的例子。另一方面,引用类型将引用或内存地址存储在其中,并将相应的数据存储在堆中,引用类型的例子包括类、字符串、数组和对象。装箱是将值类型转换为对象类型时相关的术语,而拆箱只是将对象类型转换为值类型。装箱在托管堆内存中创建一个新对象并复制数据,而拆箱则相反。装箱是隐式的,而拆箱是显式的。如下所示,当将int转换为object时进行装箱,当将object转换为object时进行解装箱:

  int a = 5;

  object obj = a; //装箱

  a = (int) obj; //拆箱

  问题2:常量和只读变量有什么不同?用一个例子来解释?

  答:

  常量是隐式静态的,而只读变量既可以是实例类型,也可以是静态的,对常量进行显式静态声明将抛出错误。常量需要在设计时声明它们的值。只读变量在运行时计算。常量既可以在类级别声明,也可以在方法内部声明。只读变量既可以在类级别声明,也可以在运行时的构造函数中声明,但不能在方法内部声明。常量仅用于值类型和字符串字面值。只读变量可以同时保存值类型和引用类型。如果常量的值不会改变,则应该使用常量。只有在运行时值可能发生变化时,才应该使用只读变量。对于以后对常量值的任何更改,都需要编译当前程序集和引用的程序集,而对于以后对只读值的任何更改,只需要编译当前程序集,引用的程序集将自动更新。例如:

  ////常量

  public const string EmployeeTableNamev //Error

  public static const string EmployeeTableNamev = "Employee"; //Error

  public const string EmployeeTableNamev = "Employee"; //Correct

  ////只读

  public readonly string EmployeeTableNamev; //Correct

  public MyClass()

  {

  EmployeeTableNamev = "Employee";

  }

  public readonly string EmployeeTableNamev = "Employee"; //Correct

  public static readonly stringEmployeeTableNamev = "Employee"; //Correct

  问题3:var、object和dynamic type有什么相似和不同之处?

  答:

  在.NET 3.0中引入的Var可以存储各种数据,但在声明时需要初始化。Object是所有.NET类型的基类,因此也可以存储所有类型的数据。在.NET 4.0中引入的Dynamicwhich在内部使用一个对象来存储各种数据。Var通过在设计时隐式转换为其原始类型来强制类型安全,而在对象和动态的情况下,类型转换在运行时发生,代价是装箱/拆箱操作。Var不能用于传递方法参数和作为返回类型,而可以使用object和dynamic。当转换回原始类型时,Var和动态类型不需要显式强制转换,而object则需要。现在,var经常被使用,因为它是强类型的,同时是可读的。当关于数据类型的信息很少时,应该使用对象。Dynamic应该只在使用反射或COM APIs时使用。示例如下:

  var a; //Error

  var b = 3; //Correct, internally it converts to int b = 3;

  int c = b;//Correct, implicitly conversion

  object a; //Correct

  object b = 7;//Correct

  int c = b;//Error, cannot implicitly convert type object to int

  int d = (int) b; //Correct

  dynamic a;//Correct

  dynamic b = 7;//Correct

  int c = b;//Correct

  问题4:字符串和字符串生成器之间有什么区别?

  一个字符串(命名空间:System.String)是表示文本的Unicode字符的顺序集合。字符串对象是不可变(只读)的,是System的顺序集合,表示字符串的Char对象。二手拍卖字符串对象在内存中的最大大小为2gb(约10亿字符)。

  虽然字符串是引用类型,但相等操作符(==和!=)的定义是用来比较字符串对象的值,而不是引用。然而,装箱之后,比较发生在字符串实例上。

  string a = "prakash";

  string b = "p";

  b += "rakash"; // Append to contents of 'b'

  Console.WriteLine(a ==b); //True

  Console.WriteLine((object)a == (object)b); //False as after boxing the //comparison happens on string instance and both are differentstring instance

  另一方面,StringBuilder (System.Text.StringBuilder)表示一个可变字符串。该类不能被继承。

  缺省值为16个字符,最大值大于20亿字符。

  StringBuilder sb = new StringBuilder();

  sb.Append("Prakash");

  sb.Append("Tripathi");

  Console.WriteLine(sb.ToString());

  问题5:在命名空间内可以直接创建哪些类型?

  有以下几种类型可以直接在名称空间中创建。有时他们也被称为第一名公民:

  类(Class)- 任何程序的主要构建块,用于将变量、属性和方法封装到单个单元中;引用类型。接口(Interface)- 保留方法、属性的签名;引用类型。结构(Struct)- 与类有点相似,但是是轻量级的值类型。委托(Delegate)- 用于封装命名或匿名方法;引用类型。枚举(Enum )- 命名的整型常量的集合;值类型。

目录
相关文章
|
6月前
|
SQL 数据库 C#
C# .NET面试系列十一:数据库SQL查询(附建表语句)
#### 第1题 用一条 SQL 语句 查询出每门课都大于80 分的学生姓名 建表语句: ```sql create table tableA ( name varchar(10), kecheng varchar(10), fenshu int(11) ) DEFAULT CHARSET = 'utf8'; ``` 插入数据 ```sql insert into tableA values ('张三', '语文', 81); insert into tableA values ('张三', '数学', 75); insert into tableA values ('李四',
158 2
C# .NET面试系列十一:数据库SQL查询(附建表语句)
|
6月前
|
算法 C# 数据库
【干货】一份10万字免费的C#/.NET/.NET Core面试宝典
C#/.NET/.NET Core相关技术常见面试题汇总,不仅仅为了面试而学习,更多的是查漏补缺、扩充知识面和大家共同学习进步。该知识库主要由自己平时学习实践总结、网上优秀文章资料收集(这一部分会标注来源)和社区小伙伴提供三部分组成。该份基础面试宝典完全免费,发布两年来收获了广大.NET小伙伴的好评,我会持续更新和改进,欢迎关注我的公众号【追逐时光者】第一时间获取最新更新的面试题内容。
290 1
|
6月前
|
开发框架 算法 搜索推荐
C# .NET面试系列九:常见的算法
#### 1. 求质数 ```c# // 判断一个数是否为质数的方法 public static bool IsPrime(int number) { if (number < 2) { return false; } for (int i = 2; i <= Math.Sqrt(number); i++) { if (number % i == 0) { return false; } } return true; } class Progr
127 1
|
6月前
|
并行计算 安全 Java
C# .NET面试系列四:多线程
<h2>多线程 #### 1. 根据线程安全的相关知识,分析以下代码,当调用 test 方法时 i > 10 时是否会引起死锁? 并简要说明理由。 ```c# public void test(int i) { lock(this) { if (i > 10) { i--; test(i); } } } ``` 在给定的代码中,不会发生死锁。死锁通常是由于两个或多个线程互相等待对方释放锁而无法继续执行的情况。在这个代码中,只有一个线程持有锁,且没有其他线程参与,因此不
382 3
|
5月前
|
前端开发 Java C#
GitHub突破5k Star!这件事情我坚持了3年,努力打造C#/.NET/.NET Core全面的学习、工作、面试指南知识库
GitHub突破5k Star!这件事情我坚持了3年,努力打造C#/.NET/.NET Core全面的学习、工作、面试指南知识库
|
6月前
|
SQL 存储 关系型数据库
C# .NET面试系列十:数据库概念知识
#### 1. 为什么要一定要设置主键? 设置主键是数据库设计中的一个重要概念,有几个主要原因: 1、唯一性 ```c# 主键必须保证表中的每一行都有唯一的标识。这样可以避免数据冗余和不一致性。如果没有主键或者主键不唯一,就可能出现数据混乱或错误。 ``` 2、查询性能 ```c# 数据库系统通常会使用主键来加速数据检索。主键通常会被索引,这样可以更快速地找到特定行的数据,提高查询效率。 ``` 3、关联性 ```c# 主键常常用于建立表与表之间的关系。在关系数据库中,一个表的主键通常与其他表中的外键建立关联,这种关系对于数据的一致性和完整性非常重要。 ``` 4、数据完
199 1
C# .NET面试系列十:数据库概念知识
|
6月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
328 5
|
6月前
|
XML 开发框架 .NET
C# .NET面试系列八:ADO.NET、XML、HTTP、AJAX、WebService
## 第二部分:ADO.NET、XML、HTTP、AJAX、WebService #### 1. .NET 和 C# 有什么区别? .NET(通用语言运行时): ```c# 定义:.NET 是一个软件开发框架,提供了一个通用的运行时环境,用于在不同的编程语言中执行代码。 作用:它为多语言支持提供了一个统一的平台,允许不同的语言共享类库和其他资源。.NET 包括 Common Language Runtime (CLR)、基础类库(BCL)和其他工具。 ``` C#(C Sharp): ```c# 定义: C# 是一种由微软设计的面向对象的编程语言,专门为.NET 平台开发而创建。 作
300 2
|
6月前
|
XML 数据可视化 C#
C# .NET面试系列五:WPF
<h2>WPF #### 1. WPF 由哪两部分组成? Windows Presentation Foundation (WPF) 由两个主要部分组成: 1、XAML (eXtensible Application Markup Language) ```c# 这是一种基于 XML 的标记语言,用于定义用户界面的结构和外观。XAML允许开发人员使用声明性语法来描述应用程序的用户界面元素,而不是使用传统的编程方式。XAML 被广泛用于定义 WPF 窗体、控件、布局和动画。 ``` 2、Code-behind 文件 ```c# 这是包含与用户界面相关逻辑的代码文件。通常,开发人员可
211 4
|
6月前
|
开发框架 中间件 .NET
C# .NET面试系列七:ASP.NET Core
## 第一部分:ASP.NET Core #### 1. 如何在 controller 中注入 service? 在.NET中,在ASP.NET Core应用程序中的Controller中注入服务通常使用<u>依赖注入(Dependency Injection)</u>来实现。以下是一些步骤,说明如何在Controller中注入服务: 1、创建服务 首先,确保你已经在应用程序中注册了服务。这通常在Startup.cs文件的ConfigureServices方法中完成。例如: ```c# services.AddScoped<IMyService, MyService>(); //
388 0
下一篇
无影云桌面