01:在C#中,string str = null 与 string str = “” 请尽量使用文字或图说明其中的区别
string str=null 把这个引用指向了一个null,没有地址没有值的地方。
string str="" 把这个引用指向了一个地址,地址里面存的是空的字符。
string str="" 就相当于一个人考试了,不过是考了0分;
而 string str=null 就相当于一个人没有考试,所以没有分数,但你不能说他是0分。
02:简述类和结构的相同点和不同点。并用代码举例。
异: 1.关键字不同 一个是class,一个是struct
2.类型不同,一个是引用类型,一个是值类型(一个堆区,一个栈区)
3.成员不同,结构体没有默认的构造函数(可以添加)和没有析构函数,不可以使用abstract,protected,sealed修饰
4.Struct变量使用完之后就自动解除内存分配,Class实例有垃圾回收机制来保证内存的回收处理
5.继承性。结构不可以继承自另一个结构或被继承,但和类一样可以继承自接口
6.在结构体中可以声明字段,但是声明字段的时候是不能给初始值的.
7.实体类中如果我们没有显示的定义构造函数,那么会有一个隐式无参的构造函数(重载构造函数之后,需要显示声明无参构造函数),而在结构体中隐身无参的构造函数无论如何都存在
8.在类中可以显示的定义无参的构造函数,而在结构体中我们不能显示的定义无参的构造函数
9.结构体是可以New的,而结构体构造函数要求必须要为所有的字段赋值.即使是无参的构造函数,也会给值类型赋初值为 0,引用类型赋初值为null
同: 1.都有属性和方法
2.和类一样可以继承自接口
//用struct声明
public struct Class1
{
public string name;//不能设初值
}
static void Main(string[] args)
{
Class1 class1;//无需new 直接定义对象即可
class1.name = "张三";//必须赋初值
}
//用class声明
public class Class1
{
public string name="张三";//可以设初值
}
static void Main(string[] args)
{
Class1 class1=new Class1();//需要new 初始化对象才可以使用
class1.name = "张三";//无需赋初值
}
03:什么是拆箱和装箱?举例说明
装箱 将值类型转换成引用类型。
int a = 0;//值类型
string b = a.ToString();//装箱成引用类型
拆箱 将引用类型转换成值类型。
string a = "0";//引用类型
int b = Convert.ToInt32(a);//拆箱成值类型
04:编程实现一个冒泡排序
int[] nums = { 1,5,4,2,3};
for (int i = 0; i < nums.Length; i++)
{
for (int j = i+1; j < nums.Length; j++)
{
//该数与其后面的数相比较,如果大于后面的数,则互相调换位置
if (nums[i]>nums[j])
{
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
}
05:编程实现一个递归方法
public int Add(int a) {
if (a==1||a==2)
{
return a;
}
//自己调自己
return Add(a - 2) + Add(a - 1);
}
06:说说目前学的集合有哪些?,每一种集合的特点以及使用场景
ArrayList:可以进行动态维护,访问元素时需要进行类型转换。对于需要快速随机访问元素,使用ArrayList
Hashtable:元素以键/值对的方式存在。访问元素时需要进行类型转换。对于需要以键值对存储的元素,使用ArrayList
List<T>:可以进行动态维护,访问元素时无需进行类型转换。对于常常处理不同类型数据转换的类,可以使用泛型定义。
Dictionary<K,V>:元素以键/值对的方式存在。访问元素时无需进行类型转换。
07:变量被标记为 “const” 和readonly” 有何不同?
1)const修饰的常量在声明的时候必须初始化;readonly修饰的常量则可以延迟到构造函数初始化
2)const修饰的常量在编译期间就被解析,即常量值被替换成初始化的值;readonly修饰的常量则延迟到运行的时候
此外const常量既可以声明在类中也可以在函数体内,但是static readonly常量只能声明在类中。
08:“out” 和 “ref” 参数有何不同?用代码举例
public string Out(out string str) {
str = "1";//必需先要为str参数赋值
return str;
}
static void Main(string[] args)
{
Class1 class1 = new Class1();
string str;
//只出不进 out参数在进入方法的时候,C#会自动清空它的一切引用和指向
Console.WriteLine(class1.Out(out str));
}
public string Ref(ref string str)
{
str = "1";//必需先要为str参数赋值
return str;
}
static void Main(string[] args)
{
Class1 class1 = new Class1();
string str="0";//ref参数的参数必须最先初始化
//是有进有出 ref参数在使用前必需初始化
Console.WriteLine(class1.Ref(ref str));
}
ref使用中,初始化,必须赋值,否则报错,使用中,输出的时候,不需要赋值
out使用中,初始化没有赋值,不会报错,使用中,输出结果的时候必须赋值,否则会报错
09:“StringBuilder” 和 “String” 有何不同?
String声明之后在内存中大小是不可修改的,而StringBuilder可以自由扩展大小(String分配在栈区,StringBuilder分配在堆区)