01.值类型与引用类型
值类型与引用类型
1. C#值类型还是引用类型取决于其数据类型。值类型包括:级别数据类型(不包括字 符型),枚举,结构体。值类型存储在栈当中,引用类型关于内存引用地址存储在栈当中,具体的数据存储在堆当中。引用类型存储的地址也叫“托管堆”。
2. 关于可空类型的部分特征:
public void TestEmptyType()
{
int? a = null;
int b = a ?? 2; // 如果为空则获取2
int c = a.GetValueOrDefault(); // 获取默认数据
bool d = a.HasValue ? a.GetType().IsValueType : false; // 判断是否有数据
}
3. 值类型继承自System.ValueType;
4. 值类型中包含引用类型,引用类型中包含值类型,那么他们内存地址是怎么存储的?
引用类型当中包含的值类型如果作为字段存储那么放在堆当中,如果是局部变量那 么存储在栈当中。值类型中包含引用类型那么就存储在堆当中。
5. 值类型与引用类型直接的转换叫做装箱与拆箱,尽量减少装箱和拆箱操作。例如:
int a = 10;
int b = 20;
//这样会进行装箱操作,WriteLine接收Object参数,而a是int 需要转换成Object 参数。
Console.WriteLine("Test In Box : {0},{1}", a, b);
// 不会进行装箱,拆箱操作。
Console.WriteLine("Test In Box : {0},{1}", a.ToString(), b.ToString());
// 这样会进行装箱操作。
ArrayList list = new ArrayList();
list.Add(1);
// 通过泛型使用不会进行装箱操作
List<int> listInt = new List<int>();
listInt.Add(1);
6. 值类型是密封的,不可能有继承于值类型的数据。
7. 关于Equals、GetHashCode、Operator!=、Operatio==的相关操作
public override bool Equals(object obj)
{
if(obj is Person)
{
if (GetHashCode() == obj.GetHashCode())
return true;
}
return false;
}
public override int GetHashCode()
{
return ID;
}
public static bool operator !=(Person p1, Person p2)
{
return !p1.Equals(p2);
}
public static bool operator ==(Person p1, Person p2)
{
return p1.Equals(p2);
}
8. 逻辑(&)、逻辑(|)、逻辑(^)、右移位(>>)、左移位(<<)。
var a = 5 & 3; // 101 & 11 = 1
var b = 5 | 3; // 101 | 11 = 7
var c = 5 ^ 3; // 101 ^ 11 = 6
var d = 5 >> 3; // 5/2/2/2 = 0
var e = 5 << 3; // 5*2*2*2 = 40
9. 静态构造函数不能有参数更不能重载,静态构造函数只会执行一次。
10. 类当中参数传递(传递参数的不同操作不同可能引起的变化也不同,三种可能)。
传值类型,传递的数据是进行一个复制,不会 影响原始传递的信息(ref,out除外)。
传引用,如果传递引用在具体函数内部进行了操作,则改变传 递参数的内容。
传引用,如果传递引用在具体函数内部被新创建的类赋值的话 ,则不改变传递的信息。
11. 枚举的引用。
下载:代码