Unity面试题——C#语言

简介: Unity面试题——C#语言

1. 重载和重写的区别

  1. 所处位置不同 重载在同类中 重写在父子类中
  2. 定义方式不同 重载方法名相同 参数列表不同 重写方法名和参数列表都相同
  3. 调用方式不同 重载使用相同对象以不同参数调用 重写用不同对象以相同参数调用
  4. 多态时机不同 重载时编译时多态 重写是运行时多态

2. 面向对象的三大特点

封装、继承、多态 :

1.继承: 提高代码重用度,增强软件可维护性的重要手段,符合开闭原则。

2.封装: 封装是将数据和行为相结合,通过行为约束代码修改数据的程度,增强数据的安全性,属性 是 C#封装实现的最好体现。

3.多态性: 多态性是指同名的方法在不同环境下,自适应的反应出不同得表现,是方法动态展示的重要手段。

3. 简述值类型和引用类型有什么区别

1.值类型存储在内存栈中,引用类型数据存储在内存堆中,而内存单元中存放的 是堆中存放的地址。

2.值类型存取快,引用类型存取慢。

3.值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针和引用。

4.栈的内存是自动释放的,堆内存是.NET 中会由 GC 来自动释放。

5.值类型继承自 System.ValueType,引用类型继承自 System.Object。

4. 请简述 private,public,protected,internal 的区别

public:对任何类和成员都公开,无限制访问

private:仅对该类公开

protected:对该类和其派生类公开

internal:只能在包含该类的程序集中访问该类

protected internal:protected + internal

5. C#中所有引用类型的基类是什么

引用类型的基类是 System.Object 值类型的基类是 System.ValueType 同时,值类型也隐式继承自 System.Object

6. 请简述 ArrayList 和 List的主要区别

1.ArrayList 不带泛型 数据类型丢失

2.List 带泛型 数据类型不丢失

3.ArrayList 需要装箱拆箱 List不需要

7. 请简述 GC(垃圾回收)产生的原因,并描述如何避免?

GC 为了避免内存溢出而产生的回收机制

避免:1)减少 new 产生对象的次数

2)使用公用的对象(静态成员)

3)将 String 换为 StringBuilder

8. 请描述 Interface 与抽象类之间的不同

1.接口不是类 不能实例化 抽象类可以间接实例化

2.接口是完全抽象 抽象类为部分抽象

3.接口可以多继承 抽象类是单继承

9. 下列代码在运行中会产生几个临时对象?

其实在 C#中第一行是会出错的(Java 中倒是可行)。应该这样初始化:

string b = new string(new char[]{'a','b','c'});

忽略错误的话:

1."abc"
2.a.ToUpper()
3."123"
4.a.ToUpper()+"123"

10.下列代码在运行中会发生什么问题?如何避免?

会产生运行时错误,因为 foreach 是只读的。不能一边遍历一边修改。

11.请简述关键字 Sealed 用在类声明和函数声明时的作用

类声明时可防止其他类继承此类,在方法中声明则可防止派生类重写此方法。

12.反射的实现原理?

可以在加载程序运行时,动态获取和加载程序集,并且可以获取到程序集的信息 反射即在运行期动态获取类、对象、方法、对象数据等的一种重要手段

主要使用的类库:System.Reflection

核心类:

1.Assembly 描述了程序集

2.Type 描述了类这种类型

3.ConstructorInfo 描述了构造函数

4.MethodInfo 描述了所有的方法

5.FieldInfo 描述了类的字段

6.PropertyInfo 描述类的属性

通过以上核心类可在运行时动态获取程序集中的类,并执行类构造产生类对象,动态获取对象的字段 或属性值,更可以动态执行类方法和实例方法等。

13. .Net 与 Mono 的关系?

.Net 是一个语言平台,Mono 为.Net 提供集成开发环境,集成并实现了.NET 的编译器、CLR 和基础类 库,使得.Net 既可以运行在 windows 也可以运行于 linux,Unix,Mac OS 等。

14.在类的构造函数前加上 static 会报什么错?为什么?

构造函数格式为 public+类名如果加上 static 会报错(静态构造函数不能有访问修饰符)

原因:静态构造函数不允许访问修饰符,也不接受任何参数;无论创建多少类型的对象,静态构造函 数只执行一次;运行库创建类实例或者首次访问静态成员之前,运行库调用静态构造函数;静态构造 函数执行先于任何实例级别的构造函数;显然也就无法使用 this 和 base 来调用构造函数。

15.C# String 类型比 stringBuilder 类型的优势是什么?

如果是处理字符串的话,用 string 中的方法每次都需要创建一个新的字符串对象并且分配新的内存地 址,而 stringBuilder 是在原来的内存里对字符串进行修改,所以在字符串处理 方面还是建议用 stringBuilder 这样比较节约内存。但是 string 类的方法和功能仍然还是比 stringBuilder 类要强。

string 类由于具有不可变性(即对一个 string 对象进行任何更改时,其实都是创建另外一个 string 类的 对象),所以当需要频繁的对一个 string 类对象进行更改的时候,建议使用 StringBuilder 类, StringBuilder 类的原理是首先在内存中开辟一定大小的内存空间,当对此 StringBuilder 类对象进行更改 时, 如果内存空间大小不够, 会对此内存空间进行扩充,而不是重新创建一个对象,这样如果对一个 字符串对象进行频繁操作的时候,不会造成过多的内存浪费,其实本质上并没有很大区别,都是用来 存储和操作字符串的,唯一的区别就在于性能上。String 主要用于公共 API,通用性好、用途广泛、读取性能高、占用内存小。 StringBuilder 主要用于拼接 String,修改性能好。 不过现在的编译器已经把 String 的 + 操作优化成 StringBuilder 了, 所以一般用 String 就可以了 String 是不可变的,所以天然线程同步。 StringBuilder 可变,非线程同步。

16.C# 函数 Func(string a, string b)用 Lambda 表达式怎么写?

(a,b) => {};

17.数列 1,1,2,3,5,8,13...第 n 位数是多少?用 C#递归算法实现

public int CountNumber(int num) {
if (num == 1 || num == 2) {
return 1;
} else { return CountNumber(num -1) + CountNumber(num-2);
}
}

18.冒泡排序(手写代码)

public static void BubblingSort(int[]array) {
for (int i = 0; i < array.Length; i++){
for (int j = array.Length - 1; j > 0; j--){
if (array[j] < array[i]) {
int temp = array[j];
array[j] = array[j-1];
array[j - 1] = temp;
} } } }

19.C#中有哪些常用的容器类,各有什么特点。

List,HashTable,Dictionary,Stack,Queue

List:索引泛型容器 访问速度快 修改速度慢

HashTable/Dictionary:散列表格式 查询效率高 空间占用较大

Stack:后进先出

Queue: 先进先出

20.C#中常规容器和泛型容器有什么区别,哪种效率高?

不带泛型的容器需要装箱和拆箱操作 速度慢 所以泛型容器效率更高 数据类型更安全

21.有哪些常见的数值类?

简单值类型--包括 整数类型、实数类型、字符类型、布尔类型

复合值类型--包括 结构类型、枚举类型

22.C#中委托和接口有什么区别?各用在什么场合?

接口(interface)是约束类应该具备的功能集合,约束了类应该具备的功能,使类从千变万化的具体 逻辑中解脱出来,便于类的管理和扩展,同时又合理解决了类的单继承问题。

C#中的委托是约束方法集合的一个类,可以便捷的使用委托对这个方法集合进行操作。

在以下情况中使用接口:

1.无法使用继承的场合

2.完全抽象的场合

3.多人协作的场合 以上等等

在以下情况中使用委托:多用于事件处理中

23.C#中 unsafe 关键字是用来做什么的?什么场合下使用?

非托管代码才需要这个关键字 一般用在带指针操作的场合

24.C#中 ref 和 out 关键字有什么区别?

ref 修饰参数,表示进行引用传递,out 修饰参数也表示进行引用传递,但传递的引用只为带回返回值 ref 又进又出 out 不进只出

25.For,foreach,Enumerator.MoveNext 的使用,与内存消耗情况

for 循环可以通过索引依次进行遍历,foreach 和 Enumerator.MoveNext 通过迭代的方式进行遍历。内存 消耗上本质上并没有太大的区别。但是在 Unity 中的 Update 中,一般不推荐使用 foreach 因为会遗留 内存垃圾。

26.函数中多次使用 string 的+=处理,会产生大量内存垃圾(垃圾碎片),有

什么好的方法可以解决。

通过 StringBuilder 那进行 append,这样可以减少内存垃圾

27.当需要频繁创建使用某个对象时,有什么好的程序设计方案来节省内存?

设计单例模式进行创建对象或者使用对象池

28.JIT 和 AOT 区别

Just-In-Time - 实时编译

执行慢 安装快 占空间小一点

Ahead-Of-Time - 预先编译

执行快 安装慢 占内存占外存大29.给定一个存放参数的数组,重新排列数组

void SortArray(Array arr){Array.Sort(arr);}

30.Foreach 循环迭代时,若把其中的某个元素删除,程序报错,怎么找到那

个元素?以及具体怎么处理这种情况?(注:Try.....Catch 捕捉异常,发送

信息不可行)

foreach 不能进行元素的删除,因为迭代器会锁定迭代的集合,解决方法:记录找到索引或者 key 值, 迭代结束后再进行删除。

31.GameObject a=new GameObject() GameObject b=a 实例化出来了 A,

将 A 赋给 B,现在将 B 删除,问 A 还存在吗?

存在,b 删除只是将它在栈中的内存删除,而 A 对象本身是在堆中,所以 A 还存在

32.你拥有 A 块钱,一瓶水 B 块钱,每瓶水可以得到一个瓶盖,每 C 个瓶盖

可以换一瓶水请写出函数求解上面题目,上面题目 ABC 为参数

public static int Buy(int a,int b,int c) {
return a/b + ForCap(c,a/b);
}
public static int ForCap(int c,int d) {
if (d<c) {
return 0;
} else {
return d/c + ForCap(c,d/c + d%c);
}}

33.有一排开关,第一个人把所有的开关打开,第二个人按 2 的倍数的开关,

第三个人按 3 的倍数的开关,以此类推,现在又 n 个开关,k 个人,写函

数求最后等两者的开关,输入参数 n 和 k

static void Main(string[] args) {
int n = int.Parse(Console.ReadLine()); int k = int.Parse(Console.ReadLine());
Function(100,100);
}
static void Function(int n, int k) {
int i, j = 0;
bool[] a = new bool[1000]; //初始 false:关灯,true:开灯
for (i = 1; i <= k; i++) //k 个人
for (j = 1; j <= n; j++) //n 个灯
if (j % i == 0)
a[j] = !a[j]; //取反,false 变 true,原来开变关,关变开
for (i = 1; i <= n; i++) //最后输出 a[i]的值就可以了
if (a[i]) //灯亮着
Console.WriteLine(i);
}

34.数制转换,将任意整数转换成 8 进制形式

static void Main(string[] args) {
int n;
n =int.Parse(Console.ReadLine());
Console.WriteLine("输入的 10 进制为:{0}",n);
Console.Write("转换为 8 进制数为: ");
d2o(n);
}
static void d2o(int n) {
if (n > 7) {
d2o(n / 8);
}
Console.Write(n%8);
}

35.找出 200 以内的素数。

static void Main(string[] args) {
int count = 0;
for (int i = 1; i < 200; i++) { //外层循环:要判断的数
for (int j = 2; j <=i; j++){
if (i % j == 0&& i!=j) {
break;
}
if (j == i ) { //结束的条件:最后一个数还没有被整除
count++;
Console.WriteLine(i);
} }
}
Console.WriteLine(count);
}

36.打印杨辉三角形

public static void YHSJ(){
int [][]a= new int[7][] ;
a[0] = new int[1]; //a[0][0]=1;
a[1] = new int[2] ;
for (int i = 0; i < 7; i++) {
a[i] = new int[i+1] ;
a[i][0] =1;
a[i][i]=1;
if(i>1) { //求出中间的数据
for(int j=1;j<i; j++){
a[i][j]= a[i-1][j-1]+a[i-1][j];
}
}
}
for (int i=0; i<a.Length; i++) {
for (int k = 0; k < a.Length-1-i; k++) {
Console.Write("");
}
for(int j=0;j<a[i].Length; j++ ) {
Console.Write(a[i][j] + "");
}
Console.WriteLine();
}
}

37.中国有句俗话“三天打鱼两天晒网”,某人从 2000 年 1 月 1 日起开始

“三天打鱼两天晒网”,问这个人在今后的某天中“打鱼”还是”晒网”

public static void Compute(){
Console.WriteLine ((DateTime.Now - DateTime.Parse("2000-01-01")).Days%5<3?"打鱼":"晒网");

}38.假设当前市场价一只鸡 10 元,一只鸭 12 元 5 角。请写一个函数

ShowPrice,输入参数分别为鸡和鸭的个数(非负整型),功能为显示出总

价钱,精确到分。例如调用 ShowPrice(5,10)后输出 175.00。请注意程

序的可读性和易于维护性。

static void ShowPrice(int num_chicken, int num_duck) {
float totalPrice = 0.00f;
float price_chicken = 10f;
float price_duck = 12.5f;
totalPrice = num_chicken * price_chicken + num_duck * price_duck;
Console.WriteLine("总价钱为:{0:0.00}", totalPrice);
}

39.请写一个函数,用于返回 n!(阶乘)结果末尾连续 0 的个数,如

GetZeroCount(5)返回 1,因为 5!

= 120,末尾连续 1 个 0

static void ShowPrice(int num_chicken, int num_duck) {
float totalPrice = 0.00f;
float price_chicken = 10f;
float price_duck = 12.5f;
totalPrice = num_chicken * price_chicken + num_duck * price_duck;
Console.WriteLine("总价钱为:{0:0.00}", totalPrice);
}
目录
相关文章
|
3月前
|
存储 开发框架 .NET
C#语言究竟隐藏了哪些秘密?一文带你揭开编程界的神秘面纱
【8月更文挑战第22天】C#是微软推出的面向对象编程语言,以其简洁的语法和强大的功能,在软件开发领域占据重要地位。作为一种强类型语言,C#确保了代码的可读性和可维护性。它支持多种数据类型,如整型、浮点型及复合类型如类和结构体。类是核心概念,用于定义对象的属性和行为。C#还包括方法、异常处理、集合类型如列表和字典,以及泛型和LINQ等高级特性,支持异步编程以提高应用响应性。.NET Core的推出进一步增强了C#的跨平台能力。
73 3
|
1月前
|
JSON C# 开发者
C#语言新特性深度剖析:提升你的.NET开发效率
【10月更文挑战第15天】C#语言凭借其强大的功能和易用性深受开发者喜爱。随着.NET平台的演进,C#不断引入新特性,如C# 7.0的模式匹配和C# 8.0的异步流,显著提升了开发效率和代码可维护性。本文将深入探讨这些新特性,助力开发者在.NET开发中更高效地利用它们。
34 1
|
1月前
|
存储 开发框架 .NET
C#语言如何搭建分布式文件存储系统
C#语言如何搭建分布式文件存储系统
70 2
|
1月前
|
存储 开发框架 .NET
常见20道C#面试的题
常见20道C#面试的题
30 1
|
2月前
|
前端开发 Java C#
C#语言的优缺点?
C#语言的优缺点?
103 3
|
2月前
|
安全 IDE Java
C#语言的
C#语言是一种面向对象的编程语言
31 1
|
2月前
|
IDE C# 开发工具
C# 语言的主要优势是什么?
C# 语言的主要优势是什么?
101 2
|
2月前
|
算法 程序员 Go
PHP 程序员学会了 Go 语言就能唬住面试官吗?
【9月更文挑战第8天】学会Go语言可提升PHP程序员的面试印象,但不足以 solely “唬住” 面试官。学习新语言能展现学习能力、拓宽技术视野,并增加就业机会。然而,实际项目经验、深入理解语言特性和综合能力更为关键。全面展示这些方面才能真正提升面试成功率。
57 10
|
2月前
|
监控 安全 C#
C# 语言助力员工监控系统的完善
在数字化时代,企业日益重视员工管理的效率与精准度,员工监控系统因此成为提升管理水平的有效工具。C# 语言凭借其简洁、高效和安全的特点,在开发此类系统中扮演了重要角色,可实现实时监控员工电脑操作、网络行为及工作时间统计等功能,从而提高工作效率并保障企业利益。同时,企业在应用这些技术时也需关注员工隐私权的保护。
26 6
|
3月前
|
JSON C# 开发者
💡探索C#语言进化论:揭秘.NET开发效率飙升的秘密武器💼
【8月更文挑战第28天】C#语言凭借其强大的功能与易用性深受开发者喜爱。伴随.NET平台演进,C#持续引入新特性,如C# 7.0的模式匹配,让处理复杂数据结构更直观简洁;C# 8.0的异步流则使异步编程更灵活高效,无需一次性加载全部数据至内存。通过示例展示了模式匹配简化JSON解析及异步流实现文件逐行读取的应用。此外,C# 8.0还提供了默认接口成员和可空引用类型等特性,进一步提高.NET开发效率与代码可维护性。随着C#的发展,未来的.NET开发将更加高效便捷。
61 1