值类型struct在foreach中的陷阱】的更多相关文章

最近踩了一个坑,为了优化代码,把class改为了struct,结果发现原来的初始化语句没有预期的运行,伪代码如下: public struct A { bool _isActive; public void Init(bool isActive) { _isActive = isActive; } } public A[] _arrayA; //调用如下 foreach A a in _arrayA) { a.Init(); } 看着是能达到预期的,但实际上不是的.            在fo…
由于值类型存在装箱和拆箱的过程,所有导致在修改值类型对象内部数据时,有可能会出现一些与预想不同的结果. 比如 Point p = , ); Console.WriteLine(p); p.Change(, ); Console.WriteLine(p); Object o = p; Console.WriteLine(o); ((Point)o).Change(, ); Console.WriteLine(o); ((IChangeBoxedPoint)p).Change(, ); Consol…
1. 值参数 当利用值向方法传递参数时,编译程序给实参的值做一份拷贝,并且将此拷贝传递给该方法.被调用的方法不传内存中实参的值,所以使用值参数时,可以保证实际值是安全的. using System; class Test { static void Swap(int x,int y){ int temp=x; x=y; y=temp; } static void Main(){ ,j=; Swap(i,j); Console.WriteLine("i={0},j={1}",i,j);…
C#指针操作字节数组 Demo(以添加short类型的值为例): //bytes:目标字节数组; offset:目标在字节数组的位置; value:添加的类型值public static unsafe void WriteInt16ToBytes(byte[] bytes, int offset, short value) { fixed (byte* ptr = bytes) { *((short*)(ptr + offset)) = value; } } 实现思路: 1.创建指向字节数组by…
举几个值类型和引用类型的内存配置: 值类型存储在栈中,引用类型堆里: 1,数组 数组是引用类型,但是数组的元素可以是值类型或引用类型 2. 结构 结构是值类型,简略的看个例子 struct sample { public int X; public int Y; } simple ss = new simple(); 3. 类 类是引用类型,简略看个例子: struct csample { public int X; public int Y; } csimple cs = new csimpl…
.NET中的类型分为值类型和引用类型,他们在内存布局,分配,相等性,赋值,存储以及一些其他的特性上有很多不同,这些不同将会直接影响到我们应用程序 的效率.本文视图对.NET 基础类型中的值类型和引用类型在内存中的布局,方法的调用,值类型如何实现接口,以及其他一些细节问题进行一些简要的讨论,文章主要参考<Pro .NET Performance> 和 <Advanced .NET Debugging> ,希望给大家一点儿帮助. 一 简单例子 举一个简单的例子,我们有一个名为Point…
从C#语言的定义中可以知道,C#支持两种值类型,分别是 值类型和引用类型,那么两者的区别到底在哪儿呢? 值类型特点: 1. 值类型包含 a 预定义的值类型 b 用户自定义的值类型(struct) 2. 值类型全部隐式派生自 Sytem.ValueType. 3. 所有的值类型全都是密封(seal)的,所以无法派生出新的值类型. 4. 值类型的实例通常在县城栈上分配存储空间,但是有些时候是在堆中. a:比如一个引用类型的实例包含了一个值类型的实例. 5. 值类型不能包含null值. 引用类型特点:…
[Asp.net MVC中Controller返回值类型] 在mvc中所有的controller类都必须使用"Controller"后缀来命名并且对Action也有一定的要求: 必须是一个public方法 必须是实例方法 没有标志NonActionAttribute特性的(NoAction) 不能被重载 必须返回ActionResult类型 public class MyController : Controller { // 必须返回ActionResult类型 public Act…
在C#中,值类型和引用类型是相当重要的两个概念,必须在设计类型的时候就决定类型实例的行为.如果在编写代码时不能理解引用类型和值类型的区别,那么将会给代码带来不必要的异常.很多人就是因为没有弄清楚这两个概念从而在编程过程中遇到了很多问题,在这里博主浅谈对值类型和引用类型的认识. 首先从概念上看,值类型直接存储其值,而引用类型存储对其值的引用.从而这两种类型存储在内存的不同地方. 其次从内存空间上看,值类型是在栈中操作,而引用类型则在堆中分配存储单元. 栈在编译的时候就分配好内存空间,在代码中有栈的…
在C#中,值类型和引用类型是相当重要的两个概念,必须在设计类型的时候就决定类型实例的行为.如果在编写代码时不能理解引用类型和值类型的区别,那么将会给代码带来不必要的异常.很多人就是因为没有弄清楚这两个概念从而在编程过程中遇到了很多问题,在这里博主浅谈对值类型和引用类型的认识. 首先从概念上看,值类型直接存储其值,而引用类型存储对其值的引用.从而这两种类型存储在内存的不同地方. 其次从内存空间上看,值类型是在栈中操作,而引用类型则在堆中分配存储单元. 栈在编译的时候就分配好内存空间,在代码中有栈的…
  系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 常见面试题目: 1. 值类型和引用类型的区别? 2. 结构和类的区别? 3. delegate是引用类型还是值类型?enum.int[]和string呢? 4. 堆和栈的区别? 5. 什么情况下会在堆(栈)上分配数据?它们有性能上的区别吗? 6.“结构”对象可能分配在堆上吗?什么情况下会发生,有什么需要注意的吗? 7. 理解参数按值传递?以及按引用传递? 8. out 和 ref 的区别与相同点? 9. C#支…
http://www.cnblogs.com/qq0827/p/3281150.html 一. 基元类型 编译器能够直接支持的数据类型叫做基元类型.例如int, string等.基元类型和.NET框架类库FCL存在着直接的映射关系. string和String? 面试的时候曾经被问到过这个问题,C#中的基元类型string实际上对应了System.String(FCL)类型,所以两者使用的时候没有什么不同. 类型转换 编译器能够在基元类型之间进行显式或隐式转换.如果转换是安全的,也就是转换过程不…
第二遍看这本书,决定记录一下加深印象. 1,基元类型 什么事基元类型?基元类型是直接映射到FrameWork类库(FCL)中存在的类型,编译器直接支持的数据类型.比如int直接映射到System.Int32类型,就像是添加了using应用:using sbyte=System.SByte. C#基元类型 FCL类型 说明 sbyte System.SByte 有符号8位 byte System.Byte 无符号8位 short System.Int16 有符号16位 ushort System.…
 基元类型和FCL类型 FCL类型就是指Int32这种类型,这是CLR支持的类型. 而基元类型就是指int这种类型,这是C#编译器支持的,实际上在编译后,还是会被转为Int32类型. 而且学过C的朋友肯定记得,int在32位机器和64位机器字节数可能不同,但是C#.NET里int就是表示Int32. 因为在基元类型和FCL类型之间,有一个一一对应的映射关系.另外注意dynamic实际上对应的类型就是Object,只是说C#编译器允许用简单的语法让dynamic变量参与动态调度. 表达式由字面量构…
引用类型和值类型介绍 CLR支持两种类型,引用类型和值类型两种基本的类型: 值类型下有int.double.枚举等类型同时也可以称为结构,如int结构类型.double结构类型,所有的值类型都是隐式密封(sealed)的,防止将一个值类型作其他引用类型或值类型的基类. 任何成为类的都是引用类型.如string.StringBuilder都是引用类型,这两个是引用类型,但不可以被继承,它两也是密封类. 引用类型和值类型的区别是: 值类型是用struct关键字来声明的,引用类型是用class关键字来…
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) { ; Tools.Tr…
原文地址:http://kb.cnblogs.com/page/42318/ 系列文章导航: [你必须知道的.NET] 开篇有益 [你必须知道的.NET] 第一回:恩怨情仇:is和as [你必须知道的.NET] 第二回:对抽象编程:接口和抽象类 [你必须知道的.NET] 第三回:历史纠葛:特性和属性 [你必须知道的.NET] 第四回:后来居上:class和struct [你必须知道的.NET] 第五回:深入浅出关键字---把new说透 [你必须知道的.NET] 第六回:深入浅出关键字---bas…
结构.枚举.装箱.拆箱 自定义值类型 如何利用结构来定义新的值类型,并使之具有与大多数预定义 类型相似的行为,这里的关键在于,任何 新定义的值类型都有它们自己的数据和方法. 一般用枚举来定义常量值集合. 1.值类型 所有值类型都派生自类System.ValueType.而所有类都派生自类System.Object. 值类型直接包含值.换言之,变量引用的位置就是值在内存中实际存储的位置.因此, 将第一个变量的值赋值给第二个变量,会在新变量的位置创建原始变量的值的一个内存副本. 所以改变第一个变量的…
原文:[CLR via C#]5.2 引用类型和值类型 CLR支持两种类型:引用类型和值类型. 虽然FCL中大多数都是引用类型,但开发人员用的最多的还是值类型.引用类型总是在托管堆上分配的,C#的new操作符会返回对象的内存地址——也就是指向对象数据的内存地址. 使用引用类型必须注意到一些性能问题,首先考虑一下事实: 1)内存必须从托管堆上分配. 2)对上分配的每个对象都有一些额外的成员(比如前面提到过得"类型对象指针"和"同步块索引"),这些成员必须初始化. 3)…
CLR支持两种类型:引用类型和值类型. 引用类型总是在托管堆上分配的,C#的new操作符会返回对象的内存地址——也就是指向对象数据的内存地址. 使用引用类型必须注意到一些问题: 1)内存必须从托管堆上分配. 2)对上分配的每个对象都有一些额外的成员(比如前面提到过得"类型对象指针"和"同步块索引"),这些成员必须初始化. 3)对象中的其他字节(为字段而设)总是设为零. 4)从托管堆上分配一个对象时,可能强制执行一次垃圾回收操作. 如果所有类型都是引用类型,应用程序的…
某年某月,笔者去面试招行的一个外包项目,辗转来到面试地点以后,面试官给了我一份试卷,试卷只有两道题目,其中一道是这样的: 阅读以下程序 class Program { struct Point { public int x; public int y; public Point(int x,int y) {9 this.x = x; this.y = y; } } static void Main(string[] args) { Point p1 = ,); Point p2 = p1; p1…
1.内存分配 1.1 值类型的内存分配 在 Swift 中定长的值类型都是保存在栈上的,操作时不会涉及堆上的内存.变长的值类型(字符串.集合类型是可变长度的值类型)会分配堆内存. 这相当于一个 "福利",意味着你可以使用值类型更快速的完成一个方法的执行. 值类型的实例只会保存其内部的存储属性,并且通过 "=" 赋值的实例彼此的存储是独立的. 值类型的赋值是拷贝的,对于定长的值类型来说,由于所需的内存空间是固定的,所以这种拷贝的开销是在常数时间内完成的. struct…
引言 本文之初的目的是讲述设计模式中的 Prototype(原型)模式,但是如果想较清楚地弄明白这个模式,需要了解对象克隆(Object Clone),Clone其实也就是对象复制.复制又分为了浅度复制(Shallow Copy)和深度复制(Deep Copy),浅度复制和深度复制又是以如何复制引用类型成员来划分的.由此又引出了引用类型和值类型,以及相关的对象判等.装箱.拆箱等基础知识.索性从最基础的类型开始自底向上写起. 值类型和引用类型 先简单回顾一下C#中的类型系统.C# 中的类型一共分为…
在" .NET的堆和栈01,基本概念.值类型内存分配"中,了解了"堆"和"栈"的基本概念,以及值类型的内存分配.我们知道:当执行一个方法的时候,值类型实例会在"栈"上分配内存,而引用类型实例会在"堆"上分配内存,当方法执行完毕,"栈"上的实例由操作系统自动释放,"堆"上的实例由.NET Framework的GC进行回收.而本篇的重点要放在:值类型和引用类型参数的传递,…
我们先来看一个示例代码: namespace ConsoleApplication1 { class Program { static void Main(string[] args) { ArrayList a = new ArrayList(); Point p; ; i < ; i++) { p.x = p.y = i; a.Add(p); } Console.ReadKey(); } } struct Point { public Int32 x, y; } } 在本例中,ArrayLi…
C#把数据类型分为两种:值类型 和 引用类型.值类型存储在堆栈中,而引用类型存储在托管堆上. 一.值类型和引用类型变量的存储 首先,变量是存储信息的基本单元,而对于计算机内部来说,变量就相当于一块内存空间. C#中的变量数据类型有两种: [1] 值类型:简单类型.结构类型.枚举类型 [2] 引用类型:类.代表.数组.接口. 1.值类型和引用类型内存分配  值类型是在栈中操作,而引用类型则在堆中分配存储单元. 栈在编译的时候就分配好内存空间,在代码中有栈的明确定义,而堆是程序运行中动态分配的内存空…
编程语言的基元类型 编译器直接支持的数据类型称为基元类型(primitive type).基元类型直接映射到framework类型(fcl)中存在的类型. 下表列出fcl类型 从另一个角度,可以认为C#编译器自动假定所有源代码文件都添加了一下using指令: c#编译器非常熟悉基元类型,会在编译代码时应用自己的特殊规则,具体地说,c#编译器支持与类型转换.字面值以及操作符有关的模式. Int32 i = ; Int64 l = i; //从int32隐式转换为int64 Single s = i…
前言 最近在学设计模式中,发现 Swift 中的 struct,class 以及 enum 在一般的使用中能够做到互相替换,因此探究其背后的逻辑就十分有必要.而这一问题又引出了 Swift 中的值类型和引用类型的区别.在网上搜寻一番,虽然也找到很多很棒的资料,不过有的有些过时,或是比较分散,因此总结一篇,以便自己加深印象,也方便与大家交流. 由于 Swift 中的 struct 为值类型,class 为引用类型,因此文中以这两种类型为代表来具体阐述. stack & heap 内存(RAM)中有…
前言 swift中的结构体和类在组成和功能上具有一定的相似性.两者都可以含有成员属性.成员方法用于数据存储和功能性模块封装.往往造成不知如何对二者进行区分和使用 值类型概念和引用类型概念 值类型的概念:值类型是指在系统进行标准的复制后,被复制的对象与复制出的对象之间完完全全的不存在任何关系,彼此之间具有绝对性的独立.此类型的数据被称为值类型(与OC中的深拷贝相同) 引用类型的概念:引用类型是指在系统进行标准复制后,被复制对象与复制出的对象之间具有底层的共有关系,也就是说两者功用的是同一个底层资源…
常见面试题目: 1. 值类型和引用类型的区别? 2. 结构和类的区别? 3. delegate是引用类型还是值类型?enum.int[]和string呢? 4. 堆和栈的区别? 5. 什么情况下会在堆(栈)上分配数据?它们有性能上的区别吗? 6.“结构”对象可能分配在堆上吗?什么情况下会发生,有什么需要注意的吗? 7. 理解参数按值传递?以及按引用传递? 8. out 和 ref 的区别与相同点? 9. C#支持哪几个预定义的值类型?C#支持哪些预定义的引用类型? 10. 有几种方法可以判定值类…