8.1 复制值类型的变量和类
*大多数基本数据类型都是值类型,字符串string除外;string是类类型,string实际是System.string的缩写;
*类是引用类型,声明类变量时,编译器分配一小块内存存储类的引用地址,使用new关键字创建类实例时,才在堆中分配一块内存。
*值类型的复制是两个内存块的值都容纳相同的数值,引用类型的复制,复制的只是类的引用地址,两个类变量存储的都是对同一个类对象的引用;
*引用类型的复制与私有数据:类变量的复制只能拷贝类对象的引用,称为浅拷贝;创建两个类实例,使用clone方法能够复制引用的对象,称为深拷贝。
*private关键字创建了不能从类外访问的字段或方法,但并不是说它只能由单个类对象访问,同一个类的不同对象可以互相访问私有数据;私有指的是在类别上的私有,而不是对象上的私有。
*static关键字声明类中的字段为静态字段,所有的类的对象都共享同一个数据。
*使用值类型的参数,将值类型实参传递给方法的行参,方法操作的是对实参的拷贝,对实参原始值无影响
*使用引用类型的参数,将引用类型的实参传递给方法,方法操作的是对实参的拷贝,这个拷贝是对引用类型对象的引用的拷贝,所有的操作都会你映射到引用对象本身。
8.2理解null和可空类型
*变量应在声明时初始化,引用类型的变量可以在初始化时赋值为null,不指向任何引用对象
Circle c = new Circle(42);
Circle cope = null;
copy = c;
*空条件操作符 ?
int ? i = null;
int j = 99;
i = j;//将实参赋值给空变量
j = i//错误
*可空变量i不能作为实参传递
*可空类型有两个属性,hasValue和Value
int ? i = null;
if (!i.hasValue)
{
i = 99;
}
else
{
console.Write(i.Value)
}
*可空类型的Value属性是只读的,不可赋值。
8.3 使用ref和out参数
*向方法传递实参时,形参会用实参的拷贝来初始化,不管是值类型、引用类型(会改变引用对象本身的值,但不改为引用其他对象)还是可空类型,方法内部对形参的操作不会影响实参的原始值。
static void Add(int para)
{
para++;
Console.Write();
}
static void main()
{
int i = 42;
Add(i);//输出43
Console.Write(i);//输出42
}
*想要实际的修改一个实参,可使用关键字ref和out
*方法的形参前加ref前缀,作为传递的实参前也加ref前缀,作用于参数的所有操作都会作用于实参本身,因为形参和实参引用的是同一个对象
static void Add(ref int para)
{
para++;
}
static void main()
{
int i = 42;
Add(ref i);
Console.Write(i);//输出43
}
*由方法本身初始化形参,向形参传递为被初始化的实参,可使用out关键字
static void Add(out int para)
{
para=42;
}
static void main()
{
int i;//未初始化
Add(out i);//初始化
Console.Write(i);//输出42
}
//ref和out关键字,类似于PLC中自定义功能块的输入管脚和输出管脚,必须填写变量,直接更改实参本身。