01:在C#中,string str = null 与 string str = “” 请尽量使用文字或图
象说明其中的区别。
string str = null 是不给他分配内存空间,
而string str = "" 给它分配长度为空字符串的内存空间。
02:简述类和结构的相同点和不同点。并用代码举例。
语法定义: 异:
1.关键字不同 一个是class,一个是struct
2.类型不同,一个是引用类型,一个是值类型(一个堆区,一个栈区)
3.成员不同,结构体没有默认的构造函数(可以添加)和没有析构函数,不可以使用abstract,protected,sealed修饰
4.Struct变量使用完之后就自动解除内存分配,Class实例有垃圾回收机制来保证内存的回收处理
5.继承性。结构不可以继承自另一个结构或被继承,但和类一样可以继承自接口
6.在结构体中可以声明字段,但是声明字段的时候是不能给初始值的.
7.实体类中如果我们没有显示的定义构造函数,那么会有一个隐式无参的构造函数(重载构造函数之后,需要显示声明无参构造函数),而在结构体中隐身无参的构造函数无论如何都存在
8.在类中可以显示的定义无参的构造函数,而在结构体中我们不能显示的定义无参的构造函数
9.结构体是可以New的,而结构体构造函数要求必须要为所有的字段赋值.即使是无参的构造函数,也会给值类型赋初值为0,引用类型赋初值为null
同:
1.都有属性和方法
2.和类一样可以继承自接口
//定义类的语法
class Class1
{
private string name;
private int age;
public void SayHi()
{
Console.WriteLine("Hello,My Name is " + this.name + ",My Age is " + this.age);
}
}
//定义结构的语法.
struct Rectangle
{
private int width;
private int height;
public int GetArea()
{
return this.width * height;
}
}
03:什么是拆箱和装箱?举例说明
1.装箱,值类型向引用类型转换:
在托管堆中分配内存,分配的内存量是类型各字段所需的内存量+类型对象指针所需的内存量+同步块索引所需的内存量。
值类型的字段复制到分配好的内存中
返回对象地址,现在对象地址是对象引用
2.拆箱,引用类型向值类型转换:
获取已装箱类型中的未装箱部分,也就是对象的原始值的各个字段
复制字段的值从堆中到栈中的值类型实例中
//装箱的例子
//装箱允许将值类型隐式转化成引用类型还是在Main方法里面
iint i = 2008;
object obj = i;
Console.WriteLine("1.i的值为{0},装箱之后的对象为{1}",i,obj);
i = 927;
Console.WriteLine("2.i的值为{0},装箱之后的对象为{1}",i,obj);
Console.ReadKey();
//程序运行结果
//1.i的值为2008,装箱之后的对象为2008.
//2.I的值为927,装箱之后的对象为2008
//拆箱例子
//拆箱允许将引用类型显示转换为值类型,下面通过一个实例演示拆箱的过程
int i = 112;
object obj = i;
Console.WriteLine("装箱操作:值为{0},装箱之后的对象为{1}",i,obj);
int j = (int)obj;
Console.WriteLine("拆箱操作,装箱的对象为{0},值为{1}", obj, j);
Console.ReadKey();
//程序运行后的结果
//装箱操作:值为112,装箱之后对象为112
//拆箱操作:装箱对象为112,值为112
04:编程实现一个冒泡排序
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CH02
{
class Program
{
static void Main(string[] args)
{
int a = 0;
int[] num = new int[] { 19, 1, 38, 49, 85, 16, 867, 282 };
for (int i = 0; i < num.Length - 1; i++)
{
for (int j = 0; j < num.Length - 1 - i; j++)
{
if (num[j] > num[j + 1]) //降序改为“<”
{
a = num[j];
num[j] = num[j + 1];
num[j + 1] = a;
}
}
}
Console.WriteLine("从小到大排序:");
foreach (int number in num)
{
Console.Write(number + " ");
}
Console.ReadKey();
}
}
}
05:编程实现一个递归方法
static int f(int n)
{
//一列数的规则如下:1、1、2、3、5、8、13、21、34......求第30位数是多少,用递归算法实现。
if (n == 1 || n == 2)
return 1;
return f(n - 2) + f(n - 1);
}
static void Main(string[] args)
{
Console.WriteLine(f(30));
}
06:说说目前学的集合有哪些?,每一种集合的特点以及使用场景
答:ArrayList,List,Hashtable,Dictionary<key,value>
ArrayList和List获取,删除元素是通过下标或对象名获取;
Hashtable,和Dictionary<key,value>获取,删除元素是通过key获取。
List和Dictionary<key,value>访问元素无须转换。
07:变量被标记为 “const” 和readonly” 有何不同?
答:const修饰的常量在声明的时候必须初始化;readonly修饰的常量则可以延迟到构造函数初始化;const只读,但不能修改,readonly只读可修改
08:“out” 和 “ref” 参数有何不同?用代码举例
答:ref是引用把值类型转换成弓用,out是输出,区别是ref是输入兼输出的,out只是单纯的输出
public void num(ref int num1, ref int num2){ }
public void num(out int num1, out int num2){ }
09:“StringBuilder” 和 “String” 有何不同?
答:用string += 追加的时候会分配新的地址,StringBuilder不会,所以StringBuilder的运行速度会快,不会浪费资源空间。