C#引用类型与值类型的比较
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SimpleDelegate.Models;
using System.Data.SqlClient;
using System.Data;
namespace SimpleDelegate
{
class Program
{
static void Main(string[] args)
{
int i = ;
Tools.TryChange(i); //no-change int j = ;
Tools.Swap(i, j); //no-swap
Tools.Swap(ref i,ref j); //swap List<object> l1 = new List<object>() { , };
Tools.TryChange(l1); //change List<object> l2 = new List<object>() { };
Tools.Swap(l1,l2); //no-swap
Tools.Swap(ref l1,ref l2); //swap Console.Read();
}
} public class Tools
{
/// <summary>
/// 输出任意实现IEnumerable迭代器的集合包括Array,List,IQueryable,普通数组等
/// 调用本方法时可不指定T类型。因为带参数ienum,编译器会自动判断
/// </summary>
public static void OutputEnumable<T>(IEnumerable<T> ienum)
{
foreach (T item in ienum)
{
Console.WriteLine(item);
}
} /// <summary>
/// 输出多个参数至终端
/// </summary>
public static void OutputParams(params object[] paras)
{
Console.WriteLine(OutputParamsToString(paras));
} /// <summary>
/// 拼接多个参数至字符串
/// </summary>
public static string OutputParamsToString(params object[] paras)
{
StringBuilder sb = new StringBuilder();
foreach (object item in paras)
{
sb.Append(item + ",");
}
return sb.ToString();
} /*****************************测试**************************/ /// <summary>
/// 交换值或引用类型变量。更改成功,原因
/// 1.值类型:传入原值,就在原值处修改
/// 2.引用类型,传入原指针,更改原来的两个指针的值(存有指向数据的地址)
/// </summary>
public static void Swap<T>(ref T value1, ref T value2)
{
T tmp = value1; value1 = value2; value2 = tmp;
} /// <summary>
/// 试图交换两值,结果无效,原因
/// 1.值类型:传入值副本,在内存中重新开辟两int空间存数字,函数结束后原来两值未变
/// 2.引用类型,传入地址,可以理解为指向数据的指针副本,在内存中重新开辟两空间存指针,函数结束后原来两值所指向的数据未变
/// </summary>
public static void Swap<T>(T value1, T value2)
{
T tmp = value1; value1 = value2; value2 = tmp;
} public static void TryChange(int i)
{
i = ;
} /// <summary>
/// 有效,使用指针向数据区添加新数据,指针本身值不变
/// </summary>
public static void TryChange(List<object> l)
{
l.Add();
} }
}
另外补上值类型与引用类型在==与Equals()的区别
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SimpleDelegate.Models;
using System.Data.SqlClient;
using System.Data;
using System.IO;
using System.Xml.Serialization;
namespace SimpleDelegate
{
class Program
{
static void Main(string[] args)
{
//MSDN关于==的解释
//对于预定义的值类型,如果操作数的值相等,则相等运算符 ( ==) 返回 true,否则返回 false。
//对于 string 以外的引用类型,如果两个操作数引用同一个对象,则 == 返回 true。
//对于 string 类型, == 比较字符串的值。
string s1 = "";
string s2 = "";
Console.WriteLine(s1 == s2); //true,比较值
Console.WriteLine(s1.Equals(s2)); //true,比较值 Box redBox = new Box(, , );
Box blueBox = new Box(, , );
Box greenBox = new Box(, , );
Console.WriteLine(redBox == greenBox); //false,不引用同一对象,可理解为比较内部存的数据区域地址
//调用类型内部自定义的比较器
Console.WriteLine(redBox.Equals(greenBox)); //true,比较W,L,H值都相等 Console.Read();
}
public class Box : IEquatable<Box>
{
public int Height { get; set; }
public int Length { get; set; }
public int Width { get; set; } public Box(int h, int l, int w)
{
this.Height = h;
this.Length = l;
this.Width = w;
} /// <summary>
/// 用户自定义比较器,需H,L,W全部相等才对象相等
/// </summary>
public bool Equals(Box other)
{
#region MSDN关于&的解释
//一元 & 运算符返回操作数的地址(要求 unsafe 上下文)。
//为整型和 bool 类型预定义了二进制 & 运算符。
//对于整型,& 计算操作数的逻辑按位“与”。
//对于 bool 操作数,& 计算操作数的逻辑“与”;也就是说,当且仅当两个操作数均为 true 时,结果才为 true。
#endregion
if (this.Height == other.Height & this.Length == other.Length
& this.Width == other.Width) //&在此等同于&&
{
return true;
}
else
{
return false;
}
}
}
}
}
大家直接看代码吧,有什么不懂先运行下,看后理解下。最后再查查资料吧。
C#中的值类型保存在栈中引用类型保存在堆中。
C#中有两类重要类型:1.值类型(数字等),继承自ValueType,2.引用类型(类),继承自object。
具体可以参见http://www.cnblogs.com/niyw/archive/2010/09/20/1832077.html
C#是高级语言,有些地方内部难以了解,故原理、揭秘很重要。
C#引用类型与值类型的比较的更多相关文章
- C# 引用类型和值类型
C# 引用类型和值类型 CLR支持两种类型:引用类型和值类型. 1.引用类型 (1)内存必须从托管堆上分配: (2)堆上分配的每个对象都有一些额外成员(包括“类型对象指针”,“同步块索引”),这些成员 ...
- NET基础(4):引用类型和值类型
CLR支持两种类型:引用类型和值类型.虽然FCL的大多数类型都是引用类型,但程序员用的最多的还是引用类型,引用类型总是从托管堆分配,c#的new操作符返回对象内存地址-即指向对象数据的内存地址.使用引 ...
- 《CLR via C#》读书笔记--基元类型、引用类型和值类型
编程语言的基元类型 编译器直接支持的数据类型称为基元类型.基元类型直接映射到Framework类库中存在的类型.例如:C#中的int直接映射到System.Int32类型.下表给出了C#基元类型与对应 ...
- CLR via C#(02)-基元类型、引用类型、值类型
http://www.cnblogs.com/qq0827/p/3281150.html 一. 基元类型 编译器能够直接支持的数据类型叫做基元类型.例如int, string等.基元类型和.NET框架 ...
- 《CLR via C#》读书笔记(5)基元类型、引用类型和值类型
5.1 基元类型 编译器直接支持的数据类型称为基元类型(primitive type). 以下4行到吗生成完全相同的IL int a = 0; //最方便的语法 System.Int32 b = 0; ...
- 【CLR Via C#】第5章 基元类型、引用类型、值类型
第二遍看这本书,决定记录一下加深印象. 1,基元类型 什么事基元类型?基元类型是直接映射到FrameWork类库(FCL)中存在的类型,编译器直接支持的数据类型.比如int直接映射到System.In ...
- CLR via C#深解笔记三 - 基元类型、引用类型和值类型 | 类型和成员基础 | 常量和字段
编程语言的基元类型 某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们. System.Int32 a = new System.Int32(); // a = 0 a = 1 ...
- 【C#进阶系列】05 基元类型、引用类型和值类型
基元类型和FCL类型 FCL类型就是指Int32这种类型,这是CLR支持的类型. 而基元类型就是指int这种类型,这是C#编译器支持的,实际上在编译后,还是会被转为Int32类型. 而且学过C的朋友 ...
- 实际举例C#引用类型和值类型的区别<网摘>
我们都知道,c#的两大数据类型分别为值类型和引用类型.很多人或许闭着眼睛都能说出值类型包括简单类型.结构体类型和枚举类型,引用类型包括自定义类.数组.接口.委托等,但是当被问及到二者之间的联系和区别, ...
- NET中的引用类型和值类型 zt
.NET中的类型分为值类型和引用类型,他们在内存布局,分配,相等性,赋值,存储以及一些其他的特性上有很多不同,这些不同将会直接影响到我们应用程序 的效率.本文视图对.NET 基础类型中的值类型和引用类 ...
随机推荐
- php中count获取多维数组长度的方法
转自:http://www.jb51.net/article/57021.htm 本文实例讲述了php中count获取多维数组长度的实现方法.分享给大家供大家参考.具体分析如下: 先来看看下面程序运行 ...
- Oracle创建表空间和表
创建表空间和表ORACLE物理上是由磁盘上的以下几种文件:数据文件和控制文件和LOGFILE构成的oracle中的表就是一张存储数据的表.表空间是逻辑上的划分.方便管理的.数据表空间 (Tablesp ...
- 浅析C#中的Attribute(转)
最近用到了,所以静下心来找些资料看了一下,终于把这东西搞清楚了. 一.什么是Attribute 先看下面的三段代码: 1.自定义Attribute类:VersionAttribute [Attribu ...
- 模拟 2013年山东省赛 J Contest Print Server
题目传送门 /* 题意:每支队伍需求打印机打印n张纸,当打印纸数累计到s时,打印机崩溃,打印出当前打印的纸数,s更新为(s*x+y)%mod 累计数清空为0,重新累计 模拟简单题:关键看懂题意 注意: ...
- 最短路(Dijkstra) POJ 1062 昂贵的聘礼
题目传送门 /* 最短路:Dijkstra算法,首先依照等级差距枚举“删除”某些点,即used,然后分别从该点出发生成最短路 更新每个点的最短路的最小值 注意:国王的等级不一定是最高的:) */ #i ...
- flst与fitem命令是这么用的
k,94,75.69947,44.09817,-40 k,95,50.9349,44.01963,-40 k,96,37.83799,45.04814,-40 k,97,15.1304,48.2934 ...
- HDU 1010 (DFS搜索+奇偶剪枝)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1010 题目大意:给定起点和终点,问刚好在t步时能否到达终点. 解题思路: 4个剪枝. ①dep&g ...
- 通过网页的JS代码启动移动APP
<span style="font-size:18px;"><script> function startAPP(){ window.location = ...
- ios cocos2d TexturePacker生成文件后的使用方法
(1)将*.pvr.ccz文件转换为CCSpriteBatchNode (2) 将对应的plist文件读到CCSpriteFrameCache中 (3) 从CCSpriteFrameCache获取 ...
- TYVJ 1011 NOIP 2008&&NOIP 2000 传纸条&&方格取数 Label:多线程dp
做题记录:2016-08-15 15:47:07 背景 NOIP2008复赛提高组第三题 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行 ...