15个基本的C#面试问题

原文来自互联网,由长沙DotNET技术社区【笑语】编译。

原文来自:https://www.toptal.com/c-sharp/top-10-mistakes-that-c-sharp-programmers-make

1、给定一个int数组,编写方法以统计所有偶数的值。

有很多方法可以做到这一点,但是最直接的两种方法是:

1
2
3
static long TotalAllEvenNumbers(int[] intArray) {return intArray.Where(i => i % 2 == 0).Sum(i => (long)i);
}

还有就是

1
2
3
static long TotalAllEvenNumbers(int[] intArray) {return (from i in intArray where i % 2 == 0 select (long)i).Sum();
}

当然,你还需要注意以下关键:

  1. 你是否利用 C#语言特性 一行就解决问题。(即,不是使用包含循环,条件语句和累加器的更长篇幅的解决方案)

  2. 你是否考虑过溢出的可能性。例如,诸如

    return intArray.Where(i => i % 2 == 0).Sum()(与函数的返回类型无关)

这可能一个很”明显”的单行,但这样溢出的可能性很高。虽然上面的答案中使用的转换为long的方法并没有消除这种可能性,但是它使得发生溢出异常的可能性非常小。但请注意,如果你写答案的时候询问数组的预期大小及其成员的大小,则显然你在做这道题目的时候在考虑此溢出问题,这很棒。

2、下面的代码的输出是什么?解释你的答案。

1
2
3
4
5
6
7
8
9
class Program {static String location;static DateTime time;static void Main() {Console.WriteLine(location == null ? "location is null" : location);Console.WriteLine(time == null ? "time is null" : time.ToString());}
}

输出将是:

1
2
location is null
1/1/0001 12:00:00 AM

下面的简短程序的输出是什么?解释你的答案。简短程序的输出是什么?解释你的答案。
尽管两个变量都未初始化,但是String是引用类型 、DateTime 是值类型。作为值类型,单位化DateTime变量设置为默认值 公元1年晚上12点,而不是 null

3、下面语句中 time 和null 的比较是有效还是无效的?

1
2
3
4
5
6
static DateTime time;
/* ... */
if (time == null)
{/* do something */
}

有人可能会认为,由于变量永远不可能为null (它被自动初始化为1月1日的值),所以编译器在比较某个变量时就会报错。具体来说,操作符将其操作数强制转换为不同的允许类型,以便在两边都得到一个通用类型,然后可以对其进行比较。这就是为什么像这样的东西会给你期望的结果(而不是失败或意外的行为,因为操作数是不同的类型):

1
2
3
double x = 5.0;
int y = 5;
Console.WriteLine(x == y);  // outputs true

然而,这有时会导致意外的行为,例如DateTime变量和null的比较。在这种情况下,DateTime变量和null文字都可以转换为可空的。因此,比较这两个值是合法的,即使结果总是假的。

4、给定circle以下类的实例:

1
2
3
4
5
6
7
public sealed class Circle {private double radius;public double Calculate(Func<double, double> op) {return op(radius);}
}

简编写代码以计算圆的周长,而无需修改Circle类本身。
首选的答案如下:

1
circle.Calculate(r => 2 * Math.PI * r);

由于我们不能访问对象的私有半径字段,所以我们通过内联传递计算函数,让对象本身计算周长。

许多c#程序员回避(或不理解)函数值参数。虽然在这种情况下,这个例子有点做作,但其目的是看看申请人是否了解如何制定一个调用来计算哪个与方法的定义相匹配。

另外,一个有效的(虽然不那么优雅的)解决方案是从对象中检索半径值本身,然后执行计算结果:

1
2
var radius = circle.Calculate(r => r);
var circumference = 2 * Math.PI * radius;

无论哪种方式。我们在这里主要寻找的是面试者是否熟悉并理解如何调用Calculate方法。

5、下面程序的输出是什么?解释你的答案。

1
2
3
4
5
6
7
8
9
10
11
12
13
class Program {private static string result;static void Main() {SaySomething();Console.WriteLine(result);}static async Task<string> SaySomething() {await Task.Delay(5);result = "Hello world!";return “Something”;}

下面
此外,如果我们替换wait task,答案会改变吗? 比如 thread . sleep (5) ? 为什么?的简短

程序的输出是什么?解释你的答案。序的输出是什么?解释你的答案。

回答:

问题第一部分(即带有的代码版本await Task.Delay(5);)的答案是该程序将仅输出一个空行(而不是 “ Hello world!”)。这是因为调用result时仍将未初始化Console.WriteLine。

大多数程序和面向对象的程序员都希望函数return在返回调用函数之前从头到尾执行,或者从语句执行。C#async函数不是这种情况。它们只执行到第一个await语句,然后返回到调用方。由await(在此例中为Task.Delay)调用的函数是异步执行的,并且该await语句之后的行直到Task.Delay完成(在5毫秒内)之前都不会发出信号。但是,在这段时间内,控制权已经返回给调用者,该调用者Console.WriteLine对尚未初始化的字符串执行该语句。

调用await Task.Delay(5) 可让当前线程继续其正在执行的操作,如果已完成(等待任何等待),则将其返回到线程池。这是异步/等待机制的主要好处。它允许CLR使用线程池中的更少线程来服务更多请求。

异步编程已经变得越来越普遍,因为执行许多活动的网络服务请求或数据库请求的设备越来越普遍。C#具有一些出色的编程结构,可以极大地简化异步方法的编程任务,并且意识到它们的程序员将产生更好的程序。

关于问题的第二部分,如果将await Task.Delay(5);其替换为Thread.Sleep(5),则程序将输出Hello world!。一种没有至少一个语句的async方法,其操作就像同步方法一样。也就是说,它将从头到尾执行,或者直到遇到一条语句为止。调用只是阻塞了当前正在运行的线程,因此调用仅将方法的执行时间增加了5毫秒。awaitreturnThread.Sleep()Thread.Sleep(5)SaySomething()

6、下面的程序输出是什么?解释你的答案。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
delegate void Printer();static void Main()
{List<Printer> printers = new List<Printer>();int i=0;for(; i < 10; i++){printers.Add(delegate { Console.WriteLine(i); });}foreach (var printer in printers){printer();}
}

这个程序将把数字10输出十次。

原因如下: 委托被添加到 for循环中l了,而 “引用” (或者“指针”)被存储到i中,而不是值本身。因此,在我们退出循环之后,变量i被设置为10,所以到调用每个委托时,传递给它们的值都是10。

7、是否可以将混合数据类型(例如int,string,float,char)全部存储在一个数组中?

是! 之所以可以这样做,是因为数组的类型object不仅可以存储任何数据类型,还可以存储类的对象,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplication8
{class Program{class Customer{public int ID { get; set; }public string Name { get; set; }public override string ToString(){return this.Name;}}static void Main(string[] args){object[] array = new object[3];array[0] = 101;array[1] = "C#";Customer c = new Customer();c.ID = 55;c.Name = "Manish";array[2] = c;foreach (object obj in array){Console.WriteLine(obj);}Console.ReadLine();}}
}

8、比较C#中的结构和类。他们有什么共同点?它们有何不同?

C#中的类和结构确实有一些共同点,即:

他们都是

是复合数据类型

可以包含方法和事件

可以支持接口

但是有许多差异。比较一下:

类:

支持继承

是引用(指针)类型

引用可以为空

每个新实例都有内存开销

结构:

不支持继承

是值类型

按值传递(如整数)

不能有空引用(除非使用了Nullable)

每个新实例没有内存开销(除非“装箱”)

9、这里有一个包含一个或多个$符号的字串,例如:

1
"foo bar foo $ bar $ foo bar $ "

问题:如何$从给定的字符串中删除第二和第三次出现的?
答案:

使用如下正则表达式:

1
2
3
4
string s = "like for example $  you don't have $  network $  access";
Regex rgx = new Regex("\\$\\s+");
s = Regex.Replace(s, @"(\$\s+.*?)\$\s+", "$1$$");
Console.WriteLine("string is: {0}",s);

说明:

  • ($\s+.*?)-第1组,捕获一个文字$,一个或多个空格字符,然后捕获除换行符以外的任意数量的字符,并尽可能少地捕获到下一个最接近的匹配项

  • $\s+—单个$符号和一个或多个空格字符

  • $1引用组1的值,它只是将其插入被替换的字符串中,$$代表替换模式中的$符号。

    10、下面的程序输出是什么?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    
    public class TestStatic{public static int TestValue;public TestStatic(){if (TestValue == 0){TestValue = 5;}}static TestStatic(){if (TestValue == 0){TestValue = 10;}}public void Print(){if (TestValue == 5){TestValue = 6;}Console.WriteLine("TestValue : " + TestValue);}}public void Main(string[] args){TestStatic t = new TestStatic();t.Print();}
    

TestValue : 10

在创建该类的任何实例之前,将调用该类的静态构造函数。此处调用的静态构造函数TestValue首先将变量初始化。

11、有没有一种方法可以修改ClassA、以便您可以在调用Main方法时使用参数调用构造函数,而无需创建任何其他新实例ClassA?

1
2
3
4
5
6
class ClassA
{public ClassA() { }public ClassA(int pValue) {  }
}

启动类

1
2
3
4
5
6
7
class Program
{static void Main(string[] args){ClassA refA = new ClassA();}
}

回答:

所述this关键字被用于调用其他构造,初始化该类对象。下面是实现:

1
2
3
4
5
6
7
8
class ClassA
{public ClassA() : this(10){ }public ClassA(int pValue){  }
}

12、以下代码输出什么?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace main1
{class Program{static void Main(string[] args){try{Console.WriteLine("Hello");}catch (ArgumentNullException){Console.WriteLine("A");}catch (Exception){Console.WriteLine("B");}finally{Console.WriteLine("C");}Console.ReadKey();}}
}

答案:

1
2
Hello
C

13、描述依赖注入。

依赖注入是一种使紧密链接的类分离的方式,从而减少了类之间的直接依赖。有多种方法可以实现依赖项注入:

  1. 构造函数依赖

  2. 属性依赖

  3. 方法依赖

    14、编写一个C#程序,该程序接受以千米为单位的距离,将其转换为米,然后显示结果。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    using system;class abc{public static Void Main(){int ndistance, nresult;Console.WriteLine("Enter the distance in kilometers");ndistance = convert.ToInt32(Console.ReadLine());nresult = ndistance * 1000;Console.WriteLine("Distance in meters: " + nresult);Console.ReadLine();}}
    

15、描述装箱和拆箱。并写一个例子。

装箱是将值类型隐式转换为该类型object或该值类型实现的任何接口类型。将值类型装箱会创建一个包含该值的对象实例,并将其存储在堆中。

例:

1
2
3
4
5
int x = 101;
object o = x;  // boxing value of x into object oo = 999;
x = (int)o;    // unboxing value of o into integer x

最后:

面试不仅要基础扎实,更重要的是能解决棘手的技术问题,所以以上这些内容仅供参考。并非每个值得招聘的优秀候选人都能够回答所有问题,也不能确定能够全部回答,就能保证他是一个优秀候选人。归根结底,招聘仍然是一门艺术,一门科学以及许多工作。

说实话,这十五个问题,部分问题确实比较棘手,一度让我也思考了好久。你觉得呢?赶紧在你的朋友圈分享起来吧~

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

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

相关文章

洛谷 P1122 最大子树和-求树的最大子树权值和

输入: 7 -1 -1 -1 1 1 1 0 1 4 2 5 3 6 4 7 5 7 6 7输出: 3代码如下: #include <iostream> #include <vector> using namespace std; const int N 100010; typedef long long LL; LL ans; vector<LL>t[N]; LL w[N];void dfs(int root, int fa) {for (int…

玩转控件:封装Dev的LabelControl和TextEdit

缘由俗话说的好&#xff1a;"工欲善其事必先利其器"&#xff0c;作为软件攻城狮也是同样道理&#xff0c;攻城狮开发的软件目的是简化客户的操作&#xff0c;让客户动动手指就可以完成很多事情&#xff0c;减少人力成本。这也是系统/软件存在的目的。那对于攻城狮来说…

洛谷 P1958 上学路线-dfs

输入: 5 4 3 2 2 2 3 4 2输出: 5注意点:这题目输入的时候先输入列&#xff0c;再输入行&#xff0c;这点要注意&#xff0c;然后这个图跟我们二维数组是反过来的&#xff0c;所以题目说得向北走要变成向南走&#xff0c;注意一下细节就好了。 代码如下: #include <io…

.NET Core开发实战(第33课:集成事件:使用RabbitMQ来实现EventBus)--学习笔记(下)...

33 | 集成事件&#xff1a;使用RabbitMQ来实现EventBus为了演示我们的发布和订阅的话&#xff0c;我们在这里的代码做一些稍微的调整namespace GeekTime.API.Application.DomainEventHandlers {public class OrderCreatedDomainEventHandler : IDomainEventHandler<OrderCre…

文本框赋值guide matlab,科学网-Matlab: 学习GUI (使用GUIDE时需注意的几个问题)-刘磊的博文...

在博文《Matlab&#xff1a;学习GUI(一个简单的例子)》(介绍的方法是完全用代码来建立一个GUI&#xff0c;实际上Matlab本身有一个设计GUI的交互系统——GUIDE&#xff0c;用户可以使用该系统更方便的建立自己的GUI.本文将介绍使用GUIDE时常常遇到的几个问题。本文将通过一个简…

洛谷 P1294 高手去散步-邻接矩阵+dfs-求无向图的一条最长路径

输入: 4 6 1 2 10 2 3 20 3 4 30 4 1 40 1 3 50 2 4 60输出: 150邻接矩阵&#xff1a; 代码如下: #include <iostream> using namespace std;int ans -1; const int N 25; int mp[N][N]; bool vis[N]; int n, m; void dfs(int u, int sum) {ans max(ans, sum);for …

论ORM框架—EntityFrameworkCore

欢迎大家阅读《朝夕Net社区技术专刊》我们致力于.NetCore的推广和落地&#xff0c;为更好的帮助大家学习&#xff0c;方便分享干货&#xff0c;特创此刊&#xff01;很高兴你能成为忠实读者&#xff0c;文末福利不要错过哦&#xff01;01PARTORM框架ORM&#xff08;Object Rela…

苏老师首播3小时!超500人观看!录屏!源码!PPT……你要的都在这里!

点击视频 ☝ 回顾直播现场2020年3月25日晚18&#xff1a;30&#xff0c;“盛派周三分享”首次直播交流会&#xff0c;由盛派技术团队带头人Jeffrey&#xff0c;苏震威老师主持、分享&#xff0c;主题是《SCF 框架介绍快速创建项目演示》。此次直播历时3个多小时&#xff0c;500…

[蓝桥杯][算法提高VIP]数的划分-dp

题目描述 一个正整数可以划分为多个正整数的和&#xff0c;比如n3时&#xff1a; 3&#xff1b;1&#xff0b;2&#xff1b;1&#xff0b;1&#xff0b;1&#xff1b; 共有三种划分方法。 给出一个正整数&#xff0c;问有多少种划分方法。 输入 一个正整数n 数据规模和约定 …

十问十答 GPL 许可证

GPL 是 GNUs General Public License 的缩写&#xff0c;翻译成中文叫 GNU 的通用公共许可证&#xff0c;是最受欢迎的开源许可证之一。它由理查德斯托曼&#xff08;Richard Stallman&#xff09;创建&#xff0c;目的是保护 GNU 软件免于被专有&#xff0c;是基于他「版权向左…

oracle consistent gets,oracle构建一致性读

对于实际的业务系统&#xff0c;通常有一些热点的表&#xff0c;insert和delete的量非常大&#xff0c;这个时候就会发现一些查询语句的逻辑读比较偏高&#xff0c;这时可能就是oracle在构建一致性块的进行的consistentread。下面做一个测试看下&#xff1a;第一步准备数据&…

解析“60k”大佬的19道C#面试题(上)

解析“60k”大佬的19道C#面试题&#xff08;上&#xff09;先略看题目&#xff1a;请简述 async函数的编译方式请简述 Task状态机的实现和工作机制请简述 await的作用和原理&#xff0c;并说明和 GetResult()有什么区别Task和 Thread有区别吗&#xff1f;如果有请简述区别简述 …

通过极简模拟框架让你了解ASP.NET Core MVC框架的设计与实现[上篇]

《200行代码&#xff0c;7个对象——让你了解ASP.NET Core框架的本质》让很多读者对ASP.NET Core管道有了真实的了解。在过去很长一段时间中&#xff0c;有很多人私信给我&#xff1a;能否按照相同的方式分析一下MVC框架的设计与实现原理&#xff0c;希望这篇文章能够满足你们的…

通过极简模拟框架让你了解ASP.NET Core MVC框架的设计与实现[中篇]:请求响应

《200行代码&#xff0c;7个对象——让你了解ASP.NET Core框架的本质》让很多读者对ASP.NET Core管道有了真实的了解。在过去很长一段时间中&#xff0c;有很多人私信给我&#xff1a;能否按照相同的方式分析一下MVC框架的设计与实现原理&#xff0c;希望这篇文章能够满足你们的…

洛谷 P2853 [USACO06DEC]Cow Picnic S-dfs

输入: 2 4 4 2 3 1 2 1 4 2 3 3 4输出: 2代码如下: #include <iostream> #include <vector> #include <cstring> using namespace std; const int N 1010; bool vis[N]; vector<int>v[N]; int r[N]; int mk[N];void dfs(int u) {mk[u];for (int i …

.NET Core开发实战(第34课:MediatR:轻松实现命令查询职责分离模式(CQRS))--学习笔记(上)...

34 | MediatR&#xff1a;轻松实现命令查询职责分离模式&#xff08;CQRS&#xff09;核心对象IMeditatorIRequese、IRequestIRequestHandler<in TRequest, TResponse>源码链接&#xff1a;https://github.com/witskeeper/geektime/tree/master/samples/MediatorDemo首先…

十一届蓝桥杯国赛 玩具蛇-dfs

【问题描述】 小蓝有一条玩具蛇&#xff0c;一共有 16 节&#xff0c;上面标着数字 1 至 16。每一节都是一 个正方形的形状。相邻的两节可以成直线或者成 90 度角。 小蓝还有一个 4 4 的方格盒子&#xff0c;用于存放玩具蛇&#xff0c;盒子的方格上依次标着 字母 A 到 P 共 1…

远程终端管理和检测系统

TerminalMACS(Terminal Manager And Check System)远程终端管理和检测系统本文同步更新地址&#xff1a;https://dotnet9.com/11429.html一、本系统可监控多种终端资源&#xff1a;移动端AndroidiOSPC端WindowsLinuxMac二、整个系统分为三类进程&#xff1a;被控端(Client)被控…

《ASP.NET Core 3 框架揭秘(上下册)》送书结果公告

【免费送书】.Net5实操后的我一夜未眠&#xff0c;来个大胆预测&#xff01;的送书抽奖结果已经出来了&#xff1a;这位中奖的同学尽快填写收货地址&#xff0c;4/2 日还没有完成填写将作废&#xff0c;奖品可是热门的《ASP.NET Core 3 框架揭秘&#xff08;上下册&#xff09;…

linux下Qt编写串口调试助手,如何在linux下用QT写一个简单的串口调试助手

如何在linux下用QT写一个简单的串口调试助手QT5串口类在QT5以前&#xff0c;编写串口一般使用的是qextserialport类&#xff0c;但在QT5之后有了QT自带的串口类SerialPort(串口基础类)和SerialPortInfo(串口信息类)使用方法pro中添加QT serialport工程中包含相应的头文件#incl…