1.在C#中,string str = null 与 string str = “” 请尽量使用文字或图象说明其中的区别。
string str=null 把这个引用指向了一个null,没有地址没有值的地方
string str="" 把这个引用指向了一个地址,地址里面存的是空的字符
2.简述类和结构的相同点和不同点。并用代码举例。
class Person
{
private string name;
private int age;
public void SayHi()
{
Console.WriteLine($"Hello,{this.name},{this.age}");
}
}
struct Rectangle
{
private int width;
private int height;
public int GetArea()
{
return this.width * height;
}
}
3.什么是拆箱和装箱?举例说明
装箱:将值类型包装为引用类型
拆箱:将引用类型转换为值类型
4.编程实现一个冒泡排序
int temp = 0;
int[] arr = {23, 44, 66, 76, 98, 11, 3, 9, 7};
for (int i = 0; i < arr.Length - 1; i++)
{
for (int j = 0; j < arr.Length - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
}
5.编程实现一个递归方法
public struct Sumj
{
public int Sum(int sum)
{
if (sum==1)
{
return sum;
}
return sum * Sum(sum - 1);
}
}
6.说说目前学的集合有哪些?,每一种集合的特点以及使用场景
泛型的List 类提供了不限制长度的集合类型,List在内部维护了一定长度的数组(默认初始长度是4),当我们插入元素的长度超过4或者初始长度 的时候,会去重新创建一个新的数组,这个新数组的长度是初始长度的2倍(不永远是2倍,当发现不断的要扩充的时候,倍数会变大),然后把原来的数组拷贝过来。所以如果知道我们将要用这个集合装多少个元素的话,可以在创建的时候指定初始值,这样就避免了重复的创建新数组和拷贝值。
另外的话由于内部实质是一个数组,所以在List的未必添加数据是比较快的,但是如果在数据的头或者中间添加删除数据相对来说更低效一些因为会影响其它数据的重新排列。
7.变量被标记为 “const” 和"readonly” 有何不同?
const修饰的常量在声明的时候必须初始化;readonly修饰的常量则可以延迟到构造函数初始化
const修饰的常量在编译期间就被解析,即常量值被替换成初始化的值;readonly修饰的常量则延迟到运行的时候
8.“out” 和 “ref” 参数有何不同?用代码举例
public class Class1
{
public int Show1(out int num1)
{
num1 = 10;
return num1;
}
public int Show2(ref int num2)
{
return num2;
}
}
9.“StringBuilder” 和 “String” 有何不同?
String 在进行运算时(如赋值、拼接等)会产生一个新的实例,而 StringBuilder 则不会。
所以在大量字符串拼接或频繁对某一字符串进行操作时最好使用 StringBuilder,不要使用 String
如果要操作一个不断增长的字符串,尽量不用String类,改用StringBuilder类。
两个类的工作原理不同:String类是一种传统的修改字符串的方式,它确实可以完成把一个字符串添加到另一个字符串上的工作没错。
但是在.NET框架下,这个操作实在是划不来。因为系统先是把两个字符串写入内存,接着删除原来的String对象,然后创建一个String对象,并读取内存中的数据赋给该对象。这一来二去的,耗了不少时间。
而使用System.Text命名空间下面的StringBuilder类就不是这样了,它提供的Append方法,能够在已有对象的原地进行字符串的修改,简单而且直接。当然,一般情况下觉察不到这二者效率的差异,但如果你要对某个字符串进行大量的添加操作,那么StringBuilder类所耗费的时间和String类简直不是一个数量级的。