C#编程自学之数据类型和变量二

我们继续自学C#编程教程,在上一课中介绍了C#的基本数据类型以及变量,今天这一节课我们来介绍值类型与引用类型!
一、什么是值类型与引用类型?
C#与大多数面向对象语言数据类型一样,分为值类型与引用类型两种?如何区分这两种类型?如图:

根据类型结构图我们得出:
1.值类型包括 内置数据类型如(int double float) 用户自定义值类型(struct 结构体) 枚举(emun)
2.引用类型包括 接口类型 类类型等等。
知道了那些类型属于值类型与那些类型属于引用类型之后,我们来分析一下值类型与引用类型的区别分别是什么?
首先继续看图:

根据上图我们可以看出,我们计算机内存可以分为堆(.NET中是托管堆)和栈两个区域!理解了这个后我们来看值类型和引用类型的区别:
1.值类型:值类型如 int double float 等这些基础数据类型,实际的值都是分配在栈上!
2.引用类型: 引用类型如 object 等这些数据类型,实际的值都是分配在堆上,并且在栈上保存一个堆上存放值的地址。
如上图 代码:
//在栈上分配一个空间 存放10
int a = 10;
 
//在堆上分配一个空间存放变量a的值10,在栈上分配一个空间存放该值在堆中的地址
object o = a;
好的了解基本值类型与引用类型的概念后我们来深入分析他们的本质。

二、值类型与引用类型剖析
1.值类型
值类型是分配在栈中,根据栈的原理,值类型一旦离开当前程序的作用域就会被立刻销毁!那么我定义两个相同的值类型会怎么样呢?看如下代码:
static void main()
{
    //此时在栈中分配一块空间存放10
    int a = 10;
      
    //在栈中继续分配一块空间存放a的值 10
    int b = a;
  
    //修改b所存放的空间中的10为20
    //此时不影响a 因为他们两个各自有独立的空间
    b = 20;
  
    //打印 a 和 b 的值
    Console.WriteLine(" a = {0}",a.ToString());
    Console.WriteLine(" b = {0}",b.ToString());
} //作用域结束 销毁a 和 b 所分配的地址空间
运行结果:

2.引用类型
引用类型实际的值存放在堆中,在栈中分配堆中分配空间的地址。那么当引用类型离开对象的作用域会发生什么?参考如下代码:

class MyClass
{
  public int a;
}

class Program
{
  static void Main(string[] args)
  {
    //此时在堆中分配一个空间存放10,在栈中分配一个空间存放堆中10的空间地址
    MyClass mc1 = new MyClass();
    mc1.a = 10;

    //此时在堆中又分配一个空间存放20,在栈中分配一个空间存放堆中20的空间地址
    MyClass mc2 = new MyClass();
    mc2.a = 20;

    //此时将a中栈的地址赋值给b
    //那么此时 b 也指向 a在堆中分配的地址
    //此时b原来指向的堆空间地址存放的20就被废弃了
    mc1 = mc2;

    //修改该a 和 b 同时指向的堆空间的值为30
    mc2.a = 30;

    //打印结果
    Console.WriteLine(" mc1.a = {0}", mc1.a);
    Console.WriteLine(" mc2.a = {0}", mc2.a);

  }
}

运行结果如下:

本节课内容就讲解到这里吧,请各位同学继续关注我们的教程。

时间: 2015-10-10

c#根据文件大小显示文件复制进度条实例

初学者,照着书上的抄袭制作,但已经理解了里面的意思和应用,并且进行了稍微改善和异常捕捉.这里记录下,以防以后用到这方面的知识点. 窗体设计: code: 复制代码 代码如下: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.

C#使用SqlBulkCopy批量复制数据到数据表

本文实例讲述了C#使用SqlBulkCopy批量复制数据到数据表的方法.分享给大家供大家参考.具体实现方法如下: 使用 SqlBulkCopy 类只能向 SQL Server 表写入数据.但是,数据源不限于 SQL Server:可以使用任何数据源,只要数据可加载到 DataTable 实例或可使用 IDataReader 实例读取数据 1.使用Datatable作为数据源的方式: 下面的代码使用到了ColumnMappings,因为目标表和数据源Datatable的结构不一致,需要这么一个映射

C#编程自学之运算符和表达式

我们了解完C#数据类型与变量之后,还会遇到变量之间的运算,例如计算两个数的和等等运算.那么,C#中都有那些常用的运算符呢?那么,往下看吧! 一.算数运算符 1.基本算数运算符 说到算数运算符,我们首先就应该可以想到我们数学中一些常用的运算符例如:加 减 乘 除 求余! 那么在C# 这些运算符都是如何表示的呢? 知道C#基本运算符的表示之后我们该如何去使用呢?那么我们来看段代码来看下什么是表达式. int a = 10; //定义一个整形变量a 值为10 int b = 20; //定义一个整形变

C#编程自学之数据类型和变量三

了解了数据类型与变量的基本概念之后,我们来讨论数据类型的转换与装箱与拆箱!装箱和取消装箱使我们能够统一地来考察类型系统,其中任何类型的值最终都可以按对象处理. 一.数据类型转换 在编程时 我们有时候会遇到将一个类型的变量转换成另一种数据类型,我们称它为数据类型的转换,C#数据类型的转换有两种方式如下: 1.默认安全的数据类型转换 默认安全的数据类型转换:我们称之为 隐式的数据类型转换,什么是隐式的数据类型转换?隐式的数据类型转换就是数据类型的低范围(参考C#数据类型与变量一中的数据类型的范围)向

C#编程自学之数据类型和变量一

一.数据类型与变量的介绍 在程序运行的过程中计算机需要记录大量的状态 数据(这里我们统称数据).那这些数据都存放在哪呢?程序在运行过程中的数据一般都存放在内存.那么他们在内存中如何存放的一种描述就是数据类型.变量则就是数据类型的实体.那么我们来看一个例子: 假如现在需要设计一个程序计算整数 10 与 20 的和, 请看如下代码: using System; namespace MyProgram { class Program { static void Main(string[] args)

ASP.NET深度复制和浅度复制分析

本文深入浅出的分析了ASP.NET深度复制和浅度复制.分享给大家供大家参考.具体分析如下: 之前一直没有搞清楚深度复制和浅度复制的区别到底在哪里,今天彻底把这个东西弄懂了,写出来与到家共勉. 如果大家不懂值类型和引用类型的区别,请先看http://www.jb51.net/article/57471.htm,本来想自己写的,但刚好看到了这篇写的非常全面,就不自己写了. 大家都知道Object是所有类共同的基类,其有个方法是MemberwiseClone(),其用途为 我们可以通过这个方法来达到浅

C#进行文件读写、创建、复制、移动、删除的方法

本文实例讲述了C#进行文件读写.创建.复制.移动.删除的方法.分享给大家供大家参考.具体分析如下: 1.文件夹创建.移动.删除 //创建文件夹 Directory.CreateDirectory(Server.MapPath("a")); Directory.CreateDirectory(Server.MapPath("b")); Directory.CreateDirectory(Server.MapPath("c")); //移动b到a D

C#中深度复制和浅度复制详解

本文章主要是讲解C# 语言编程中,深度复制和浅度复制,下面我将通过一个实例进行讲解.在实例开发之前,我们得先知道深度复制是什么和浅度复制是什么,它们之间的区别又是什么,下面将为大家一一揭晓. 1.深度复制是什么? 深度复制就是引用类型的复制. 2.浅度复制是什么? 浅度复制是值类型的复制. 以下是C#中深度复制和浅度复制的实例代码引用片段: using System; using System.Collections.Generic; using System.Text; namespace T

C#装箱和拆箱原理详解

.NET包含一个特殊的Object类,可以接受任意的数据类型的值,当所传递或所赋值的类型不是一个特定的数据类型时,object类就提供了一种传递参数和赋值的通用方法.赋给object的值必须作为引用类型,并存放砸托管堆中. 装箱: int age = 24; object refAge= age; 可以看的出,第一条语句创建一个变量age,并将值放在托管栈中: 第二条语句将age的值赋给引用类型.它将值24放在托管堆中. 这个值类型包装为引用类型的过程,称为装箱. 拆箱: 相反,将引用类型转换为

C# Bitmap 复制的小例子

复制代码 代码如下: public Bitmap CopyBitmap(Bitmap source){    int depth = Bitmap.GetPixelFormatSize(source.PixelFormat); if (depth != 8 && depth != 24 && depth != 32)    {        return null;    } Bitmap destination = new Bitmap(source.Width, sou

C# 对文件与文件夹的操作包括删除、移动与复制

在.Net中,对文件(File)和文件夹(Folder)的操作可以使用File类和Directory类,也可以使用FileInfo类和DirectoryInfo类.文件夹(Folder)是只在Windows操作系统中使用的名词.在操作系统的理论中,人们更习惯于使用目录(Directory)这个名词.或许微软为了有朝一日将.Net移植到其他的操作系统中(实际上也有很多人也在做着这个项目),所以还是以Directory来命名操作文件夹的类. File类和Directory类都是静态类.使用它们的好处

BAT批处理之文件与文件夹操作代码(附xcopy命令详解)

批处理中的文件.文件夹操作,xcopy命令的用法. 一,建bat文件自动执行复制,删除命令. 例1:复制cd.dll文件至windows\system32的bat文件内容: 复制代码 代码如下: copy cd.dll %windir%\system32 例2:卸载windows\system32目录中的cd.dll,即把上面复制的文件删除: 复制代码 代码如下: del %windir%\system32\cd.dll 例3:删除download文件夹中的文件,例子如下: 复制代码 代码如下:

PHP文件及文件夹操作之创建、删除、移动、复制

创建FileUtil.php文件,内容及调用方式如下: <?php /** * 操纵文件类 * * 例子: * FileUtil::createDir('a/1/2/3'); 测试建立文件夹 建一个a/1/2/3文件夹 * FileUtil::createFile('b/1/2/3'); 测试建立文件 在b/1/2/文件夹下面建一个3文件 * FileUtil::createFile('b/1/2/3.exe'); 测试建立文件 在b/1/2/文件夹下面建一个3.exe文件 * FileUtil

python之文件的读写和文件目录以及文件夹的操作实现代码

为了安全起见,最好还是给打开的文件对象指定一个名字,这样在完成操作之后可以迅速关闭文件,防止一些无用的文件对象占用内存.举个例子,对文本文件读取: file_object = open('thefile.txt') try: all_the_text = file_object.read( ) finally: file_object.close( ) Python读写文件实际操作的五大步骤 一.打开文件 Python读写文件在计算机语言中被广泛的应用,如果你想了解其应用的程序,以下的文章会给你

python实现操作文件(文件夹)

本文实例为大家分享了pyhton操作文件的具体代码,供大家参考,具体内容如下 copy_file 功能:将某个文件夹下的所有文件(文件夹)复制到另一个文件夹 #! python 3 # -*- coding:utf-8 -*- # Autor: GrayMac import shutil import os basefileclass = 'basefile' #sourcefile:源文件路径 fileclass:源文件夹 destinationfile:目标文件夹路径 def copy_fi

PHP 删除文件与文件夹操作 unlink()与rmdir()这两个函数的使用

先看一下代码 复制代码 代码如下: <? function deldir($dir) { //先删除目录下的文件: $dh=opendir($dir); while ($file=readdir($dh)) { if($file!="." && $file!="..") { $fullpath=$dir."/".$file; if(!is_dir($fullpath)) { unlink($fullpath); } else

Linux两台服务器之间传输文件和文件夹操作步骤

今天处理一个项目要迁移的问题,突然发现这么多图片怎么移过去,可能第一时间想到的是先从这台服务器下载下来,然后再上传到另外一台服务器上面去,这个方法确实是可行,但是实在是太费时间了,今天我就教大家怎么快速的在两台服务器之间传输文件和文件夹. 第一步:打开我们的远程连接工具,输入账号密码登录到服务器,如图: 点击文件打开或者新建一个会话,新建会话输入主机的ip和账号密码即可,如果已经登录过,直接点击文件下面那个带+号的图标就可以了. 第二步:找到你要传输的文件或者文件夹: 这里有这么多图片,我随便传

Git 撤销操作、删除文件和恢复文件

大致介绍 经过前面的学习,已经建立了版本库,并上传了文件,这次来学习对这些文件进行基本的操作,即: ◆ 撤销操作 ◆ 删除文件 ◆ 恢复文件 我在此之前,已经将三个文件提交到了版本库 撤销操作 撤销操作的语法: git checkout -- 文件名 撤销操作一般有两种情况: ◆ 文件修改后还没有提交到暂存区,进行撤销操作之后,文件恢复到和版本库中一模一样 ◆文件修改后提交到了暂存区,进行撤销之后,文件恢复到在提交到暂存区之前的状态 现在index.htm中的内容是: index.html 我们

cacls命令设置文件及其文件夹权限的方法

网上有许多讲解cacls权限设置的文章,虽然已经讲的比较简单,但是新手依然看的一头雾水,操作性不强. 下面以实例为大家一部一部讲解几个实用的命令. 你是否不想让别人在你的电脑上打开某个文件夹或者文件?是否有时想允许让别人看某个文件和文件夹下的文件,但是不想让别人更改?或者不想让自己电脑上的某个账户不能访问某个文件夹?如果有过那么可以用以下命令实现,而不需要借助其他加密软件. 注意要限制别人访问的文件或者文件夹所在盘必须要是NTFS文件系统的,而不能是FAT32格式.这或许是ntfs文件系统安全性

Takeown 获取文件or文件夹所有权

帮助文档: TAKEOWN [/S system [/U username [/P [password]]]]         /F filename [/A] [/R [/D prompt]] 描述:     该工具以重新分配文件所有权的方式允许管理员重新获取先前被拒绝访问的文件访问权. 参数列表:     /S           system          指定要连接到的远程系统. /U           [domain\]user   指定用户上下文,命令在此上下文中执行. /P