C#基础2
C#中的对象声明跟指针很类似,当new的时候才生成对象
Class A{int a;}
A a = new A(); 这句话的意思是new一个A的对象,然后用a指向它。
A b = a; 这句话的意思是让b指向a指向的对象,也就是ab指向了同一个对象。总共还是只有一个对象,C#中只有new才会产生新的对象。
C#中对象的传递是引用传递,如上面所说,而对变量的传递则是拷贝传递,也就是复制过去,因为对象占得内存比较大,且复杂,而变量为基础类型,占得内存小且简单。
基本类型属于值类型(ValueType),赋值为拷贝传递;
对象为引用类型,复制为引用传递。
C#中所有的类都继承自Object类
异常
若try块中的一句代码出现异常,则块中该代码以下的代码不会被执行,而执行catch块的代码,再执行trycath块下面的代码。
可以用throw new Expection(“我自己的异常”);来自己抛出异常,然后catch(Expection ex){Console.WriteLine(ex.Message);}来获取异常。
Static
不需要new就能用的成员为静态成员,静态成员一开始就会被分配空间,之后也是指向同一个空间。
也就是类中带static的变量和函数不需要new对象就能直接用。
静态成员永远只有一个实例,故没法通过类对象来访问类中的静态成员(包括静态函数和静态变量),他们的内存区也不同。
静态方法能调用静态成员,不能调用非静态成员。
非静态方法可以调用静态成员,也可以调用非静态成员。
一个类中的静态成员是与实例无关的变量,比如Person类的人口总数变量,汇报人口总数的函数,那么当静态方法访问非静态成员的时候相当于是汇报人口总数的函数来汇报单个人的信息,这样是不合理的,而非静态方法访问静态成员相当于是单个人汇报人口总数,这是合理的。
静态类通常用于实现函数库,直接调用里面的函数,而不实例化对象。
Namespace
不同的命名空间内的命名可以重名。
一个命名空间内要用别的命名空间中的关键词要在前面加上所在命名空间的名字,且每一个都要。或者在文件开头加上using 命名空间。
索引器
//索引器用
publicclass CSuoyinqi
{
privateint a;
privateint b;
publicint this[int index]//第一个int为索引器的返回值,第二个int是参数,参数可以有多个
{
set
{
if (index == 1)
{
b = value;
}
else if (index == 0)
{
a = value;
}
else
{
throw new Exception("错误的序号");
}
}
get
{
if (index==1)
{
return b;
}
else if (index==0)
{
return a;
}
else
{
throw new Exception("错误的序号");
}
}
}
}
String[i]得到string字符串的char实际上就是string的索引器,且是只读的,只有get。
索引可以重载,可以多参数。