很少会有人可以答对,如果你遇到一个来面试的人实在嚣张,就可以用本文的题去打击
本文内容就看着玩,请不要在严肃的面试中问题这样的题目
如果面试到一个人可以回答出下面的题目也不能证明他的技术很强,只能说明他了解很多C#相关,或者他看过我的博客
循环下面的代码
请在下面的代码的注释处填写代码,让函数 Foo 里面的代码输出
static void Main ( string [] args )
// 请在此处写代码,调用 Foo 函数内的输出代码
private static void Foo ()
Console. WriteLine ( " 尝试调用 Foo 函数执行这一句代码 " );
参考答案
使用一个线程调用的方式,调用之后结束线程,此时就会输出
static void Main ( string [] args )
// 请在此处写代码,调用 Foo 函数内的输出代码
var thread = new Thread (Foo);
thread. Abort (); // 这时就会结束循环
注意,在 dotnet core 不支持 Abort 方法
从空转换
请写出 IFoo 和 Foo 的实现,让下面的代码不会抛出空异常
static void Main ( string [] args )
参考答案
public string Name { get ; set ; }
public static implicit operator Foo ( IFoo foo )
等待不存在的类
请添加新的类的代码让下面的代码编译通过
static async Task Main ( string [] args )
Foo foo = await ( object ) null ;
public string Name { get ; set ; }
参考答案
public class HeabdsdnbKevx : INotifyCompletion
public bool IsCompleted { get ; }
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 ()
因为返回值是 string 所以又可以继续等待
如何不执行 finally 里面的代码
这里有一个代码,需要让 finally 里面的代码不执行,现在你只能写 Foo 方法,同时这个方法不能运行无限长时间
Console. WriteLine ( " 不要让这个代码运行 " );
参考答案
因为不能让 Foo 运行无限长,就不能使用无限循环的方法,可以使用的方法有 Environment.FailFast 或 Environment.Exit 退出
private static void Foo ()
或者进行堆栈溢出,如下面代码
private static void Foo ()
或者 少珺 小伙伴的不安全代码申请
private static void Foo ()
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 的值是多少?
public int N { get ; } = 1 ;
参考答案
1
可能有小伙伴认为在 2 + foo?.N
这时如果 foo 为空就应该返回 ??
后面的值,但是这是不对的上面的代码是和下面的代码差不多等同的
而不是和下面的代码等价的
在表达里面只有 ?
的值为空,那么就不会执行
等等,为什么上面的代码说的是差不多等同而不是等价,因为尝试运行下面代码,会看到 Hi 输出,多谢 九鼎 指出
Console. WriteLine ( " Hi. " );
var n = 2 + foo ? .N + foo2.N ?? 1 ;
上面代码中,第一个 foo?.N
会进行判断,因为 foo 不存在,所以整个表达式没有执行,但是表达式内的逻辑依然执行
或者试试下面代码就知道了
static void Main ( string [] args )
int n = Lindexi () + foo ? .N ?? 1 ;
private static int Lindexi ()
Console. WriteLine ( " 林德熙是逗比 " );
public int N { get ; } = 1 ;
值得一提的是,如果你自己在阅读以上代码的时候,对计算的结果不能一眼看出来,那就证明以上的代码写法是在挖坑。在正经的开发过程中,咱要尽量避免如此挖坑的写法,一个好的参考方法是加上括号。没错,按照你期望的加上括号,根据实际的需求加上括号,如 var n = 2 + (foo?.N ?? 1);
和 var n = (2 + foo?.N) ?? 1;
将让阅读者明确了解执行逻辑
感谢 炜来 指出括号的问题
这些其实都是运算符优先级问题,详细请参阅 C# 运算符和表达式 - C# 参考 - Microsoft Learn 官方文档
举一反三: 如使用 switch 等关键词参与计算的问题,如以下代码,猜猜 x 的值是多少
答案是由于 switch 优先级比 *
高,上述代码等价于如下代码
许多开发者印象里面都是乘法运算符比 switch 高,这是不对的
现实开发我是更推荐多加括号的写法,不要让开发者去猜优先级
模式匹配
请问下面代码输出什么?
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 )
Console. WriteLine (a is B b & c);
Console. WriteLine (a is B b1 > c );
Console. WriteLine (a is B b2 < c );
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
用的 B
是 class
不是定义的属性,对 a is B b5
返回的是 bool
所以将会是 bool
与 B
之间的运算
原文链接: http://blog.lindexi.com/post/C-%E9%AB%98%E7%BA%A7%E9%9D%A2%E8%AF%95%E9%A2%98
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
欢迎转载、使用、重新发布,但务必保留文章署名 林德熙 (包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我 联系 。