值类型与引用类型(特殊的string) Typeof和GetType() 静态和非静态使用 参数传递 相关知识

时间:2023-02-18 00:29:46

学习大神博客链接: http://www.cnblogs.com/zhili/category/421637.html

 

一 值类型与引用类型

    需要注意的string 是特殊类型的引用类型.

    使用方法: == 比较的是栈里面的值, 值类型比较值, 对象(除字符串)比较的是栈里面的地址.

equal比较的是实际的值,是object里面的虚方法重写,重写时最好重写getHashCode()方法.

    如下为代码例子

static void Main(string[] args)
        {
            object m1 =1 ;
            object m2 = 1;
            Console.WriteLine(m1==m2); // False;因为比较的是引用,肯定不是同一个对象.
            Console.WriteLine(m1.Equals(m2)); //True. 因为比较的是对象对应的值.
            Console.Read();
}
例子2: 
  static void Main(string[] args)
        {
            string str1 = "ZhangSan";
            string str2 = "ZhangSan";
            string str3 = new string(new char[] { 'z', 'h' });
            string str4 = new string(new char[] { 'z', 'h'});
            Console.WriteLine("str1 == str2  " + (str1 == str2).ToString()); //True
            Console.WriteLine("str1 Equals str2  " + str1.Equals(str2));//True
          
            Console.WriteLine("str3 == str4 " + (str3 == str4).ToString());//True
            Console.WriteLine("str3 Equals str4 " + str3.Equals(str4));          //True.
         
            Console.Read();
        } //总结: 因为string重写了==方法.用于比较值.

二 Typeof 和 GetType() 区别

  1. typeof  是运算符,而 GetType() 是方法
  2. typeof 获得类型的System.Type对象,GetType()获得当前实例的Type,
  3. GetType()是基类System.Object的方法,只有建立了一个实例之后才能够被调用
  4. typeof的参数只能是int, string, class,自定义类型,不能为具体实例,否则编译器会报错
static void Main(string[] args)
        {
            object m1 = 1;
            object m2 = 1;
            // ValueType是引用类型,因为它是类,所以返回为false
            Console.WriteLine(typeof(ValueType).IsValueType); //False. ValueType是类!!!
            Console.WriteLine(m1.GetType().IsValueType);//Ture
            Console.Read();
        }

三 静态与非静态.

    说的比较透彻的是, 链接: ([C#基础知识系列]全面解析C#中静态与非静态)http://www.cnblogs.com/zhili/archive/2013/06/16/StaticAndNonStatic.html

    个人使用总结:   想不实力化类-->创建静态类-->静态属性-->静态成员是private的-->使用静态方法一般用于作为通用的工具类来实现.

文中总结有: 1, 静态方法不能被标识为virtual、abstract或override,静态方法可以被派生访问,但是不能被派生类重写.

    2, 构造函数执行过程:

    静态成员分配内存空间-->静态成员初始化-->执行静态构造函数-->执行实例成员初始化-->执行实例构造函数

IL 中.ctor代表实例构造器.

 

四 参数传递

对于按值传递,不管是值类型还是引用类型的按值传递,都是传递实参的一个拷贝.

只是值类型时,此时传递的是实参实例的一个拷贝(也就是值类型值的一个拷贝)

而引用类型时,此时传递的实参引用的副本。

对于按引用传递,传递的都是参数地址,也就是实例的指针.(加ref and out 关键字)

    注意: string 是特殊的引用类型. 传递是实际的值,想要方法传递引用, 即外面的值发生改变, 需要加ref out 参数.