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参数,而aint 需要转换成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.         关于EqualsGetHashCodeOperator!=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.     枚举的引用。

  下载:代码

posted @ 2011-01-16 22:58  13路易的  阅读(186)  评论(0编辑  收藏  举报