C# 题目
计算机组成原理
1、为什么计算的补数(补码)=反码+1?
题目 http://blog.zhaojie.me/2011/03/my-interview-questions-for-dotnet-programmers.html
1、考察对常量和自读字段 初始化过程的了解
static readonly int A = C * D; static readonly int B = 10; const int C = 5; static readonly int D = B * C; static void Main(string[] args) { Console.WriteLine("{0},{1},{2},{3}", A, B, C, D); Console.ReadKey(); }
问:A、B、C、D数值是多少?
扩展 1.1、 考察对类初始化过程的了解
class A { public static int X; static A() { X = B.Y + 1; } } class B { public static int Y = A.X + 1; static B() { } static void Main(string[] args) { Console.WriteLine("X={0},Y={1}", A.X, B.Y); } }
X =? Y=?
扩展1.2 仔细看题目 考察对类初始化过程的了解
class A { public static int X; static A() { X = B.Y + 1; } } class B { public static int Y = A.X + 1; static B() { Y = A.X + 4; } } class Program { static void Main(string[] args) { Console.WriteLine("X={0},Y={1}", A.X, B.Y); } }
X =? Y=?
扩展1.3 仔细看题目 考察对类初始化过程的了解
String s="a"+"b"+"c",到底创建了几个对象?
题目2 考察对匿名方法的了解:
class Program { private delegate void TestDelegate(); static void Main(string[] args) { TestDelegate[] delegates = new TestDelegate[2]; int outside = 0; for(int i = 0; i < 2; i++) { int inside = 0; delegates[i] = delegate { Console.WriteLine("({0},{1})", outside, inside); outside++; inside++; }; } delegates[0](); delegates[0](); delegates[0](); delegates[1](); delegates[1](); Console.ReadKey(); } }
输出值是多少:答案https://blog.csdn.net/Rvng2014/article/details/101413582
题目3考察对匿名方法的了解:如何修改让他出现预期效果 期望输出是 0,2,4,6,8
List<Func<int>> actions = new List<Func<int>>(); int variable = 0; while (variable < 5) { delegates[variable] = delegate { Console.WriteLine("({0} )", outside); outside++; }; actions.Add(() => variable * 2); ++variable; } foreach (var act in actions) { Console.WriteLine(act.Invoke()); }
这个程序 运行结果是什么:如何修改
答案:https://www.yht7.com/news/160155
题目4、输出结果是什么
public class Test { public readonly struct Point { public Point(int x, int y) => (X, Y) = (x, y); public int X { get; } public int Y { get; } } static Point Transform(Point point) => point switch { { X: 0, Y: 0 } => new Point(0, 0), { X: var x, Y: var y } when x < y => new Point(x + y, y), { X: var x, Y: var y } when x > y => new Point(x - y, y), { X: var x, Y: var y } => new Point(2 * x, 2 * y), }; static void Main() { Point i = new(1, 0); Console.WriteLine(Transform(i)); } }
考察对逆变和协变的理解
interface IFoo<in T>
{
}
interface IBar<in T>
{
void Test(IFoo<T> foo); //对吗?
}
答案:在编译时和不报错,但是这个接口不错继承。
题目5、有了 委托字段/属性,为什么还需要事件呢?
答案:https://www.cnblogs.com/cdaniu/p/15367766.html
题目6、事件参数EventArgs.Empty字段有什么意义?是什么意思?
答案:https://www.cnblogs.com/cdaniu/p/15382744.html
题目7、 内存泄漏的一个常见来源有哪些
答案:1、事件处理器,会延长对象的声明周期,导致内存泄漏。
2、在匿名方法中捕获类成员。
3、静态变量 例如:让静态字段指向一个集合对象(因为)。因为静态字段的引用会一直存在,直到加载类型的AppDomain卸载为止。
https://zhuanlan.zhihu.com/p/141032986
题目8、字符串为什么做引用类型?为什么字符串赋值 ,做参数都和值类型一样。
题目9、考察多字符的理解
string a = new string(new char[] {'a', 'b', 'c'}); object o = String.Copy(a); Console.WriteLine(object.ReferenceEquals(o, a)); String.Intern(o.ToString()); Console.WriteLine(object.ReferenceEquals(o, String.Intern(a))); object o2 = String.Copy(a); String.Intern(o2.ToString()); Console.WriteLine(object.ReferenceEquals(o2, String.Intern(a)));
输出结果是什么:
9.1 扩展题目 考察对string 特性的了解
string s = new string(new char[] { 'x', 'y', 'z' }); Console.WriteLine(String.IsInterned(s) ?? "not interned"); String.Intern(s); Console.WriteLine(String.IsInterned(s) ?? "not interned"); Console.WriteLine(object.ReferenceEquals( String.IsInterned(new string(new char[] { 'x', 'y', 'z' })), s)); //当最后一行代码为: Console.WriteLine(object.ReferenceEquals("xyz", s)); //输出结果是什么 //当最后一行代码为: Console.WriteLine(object.ReferenceEquals("x" + "y" + "z", s)); //输出结果是什么 //当最后一行代码为: Console.WriteLine(object.ReferenceEquals(String.Format("{0}{1}{2}", 'x', 'y', 'z'), s)); //输出结果是什么
9.2 扩展题目:考察委托的相等性
Action a = () => Console.WriteLine("a"); Action b = () => Console.WriteLine("a"); Console.WriteLine(a == b); Console.WriteLine(a + b == a + b); Console.WriteLine(b + a == a + b);
輸出結果是:
9.3 扩展题目:对== 和 equals的了解
int i1 = 8; int i2 = 8; bool bo5 = ((object)i1).Equals(i2); Console.WriteLine(bo5); bool bo2 = (object)i1 == (object)i2; Console.WriteLine(bo2);
输出的结果是:
10、为什么struct 实例字段不能初始值设定
11、引用类型和值类型是针对编译时还是运行时?
12、软件是如何实现跨平台的?
13、Win32平台是什么与.net平台有关系
14、写出x=? y=? a=? b=?组合的所有可能出现的结果。主要考察队volatile关键字和内存屏障、重排序的的应用
using System; using System.Threading; using System.Threading.Tasks; namespace MemoryBarriers { class Program { static volatile int x, y, a, b; static void Main() { while (true) { var t1 = Task.Run(Test1); var t2 = Task.Run(Test2); Task.WaitAll(t1, t2); if (a == 0 && b == 0) { Console.WriteLine("{0}, {1}", a, b); } x = y = a = b = 0; } } static void Test1() { x = 1; a = y; } static void Test2() { y = 1; b = x; } } }
15、指针和句柄有啥区别?
16、异步操作一定要开辟新线程?
17、finally内的代码一定会执行吗?
18、如何修改 ,以下代码,完成任务
目的是:每个2s继续一次垃圾回收
发生错误:只执行一次
原因:t被垃圾回收了。 当第一次执行垃圾回收时候GC发现 t 声明后再无引用。所以就被回收了。
源代码
public static void Main() {
Timer t = new Timer(TimerCallback, null, 0, 2000);
Console.ReadLine();
t = null;
}
19、为什么我们需要析构函数?
20、AOT,JIT是什么?
21、元数据在.net 中的应用有哪些
22、数组初始值设定项 例如:A[] a=new A{a,s,f}。为什么要省略 new A从而变成A[] a={a,s,f}
23、为什么C# jsonserializeOption中默认不识别尾部逗号、默认不包含字段、默认不skip注释?
24、xml为什么要写<?xml version='1.0'?>
25、Encoding.UTF8 与 new UTF8Encoding(false) 有什么区别
26、数组的元素访问时间复杂度是多少,删除、插入数组元素的复杂度是多。为什么数组可以通过索引来访问?
27、算法的时间复杂度是多少
void loss(int n){ int i=1; while(i<=n){ i=I*2; } }
28、关于算法的时间复杂度很多都用包含O(logN)这样的描述,但是却没有明确说logN的底数究竟是多少。
29、
二、这货还是不是平衡二叉树?
判断一棵平衡二叉树(AVL树)有如下必要条件:
条件一:必须是二叉搜索树。
条件二:每个节点的左子树和右子树的高度差至多为1。
30、为什么要发明红黑树?
31、最好的排序法是谁
32、什么是堆
堆是完全二叉树,虽然堆的典型实现方法是数组,但从逻辑的角度上讲,堆实际上是一种树结构。
小根堆:完全二叉树中,根≤左、右
大根堆:完全二叉树中,根≥左、右
33、为啥减法运算可以转化成加法运算,原理是什么?
34、以下结构体的内存是多少?
struct MyStruct { int a; decimal b;//decimal由4int组成,因此它不是最长的,double才是最长的。 double c; }
35、结构体的内存对齐规则是什么?
36、为什么依赖比关联的耦合度低?
37、C# 为什么不支持多重继承?
38、判断偶数?