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