C#中大多数类型都是引用类型,只有个别特殊情况是值类型。

值类型:

  • 枚举(enum)
  • 结构(struct)
  • 基础类型:int, short, char, bool....(string是引用类型)

引用类型:

  • 数组(即使储存的是值类型的元素,仍然是引用类型)
  • 委托类型
  • 接口类型
  • 类类型

值类型和引用类型各有各自的特点。

值类型:

  • 不需要垃圾回收(装箱除外)。
  • 不需要类型标识,所以比引用类型占据更小的空间。
  • 数据创建在栈上,但也有可能创建在堆上(比如作为类的字段)
  • 可以转化为引用类型-----装箱

引用类型:

  • 在传递参数,返回值,赋值,拷贝及类似操作时只需要拷贝4-8字节,而不是全部的数据
  • 数据创建在堆上
  • 默认以值传递的方式进行传递,引用类型的值还是引用
  • 可以转化为值类型-----拆箱

如下代码却无法实现改变传入的参数的值的作用:

public static void ST(string sss)
{
sss = sss.Insert(, "");
}

传入参数“hello”,打印出来仍然是“hello”,不是期望的“h324ello”.

而如下代码能够实现改变传入参数的作用:

public static void ST(ref string sss)
{
sss = sss.Insert(, "");
}

原因就是ref使参数传进去了本身的地址,而没有ref则传进去了本身的值。

另一段神奇的代码:

public static void ST(int[] sss)
{
sss[] = ;
} public static void ST(ref int[] sss)
{
sss[] = ;
}

这两段代码都改变了sss数组的值。

C#基础--值类型和引用类型的更多相关文章

  1. [No0000B9]C# 类型基础 值类型和引用类型 及其 对象复制 浅度复制vs深度复制 深入研究2

    接上[No0000B5]C# 类型基础 值类型和引用类型 及其 对象判等 深入研究1 对象复制 有的时候,创建一个对象可能会非常耗时,比如对象需要从远程数据库中获取数据来填充,又或者创建对象需要读取硬 ...

  2. [No0000B5]C# 类型基础 值类型和引用类型 及其 对象判等 深入研究1

    引言 本文之初的目的是讲述设计模式中的 Prototype(原型)模式,但是如果想较清楚地弄明白这个模式,需要了解对象克隆(Object Clone),Clone其实也就是对象复制.复制又分为了浅度复 ...

  3. C#基础|值类型和引用类型以及传参问题

    为了明白什么是值类型和引用类型,先引入你两个概念.堆内存与栈内存   堆内存与栈内存   由于咱的描述能力有限,就不对其下定义了,来看看两者的作用.   共同点: 都是用来存放数据的   不同点: 堆 ...

  4. [c#基础]值类型和引用类型的Equals,==的区别

    引言 最近一个朋友正在找工作,他说在笔试题中遇到Equals和==有什么区别的题,当时跟他说如果是值类型的,它们没有区别,如果是引用类型的有区别,但string类型除外.为了证实自己的说法,也研究了一 ...

  5. C#基础知识系列二(值类型和引用类型、可空类型、堆和栈、装箱和拆箱)

    前言 之前对几个没什么理解,只是简单的用过可空类型,也是知道怎么用,至于为什么,还真不太清楚,通过整理本文章学到了很多知识,也许对于以后的各种代码优化都有好处. 本文的重点就是:值类型直接存储其值,引 ...

  6. c#1所搭建的核心基础之值类型和引用类型

    这个主题很重要,在.NET中做的一切其实都是在和一个值类型或者引用类型打交道. 现实世界中的值和引用 假定你在读一份非常棒的东西,希望一个朋友也去读他.于是你到复印室里复印了一份.这个时候他获得了属于 ...

  7. c#基础系列1---深入理解值类型和引用类型

    "大菜":源于自己刚踏入猿途混沌拾起,自我感觉不是一般的菜,因而得名"大菜",于自身共勉. 不知不觉已经踏入坑已10余年之多,对于c#多多少少有一点自己的认识, ...

  8. C#基础篇五值类型和引用类型

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace P01M ...

  9. C#学习笔记(基础知识回顾)之值类型和引用类型

    一:C#把数据类型分为值类型和引用类型 1.1:从概念上来看,其区别是值类型直接存储值,而引用类型存储对值的引用. 1.2:这两种类型在内存的不同地方,值类型存储在堆栈中,而引用类型存储在托管对上.存 ...

随机推荐

  1. N个骰子的点数和的概率分布

    程序设计思路: 假设有n个骰子,关键是需要统计每个点数出现的次数.首先分析第一个骰子点数和有1到6的点数,计算出1到6的每种点数 的次数,并将结果用一个数组pos1记录.然后分析有两个骰子时, 点数为 ...

  2. [原]iOS Makefile Template

    export DEVELOPER_DIR := $(shell xcode-select --print-path) PLATFORM="$(DEVELOPER_DIR)/Platforms ...

  3. 批量转换cue文件编码

    之前在网上下载的无损(flac.ape),好多都是整盘的,也就是说一个flac或ape文件搭配一个cue分轨文件,这个文件记录着在不同时间段是哪一首歌曲. 由于之前的操作都是在windows下进行的, ...

  4. Object-c学习之路六(oc字符串文件读写)

    // // main.m // NSString // // Created by WildCat on 13-7-25. // Copyright (c) 2013年 wildcat. All ri ...

  5. 自定义生命周期的设计(iOS篇)

    自定义生命周期的设计(iOS篇) 首先要确定一点,我们的App,要基于XIB文件进行编程,而不是在每个相应的ViewController里面去手动创建页面的每个控件.这样做的好处是,将页面布局与业务逻 ...

  6. Elmah错误日志工具

    Elmah错误日志工具 Exception 对于异常的处理,以前基本就是跳转到一个自定义的错误页面,觉得这样不错挺友好的.同时还是需要记录下来这些异常,才能进一步的进行修改. 怎么去记录这些错误信息呢 ...

  7. [每日一题] OCP1z0-047 :2013-07-26 alter table set unused之后各种情况处理

    有疑问可以去itpub讨论:http://www.itpub.net/thread-1804872-1-1.html 对于alter table setunused的用法,查官方文档: alter_t ...

  8. cin 和scanf,scanf比cin快很多

    //#include <iostream> #include <stdio.h> //#include <fstream> //using namespace st ...

  9. as3 Loader程序域

    Loader的 load方法有两个参数 第二个参数是LoaderContext对象 LoaderContext对象里有一个applicationDomain( 程序 域)对象 设置程序域对象可以设置两 ...

  10. 线程androidAndroid ConditionVariable的用法

    查了好多资料,发现还是不全,干脆自己整理吧,至少保证在我的做法正确的,以免误导读者,也是给自己做个记录吧! 在Android开辟中,如果需要线程同步,可以使用Java系统库的wait()和notify ...