title author date CreateTime categories
C# 高级面试题
lindexi
2019-11-19 08:40:50 +0800
2018-11-12 11:18:2 +0800
C#

很少会有人可以答对,如果你遇到一个来面试的人实在嚣张,就可以用本文的题去打击
本文内容就看着玩,请不要在严肃的面试中问题这样的题目

如果面试到一个人可以回答出下面的题目也不能证明他的技术很强,只能说明他了解很多C#相关,或者他看过我的博客

循环下面的代码

请在下面的代码的注释处填写代码,让函数 Foo 里面的代码输出

        static void Main(string[] args)
{
// 请在此处写代码,调用 Foo 函数内的输出代码
} private static void Foo()
{
try
{
while (true)
{
}
}
finally
{
Console.WriteLine("尝试调用 Foo 函数执行这一句代码");
}
}

参考答案

使用一个线程调用的方式,调用之后结束线程,此时就会输出

        static void Main(string[] args)
{
// 请在此处写代码,调用 Foo 函数内的输出代码 var thread = new Thread(Foo);
thread.Start();
Task.Delay(100).Wait();
thread.Abort();// 这时就会结束循环 Console.Read();
}

注意,在 dotnet core 不支持 Abort 方法

从空转换

请写出 IFoo 和 Foo 的实现,让下面的代码不会抛出空异常

        static void Main(string[] args)
{
Foo foo = (IFoo) null;
foo.Name = "lindexi"; Console.Read();
}

参考答案

    class IFoo
{ } class Foo
{
public string Name { get; set; } public static implicit operator Foo(IFoo foo)
{
return new Foo();
}
}

等待不存在的类

请添加新的类的代码让下面的代码编译通过

    class Program
{
static async Task Main(string[] args)
{
Foo foo = await (object) null;
foo.Name = "lindexi"; Console.Read();
}
} public class Foo
{
public string Name { get; set; }
}

参考答案

   public class HeabdsdnbKevx : INotifyCompletion
{
public bool IsCompleted { get; } public Foo GetResult()
{
return new Foo();
} /// <inheritdoc />
public void OnCompleted(Action continuation)
{
}
} public static class RelelnisSou
{
public static HeabdsdnbKevx GetAwaiter(this object obj)
{
return new HeabdsdnbKevx();
}
}

再高级一点,写出下面的代码

        static async Task Main(string[] args)
{
await await await await await await await await await await await await
await await await await await await await "林德熙是逗比";
}

其实很简单,也就是将 GetResult 修改一下,在上面的代码修改

        public string GetResult()
{
return "林德熙是逗比";
}

因为返回值是 string 所以又可以继续等待

如何不执行 finally 里面的代码

这里有一个代码,需要让 finally 里面的代码不执行,现在你只能写 Foo 方法,同时这个方法不能运行无限长时间

            try
{
Foo();
}
finally
{
Console.WriteLine("不要让这个代码运行");
}

参考答案

因为不能让 Foo 运行无限长,就不能使用无限循环的方法,可以使用的方法有 Environment.FailFast 或 Environment.Exit 退出

private static void Foo()
{
Environment.Exit(0);
}

或者进行堆栈溢出,如下面代码

        private static void Foo()
{
Foo();
}

或者 少珺 小伙伴的不安全代码申请

        private static void Foo()
{
unsafe
{
var n = stackalloc int[int.MaxValue];
}
}

或者干掉自己进程

        private static void Foo()
{
Process.GetCurrentProcess().Kill();
}

但是申请大内存和退出当前线程方法都会让 finally 执行

        private static void Foo()
{
var n = new int[int.MaxValue];
}
// 虽然提示内存不够,但是finally依然可以运行

退出当前线程抛出的是线程中断异常,和其他异常一样都能执行 finally 代码

        private static void Foo()
{
Thread.CurrentThread.Abort();
}

注意,在 dotnet core 不支持 Abort 方法

另外,如果进入 try 是不能使用 goto 跳出但不执行 finally 代码

如果是在 VisualStudio 调试,在 Foo 执行完之后,在 VS 里把调试箭头拖到 finally 的后面

请问下面代码输出多少

请问下面的代码的 n 的值是多少?

        class Foo
{
public int N { get; } = 1;
} Foo foo = null;
var n = 2 + foo?.N ?? 1; Console.WriteLine(n);

参考答案

1

可能有小伙伴认为在 2 + foo?.N 这时如果 foo 为空就应该返回 ?? 后面的值,但是这是不对的上面的代码是和下面的代码差不多等同的

            if (foo == null)
{
n = 1;
}
else
{
n = 2 + foo.N;
}

而不是和下面的代码等价的

           if (foo == null)
{
n = 2 + 1;
}
else
{
n = 2 + foo.N;
}

在表达里面只有 ? 的值为空,那么就不会执行

等等,为什么上面的代码说的是差不多等同而不是等价,因为尝试运行下面代码,会看到 Hi 输出,多谢 九鼎 指出

using System;
class Test
{
class Foo
{
public int N
{
get
{
Console.WriteLine("Hi.");
return 1;
}
}
} static void Main()
{
Foo foo = null;
Foo foo2 = new Foo();
var n = 2 + foo?.N + foo2.N ?? 1;
Console.WriteLine(n);
}
}

上面代码中,第一个 foo?.N 会进行判断,因为 foo 不存在,所以整个表达式没有执行,但是表达式内的逻辑依然执行

模式匹配

请问下面代码输出什么?

    class B
{
public static int operator &(B left, B right) => 1;
public static int operator >(B left, B right) => 2;
public static int operator <(B left, B right) => 3; public static int operator &(bool left, B right) => 5;
public static int operator >(bool left, B right) => 6;
public static int operator <(bool left, B right) => 7;
} private static B B { get; } static void Main(string[] args)
{
object a = null;
B c = null;
Console.WriteLine(a is B b & c);
Console.WriteLine(a is B b1 > c);
Console.WriteLine(a is B b2 < c); a = new B(); Console.WriteLine(a is B b5 & c);
Console.WriteLine(a is B b6 > c);
Console.WriteLine(a is B b7 < c); }

也许这是全部题目里面最简单的一道题

请看 C# 匹配可空变量

其实这里的 a is B 用的 Bclass 不是定义的属性,对 a is B b5 返回的是 bool 所以将会是 boolB 之间的运算

2019-11-19-C#-高级面试题的更多相关文章

  1. cisco ssh实验--附带配置脚本-2019.11.19

    cisco ssh实验

  2. Java高级面试题解析(一)

    最近,在看一些java高级面试题,我发现我在认真研究一个面试题的时候,我自己的收获是很大的,我们在看看面试题的时候,不仅仅要看这个问题本身,还要看这个问题的衍生问题,一个问题有些时候可能是一个问题群( ...

  3. 2019前端面试系列——JS面试题

    判断 js 类型的方式 1. typeof 可以判断出'string','number','boolean','undefined','symbol' 但判断 typeof(null) 时值为 'ob ...

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

    解析"60k"大佬的19道C#面试题(下) 在上篇中,我解析了前 10 道题目,本篇我将尝试解析后面剩下的所有题目. 姐妹篇:解析"60k"大佬的19道C#面试 ...

  5. 【读书笔记】2016.11.19 北航 《GDG 谷歌开发者大会》整理

    2016.11.19 周六,我们在 北航参加了<GDG 谷歌开发者大会>,在web专场,聆听了谷歌公司的与会专家的技术分享. 中午免费的午餐,下午精美的下午茶,还有精湛的技术,都是我们队谷 ...

  6. php高级面试题知识点(转载)

    php高级面试题知识点大全 时间:2016-01-26 06:36:22来源:网络 导读:php高级面试题知识点大全,本套面试题内容包括php魔术方法.php单点登录.linux基本命令.前端开发技术 ...

  7. Spring 配置文件详解 http://www.blogjava.net/hellxoul/archive/2011/11/19/364324.html

    1.基本配置: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http: ...

  8. 2019.3.18考试&2019.3.19考试&2019.3.21考试

    2019.3.18 C O D E T1 树上直接贪心,环上for一遍贪心 哇说的简单,码了将近一下午终于码出来了 感觉自己码力/写题策略太糟糕了,先是搞了一个细节太多的写法最后不得不弃疗了,然后第二 ...

  9. How to Pronounce Numbers 11 – 19

    How to Pronounce Numbers 11 – 19 Share Tweet Share Tagged With: Numbers Numbers are something you’ll ...

随机推荐

  1. IDEA(JAVA)使用json

    首先介绍一下json SON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度. JSON就是一串字符串 只不过元素会使用特定的 ...

  2. awss3

    import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.io ...

  3. bzoj1911 特别行动队

    Description Input Output Sample Input 4 -1 10 -20 2 2 3 4 Sample Output 9       斜率优化 推式子 #include< ...

  4. 2017校赛 C: 不爱学习的小W【模拟】

    题目描述 “叮铃铃”上课了,同学们都及时到了教室坐到了座位上,教室里有n行m列的座位而且刚好坐满.既然是上课,那老师叫学生回答问题就是再正常不过的事了,同样地,教室里也就有爱学习和不爱学习的学生了,爱 ...

  5. 命名实体识别学习笔记——使用Ltp

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/xuewenstudy/article/d ...

  6. Revit安装失败怎样卸载重新安装Revit,解决Revit安装失败的方法总结

    技术帖:Revit没有按照正确方式卸载,导致Revit安装失败.楼主也查过网上关于如何解决Revit安装失败的一些文章,是说删除几个Revit文件和Revit软件注册表就可以解决Revit安装失败的问 ...

  7. WPF 线段Line过长渲染出现的问题

    原文:WPF 线段Line过长渲染出现的问题 在使用WPF的时候,可以做一个实验,在canvas里添加一条线段Line,StrokeThickness属性设置为1,然后通过放大canvas或者调整li ...

  8. 从零学React Native之05混合开发

    本篇文章,我们主要讨论如何实现Android平台的混合开发. RN给Android端发送消息 首先打开Android Studio, Open工程, 在React Native项目目录下选择andro ...

  9. corn表达式——用于设置定时任务[转载]

    原文地址https://blog.csdn.net/xiaopihai86/article/details/50756306 http://www.cronmaker.com/  cron表达式验证网 ...

  10. Knative Eventing 中如何实现 Registry 事件注册机制

    摘要: 在最新的 Knative Eventing 0.6 版本中新增了 Registry 特性, 为什么要增加这个特性, 该特性是如何实现的.针对这些问题,希望通过本篇文章给出答案. 背景 作为事件 ...