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,一经查实,立即删除!

相关文章

求一到n偶数和值python,几个python练习题

从python公众号里面看到了几道python的练习题&#xff0c;就拿来练练手&#xff0c;结果上手了发现自己还是特别水&#xff0c;不是很难的8道题&#xff0c;我只做出来5道&#xff0c;其中还3道题卡住了&#xff0c;边查边做的。原题链接在这里&#xff1a;http://python.jobbo…

洛谷 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;减少人力成本。这也是系统/软件存在的目的。那对于攻城狮来说…

php mvc多态实例,asp.net mvc-多态模型绑定

我花了好一天的时间来解决一个密切相关的问题的答案-尽管我不确定这是否是完全相同的问题&#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…

数字和为sum的方法数-01背包计数问题

给定一个有n个正整数的数组A和一个整数sum,求选择数组A中部分数字和为sum的方案数。 当两种选取方案有一个数字的下标不一样,我们就认为是不同的组成方案。 输入描述: 输入为两行: 第一行为两个正整数n(1 ≤ n ≤ 1000)&#xff0c;sum(1 ≤ sum ≤ 1000) 第二行为n个正整数Ai…

Oracle多租户体系,Oracle12C 多租户管理

--进入cdbsqlplus /nologconn sys/sys as dba--查看数据库基本信息select name,cdb from v$database;--查看容器的相关信息select con_id,name from v$containers;--查看数据文件的路径select con_id,file_name from cdb_data_files order by 1;--显示当前连接容器信息show con…

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

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

oracle错误 904,ORACLE 导出错误 EXP-00008: 遇到 Oracle 错误 904

案例情景——在一次C:\Documents and Settings\Administrator>explsxy/lsxylsxy_dbfileE:\lsxy.dmp ownerlsxyExport:Release 11.2.0.1.0- Production on 星期一 11月 26 14:07:18 2012 Copyright (c) 1982,2009,Oracle and/or its affiliates. All rights reserved.连接到:…

[蓝桥杯][算法提高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;第一步准备数据&…

[蓝桥杯][算法提高VIP]聪明的美食家-dp

题目描述 如果有人认为吃东西只需要嘴巴&#xff0c;那就错了。 都知道舌头有这么一个特性&#xff0c;“由简入奢易&#xff0c;由奢如简难”&#xff08;据好事者考究&#xff0c;此规律也适合许多其他情况&#xff09;。具体而言&#xff0c;如果是甜食&#xff0c;当你吃的…

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

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

oracle秘钥到期,Oracle – 更新加入 – 非密钥保留表

我试图复制一个Ingres“tbl2”中的更新tbl1命令,这在Oracle中并不完全.所以我使用“update(select tbl1 join tbl2 …)”命令.两个表都定义了主键,我认为我的连接唯一标识行,但是我仍然得到“ORA-01779&#xff1a;不能修改映射到非密钥保留表的列”.这里是适当的匿名表定义和我…

dptcpp 题目 2352: [信息学奥赛一本通-T1440]数的划分-dp

题目描述 将整数n分成k份&#xff0c;且每份不能为空&#xff0c;任意两份不能相同(不考虑顺序)。 例如&#xff1a;n7&#xff0c;k3&#xff0c;下面三种分法被认为是相同的。 {1&#xff0c;1&#xff0c;5}&#xff1b;{1&#xff0c;5&#xff0c;1}&#xff1b;{5&…