类实例化
在使用类的非静态方法或属性时,必须将类实例化。把类比做盖房的图纸,如果要使用房子的功能,如住人,得有真实存在的房子实体才行,所以要想使用房子的功能,需要把图纸转化为房子实体,这个过程就称为实例化过程。
在使用类的静态方法或属性时,不用将类实例化。我想使用图纸上房子的长宽高时,我不必先建一座房子才能知道或使用它的长宽高,我可以直接把值从图纸上拿出来使用,只要是这个值,建的房子的长宽高都一样,所以就不需要实例化了,此种情况长宽高就为静态属性/方法。
值类型与引用类型
一个类型要么是值类型,要么是引用类型。区别在于数据存储的方式:对于值类型,数据存放在栈里。对于引用类型,引用存放在栈里而实际数据存放在堆里。
引用类型的变量存储对其数据(对象)的引用,而值类型的变量直接包含其数据。 对于引用类型,两个变量可引用同一对象;因此,对一个变量执行的操作会影响另一个变量所引用的对象。 对于值类型,每个变量都具有其自己的数据副本,对一个变量执行的操作不会影响另一个变量。
集合
集合包含三种:List IDictionary(KeyValue) IEnumable(枚举、foreach遍历)
??运算符
op1 ?? op2
op1 == null ? op2 : op1
?.运算符
使用?.运算符,会把int? count设置为null,而不是抛出一个异常。
System.Collections.Generic名称空间
这个名称空间包含用于处理集合的泛型类型,使用得非常频繁,所以用using语句配置它,这样使用时就不必添加限定符了。
default关键字
public MyGenericClass()
{
innerT1Object = default(T1);
}
其结果是,如果innerT1Object是引用类型,就给它赋予null值;如果它是值类型,就给它赋予默认值。对于数字类型,这个默认值是0;而结构根据其各个成员的类型,以相同的方式初始化为0或null。default关键字允许对必须使用的类型执行更多操作,但为了更进一步,还需要限制所提供的类型。
封箱就是将值类型转换为引用类型,拆箱就是将引用类型转换为值类型。
例子:
//封箱
int num = 5;
object obj=i;
//拆箱
int numChai = (int)obj;
这里创建了一个int型的变量num,把5赋值给它,然后把它封箱在object类型的变量obj中。以这种方式封箱变量而创建的对象,包含值类型变量的一个副本的引用,而不包含源值类型变量的引用。要进行验证,可以修改源结构的内容,把对象中包含的结构拆箱到新变量中,检查其内容,即拆箱。
拆箱的值必须和它要转换的目标的变量有相同的类型。
ref和out都对函数参数采用引用传递形式——不管是值类型参数还是引用类型参数,并且定义函数和调用函数时都必须显示声明该参数为ref/out形式。两者都可以使函数传回多个结果。
两者区别:
两种参数类型的设计思想不同,ref的目的在于将值类型参数当作引用型参数传递到函数,是函数的输入参数,并且在函数内部的任何改变也都将影响函数外部该参数的值;而out的目的在于获取函数的返回值,是输出参数,由函数内部计算得到的值再回传到函数外部,因此必须在函数内部对该参数赋值,这将冲掉函数外部的任何赋值,使得函数外部赋值毫无意义。
网友评论