zoukankan      html  css  js  c++  java
  • 值类型、引用类型 再次理解

     重新理解一下C#中的值类型和引用类型,在以前读《C#高级编程(第三版)》时,也是粗略看了一下,没有在意,直到今天,重新认识了这个东西。

    一、值类型:存储在堆栈中;引用类型:存储在托管对上;

    二、值类型进行“=”操作时,会创建值类型的复制版本;

    值类型:

    int i = 20;

    int j= i;

    Console.WriteLine(string.Format("i={0}/tj={1}", i.ToString(), j.ToString())); // i = 20,j = 20

    j = 30;

    Console.WriteLine(string.Format("i={0}/tj={1}", i.ToString(), j.ToString())); // i = 20,j = 30

    引用类型:[ 建设已经定义了一个 Example 类 ]

    Example exI = new Example ();

    exI .i = 20;

    Example exJ = exI;

    Console.WriteLine(string.Format("exI.i={0}/texJ .i={1}", exI.i.ToString(), exJ .i.ToString())); // 20,20

    exJ .i = 30;

    Console.WriteLine(string.Format("exI.i={0}/texJ .i={1}", exI.i.ToString(), exJ .i.ToString())); // 30,30

    [说明:引用类型中,不用 string 做事例是因为它太特殊了,最主要的是自己还没有弄清楚这个东西,但是直到一点:“string 是引用类型,表现上却是值类型的特征。”,不知道为什么这么说?]

    三、理解值类型和引用类型。值类型就是基本类型,int,long,double,bool,struct,enum 都是值类型;引用类型就是string 和自定义类 [面向对象里面的对象],可以将引用类型看成C++ 或 C中的指针,都指向内存中的一个地址,修改任何一个指向这个地址对象,其他的对象值都改变。这个东西的监视是由CLR负责接管的,不用我们操心了。

    四、引用类型可以帮助返回函数处理后,类型的值。

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace ConsoleTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                // 外围设置值
                int j = 200;
                string str = "out string";
                example ex = new example(100, "out property");

                // 显示当前值
                Console.WriteLine("Before test():/n/tex.i={0}/tex.str={1}/tj={2}/tstr={3}", ex.i.ToString(), ex.str, j.ToString(), str);

                // 函数中更改值
                test(ex,j,str);

                // 显示调用后值
                Console.WriteLine("After test():/n/tex.i={0}/tex.str={1}/tj={2}/tstr={3}", ex.i.ToString(), ex.str, j.ToString(), str);


                Console.Read();
            }

            private static void test(example ex, int j, string str)
            {
                // 函数内更改各值
                j = 880;                        // 值类型
                str = "inner string";           // 引用类型,表现为值类型 [最特殊]
                ex.i = 880;                     // 引用类型,值类型属性
                ex.str = "inner property";      // 引用类型,引用类型属性

                // 显示更改后的值
                Console.WriteLine("Inner test():/n/tex.i={0}/tex.str={1}/tj={2}/tstr={3}", ex.i.ToString(), ex.str, j.ToString(), str);
            }
        }

        internal class example
        {
            public int i = 0;
            public string str = "example string";

            public example(int j, string s)
            {
                this.i = j;
                this.str = s;
            }
        }
    }

    结果:

    Before test():
            ex.i=100        ex.str=out property     j=200   str=out string
    Inner test():
            ex.i=880        ex.str=inner property   j=880   str=inner string
    After test():
            ex.i=880        ex.str=inner property   j=200   str=out string

  • 相关阅读:
    Android移动view动画问题
    GIT常用操作
    linux下mysql安装
    jdk安装
    linux下Tomcat安装
    猜测性能瓶颈
    MySQL没有远程连接权限设置
    linux下jmeter使用帮助
    BI的核心价值[转]
    BI与大数据
  • 原文地址:https://www.cnblogs.com/AloneSword/p/2237547.html
Copyright © 2011-2022 走看看