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

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

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

还有就是

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

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

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

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

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

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

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

  1. class Program {
  2. static String location;
  3. static DateTime time;
  4.  
  5.  
  6. static void Main() {

  7. Console.WriteLine(location == null ? "location is null" : location);

  8. Console.WriteLine(time == null ? "time is null" : time.ToString());

  9. }

  10. }

输出将是:

location is null

1/1/0001 12:00:00 AM

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

尽管两个变量都未初始化,但是String是引用类型 、DateTime 是值类型。作为值类型,单位化DateTime变量设置为默认值 公元1年晚上12点,而不是 null

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

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

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

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

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

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

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

  6. return op(radius);

  7. }

  8. }

简编写代码以计算圆的周长,而无需修改Circle类本身。

首选的答案如下:

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

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

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

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

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

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

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

  1. class Program {
  2. private static string result;
  3. static void Main() {

  4. SaySomething();

  5. Console.WriteLine(result);

  6. }
  7.  
  8.  
  9. static async Task<string> SaySomething() {

  10. await Task.Delay(5);

  11. result = "Hello world!";

  12. return Something”;

  13. }

下面

此外,如果我们替换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. delegate void Printer();
  2. static void Main()

  3. {

  4. List<Printer> printers = new List<Printer>();

  5. int i=0;

  6. for(; i < 10; i++)

  7. {

  8. printers.Add(delegate { Console.WriteLine(i); });

  9. }
  10.  
  11.  
  12. foreach (var printer in printers)

  13. {

  14. printer();

  15. }

  16. }

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

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

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

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

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6.  
  7. namespace ConsoleApplication8

  8. {

  9. class Program

  10. {

  11. class Customer

  12. {

  13. public int ID { get; set; }

  14. public string Name { get; set; }

  15. public override string ToString()

  16. {

  17. return this.Name;

  18. }

  19. }

  20. static void Main(string[] args)

  21. {

  22. object[] array = new object[3];

  23. array[0] = 101;

  24. array[1] = "C#";

  25. Customer c = new Customer();

  26. c.ID = 55;

  27. c.Name = "Manish";

  28. array[2] = c;

  29. foreach (object obj in array)

  30. {

  31. Console.WriteLine(obj);

  32. }

  33. Console.ReadLine();

  34. }

  35. }

  36. }

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

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

他们都是

是复合数据类型

可以包含方法和事件

可以支持接口

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

类:

支持继承

是引用(指针)类型

引用可以为空

每个新实例都有内存开销

结构:

不支持继承

是值类型

按值传递(如整数)

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

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

9、这里有一个包含一个或多个$符号的字串,例如:
"foo bar foo $ bar $ foo bar $ "
问题:如何$从给定的字符串中删除第二和第三次出现的?

答案:

使用如下正则表达式:

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

说明:

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

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

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

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

  1. public class TestStatic
  2. {
  3. public static int TestValue;
  4. public TestStatic()

  5. {

  6. if (TestValue == 0)

  7. {

  8. TestValue = 5;

  9. }

  10. }

  11. static TestStatic()

  12. {

  13. if (TestValue == 0)

  14. {

  15. TestValue = 10;

  16. }

  17. }
  18. public void Print()

  19. {

  20. if (TestValue == 5)

  21. {

  22. TestValue = 6;

  23. }

  24. Console.WriteLine("TestValue : " + TestValue);
  25. }

  26. }
  27.  
  28.  
  29. public void Main(string[] args)

  30. {

  31. TestStatic t = new TestStatic();

  32. t.Print();

  33. }

  34. TestValue : 10

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

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

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

  7. }

启动类

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

回答:

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

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

12、以下代码输出什么?

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6.  
  7. namespace main1

  8. {

  9. class Program

  10. {

  11. static void Main(string[] args)

  12. {

  13. try

  14. {

  15. Console.WriteLine("Hello");

  16. }

  17. catch (ArgumentNullException)

  18. {

  19. Console.WriteLine("A");

  20. }

  21. catch (Exception)

  22. {

  23. Console.WriteLine("B");

  24. }

  25. finally

  26. {

  27. Console.WriteLine("C");

  28. }

  29. Console.ReadKey();

  30. }

  31. }

  32. }

答案:

Hello

C

13、描述依赖注入。

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

构造函数依赖

属性依赖

方法依赖

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

  1. using system;
  2. class abc
  3. {

  4. public static Void Main()
  5. {
  6. int ndistance, nresult;
  7. Console.WriteLine("Enter the distance in kilometers");
  8. ndistance = convert.ToInt32(Console.ReadLine());
  9. nresult = ndistance * 1000;
  10. Console.WriteLine("Distance in meters: " + nresult);
  11. Console.ReadLine();
  12. }
  13.  
  14.  
  15. }

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

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

例:

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

最后:

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

来源:https://www.iwmyx.cn/15gjbdcmswt.html

基本的C#面试问题(15例)的更多相关文章

  1. php面试专题---15、MySQL数据库基础考察点

    php面试专题---15.MySQL数据库基础考察点 一.总结 一句话总结: 注意:只写精品 1.mysql定义int(3),那么我存1234就错了么? 不是:无影响:只会影响显示字符的个数:可以为整 ...

  2. History(历史)命令用法15例

    导读 如果你经常使用 Linux 命令行,那么使用 history(历史)命令可以有效地提升你的效率,本文将通过实例的方式向你介绍 history 命令的 15 个用法. 使用 HISTTIMEFOR ...

  3. [转] Linux History(历史)命令用法 15 例

    [From]https://linuxtoy.org/archives/history-command-usage-examples.html 如果你经常使用 Linux 命令行,那么使用 histo ...

  4. History命令用法15例

    以下内容为转载: 如果你经常使用 Linux 命令行,那么使用 history(历史)命令可以有效地提升你的效率.本文将通过实例的方式向你介绍 history 命令的 15 个用法. 使用 HISTT ...

  5. History(历史)命令用法 15 例

    如果你经常使用 Linux 命令行,那么使用 history(历史)命令可以有效地提升你的效率.本文将通过实例的方式向你介绍 history 命令的 15 个用法. 使用 HISTTIMEFORMAT ...

  6. shell面试经典70例

    转载自:http://www.imooc.com/article/1131 1) 如何向脚本传递参数 ? ./script argument 例子: 显示文件名称脚本 ./show.sh file1. ...

  7. [google面试CTCI] 1-5.替换字符串中特定字符

    [字符串与数组] Q:Write a method to replace all spaces in a string with ‘%20’ 题目:写一个算法将一个字符串中的空格替换成%20 解答: ...

  8. P3613 【深基15.例2】寄包柜

    传送门 题目大意 往一个\(a[i][j]\) 里边放东西,也可以取走东西,然后查询\(a[i][j]\)里边是什么东西. 思路: 显然我们可以暴力,但是你开不了那么大的数组. 翻了翻dalao们的题 ...

  9. 面试系列15 如何保证Redis的高并发和高可用

    就是如果你用redis缓存技术的话,肯定要考虑如何用redis来加多台机器,保证redis是高并发的,还有就是如何让Redis保证自己不是挂掉以后就直接死掉了,redis高可用 我这里会选用我之前讲解 ...

随机推荐

  1. 秒懂Dubbo接口(原理篇)

    引言 背景 单一应用架构 垂直应用架构 分布式服务架构 流动计算架构 为什么要用 Dubbo? 什么是分布式? 为什么要分布式? Dubbo 的架构 Dubbo 的架构图解 Dubbo 工作原理 Du ...

  2. CF1396E——Distance Matching

    传送门:QAQQAQ(题面翻译) 以后博客可能一直咕咕咕了.一些做题的思考可能会直接放在代码里而不是单独写博客,因为这样太浪费时间,只有一些比较新的题才会单独写博客 思路:对于这种构造可行解使得权值和 ...

  3. 2、Django源码分析之启动wsgi发生了哪些事

    一 前言 Django是如何通过网络socket层接收数据并将请求转发给Django的urls层? 有的人张口就来:就是通过wsgi(Web Server Gateway Interface)啊! D ...

  4. 常用简单电脑bai快捷键大全

    Ctrl+C 复制.duCtrl+X 剪切.Ctrl+V粘贴.Ctrl+Z撤销.Ctrl+A全选所有文件.zhiDelete删除.daoShift+Delete避开回收站直接永久删除(不可找回).F3 ...

  5. hibernate3.6-联合主键注解以及openSession和getCurrentSession区别

    [联合主键]>>>>配置方式:xml:    1. Student中单独创建StudentPk主键实体类 2. 配置: <composite-id name=" ...

  6. VMware虚拟机 - 如何让鼠标从虚拟机中返回到个人计算机中

    最简单的方式 按快捷键:ctrl+alt即可 彻底解决问题的方法:安装VMware Tools 前提条件 开启虚拟机 确认客户机操作系统正在运行 因为 VMware Tools 安装程序是使用 Per ...

  7. UnixIPC之共享内存

    Unix-IPC之共享内存 一,共享内存的概念 共享内存通信技术是一种最快的可用IPC形式,它是针对其他通信机制运行效率低和设计的新型通信技术(其他的如:信号量,管道,套接字等).这种通信技术往往与其 ...

  8. sklearn.neighbors.NNeighborsClassifier 详细说明

    平时会用到sklearn.neighbors.NNeighborsClassifier函数来构建K最邻近分类器,所以这里对NNeighborsClassifier中的参数进行说明,文中参考的是scik ...

  9. 新手避坑 -- 用 Jenkins +miniprogram-ci 自动构建微信小程序

    先看看效果: 要实现这样的效果,需要下面3步: 1.下载 node 依赖包 miniprogram-ci,编写预览和上传功能 2. 登录微信公众平台, 下载项目的privateKey+添加代码上传IP ...

  10. 关于重写equals同时重写hashcode

    1.Object中equals方法和hashcode public boolean equals(Object obj) { return (this == obj); } public native ...