昨天晚上看静态成员和实例变量的时候,看到这样的一句话:默认情况下,若成员被定义为实例变量,这就意味着类需要为每个实例都建立一个副本,而在定义一个静态变量的时候,只存在此成员的一个副本。

呵呵,今天跟前辈讨论了下,就写到这里吧。其实如果你学过基础你就知道,静态变量,无非前面加个static。可是这里面有很多知识的。

在c#中,我们访问静态成员用的是类名+成员名称,而我们在访问实例成员的时候必须是对象名称+成员名称来进行访问。静态成员都是需要初始化的,即使你没有实例化对象也会被实例化,比如:

public static int count;

因为静态成员是CLR组织加载的。因此你不赋值,系统也会默认给你初始化,这里就是0了。而实例成员是在实例化对象后才被CLR加载的。

现在来看下副本的问题,当然就是存储的位置。那么什么是副本呢,MSDN里说的让人很难理解,因此我一开始根本不理解,总以为是有多个版本,但根本不是这个样子的。我们知道面向对象就是面向自然界的万物,那么一个类就是一个真实的存在。那么它就是一个原版咯,然后你建的每个对象就是他的实例,也就是他的一个副本。这样就好理解了。

其实如果多个人访问一个页面,那么将会实例化多个对象。而这多个对象虽然可能是一样的,但是在内存中存储的位置是不一样的,这样就做到了相互之间对象不会发生冲突。而静态变量则是不管你多少个来访问,他的值一旦初始化就不会改变,很多实例用的对象都是一致的,因此可以公用。我们再看,比如我实例化了一个对象,里面有静态成员,也有实例成员,但是你访问这个对象却不能访问静态成员。

那么静态成员是怎么访问的呢?我们知道,CLR在分配内存时,根据对象的大小在内存中划分一段区域,跟操作系统是相似的。CLR在加载程序时,发现编译器已经标记了这个静态变量,然后就在内存中这个应用程序域中分配出了一段区域来存储该静态变量,当然就是静态存储区了。因为这个静态变量存储在程序集的区域内,那么只要程序存在,即使这个类没有了,这个静态变量依然存在。然后在内存中也存在另一副本,起到引用的作用,当我们在访问该变量的时候,通过访问这个副本,然后副本指向这块内存区域位置。

实例成员的存储也是这样的,类在实例化一个对象的时候,就在内存中就会为其分配一段区域,以后每生成一个对象,就继续划分区域,一个接一个的排列。当我们访问里面的实例成员的时候就通过该对象来访问就可以

C#中静态成员和实例变量的更多相关文章

  1. 关于javascript中静态成员和实例成员的详细解释

    关于javascript中静态成员和实例成员的详细解释  在我们了解什么是静态成员和实例成员之前,我们首先来了解一下什么是实例? 实例就是由构造函数创建出来的对象. 例如案例中 p 就是实例: fun ...

  2. oc 中四种实例变量的范围类型@private@protected@public@package

    To enforce the ability of an object to hide its data, the compiler limits the scope of instance vari ...

  3. Java中实例方法,实例变量,静态方法,静态变量,final方法重写的问题,覆盖

    Java中只有非私有的实例方法能被重写,即实现多态,子类可以覆盖父类的方法,但是实例变量不能覆盖,若子类和父类均定义了同样名称的变量,则对于子类来说这是两个不同的变量,要想调用父类的变量必须显示去调用 ...

  4. iOS中四种实例变量的范围类型@private@protected@public@package

    文档上记录是这样的 The Scope of Instance Variables Toenforce the ability of an object to hide its data, the c ...

  5. JVM存储位置分配——java中局部变量、实例变量和静态变量在方法区、栈内存、堆内存中的分配

    Java中的变量根据不同的标准可以分为两类,以其引用的数据类型的不同来划分可分为“原始数据类型变量和引用数据类型变量”,以其作用范围的不同来区分可分为“局部变量,实例变量和静态变量”. 根据“Java ...

  6. Java中局部变量、实例变量和静态变量在方法区、栈内存、堆内存中的分配

    转自:https://blog.csdn.net/leunging/article/details/80599282 感谢CSDN博主「leunging」的总结分享 ———————————————— ...

  7. ruby中的类实例变量和实例的实例变量

    ruby中有实例变量这个语法,有点类似java的对象的属性,但是ruby中类也有实力变量, class Person @name = 'hello' def initialize(name,age) ...

  8. OC中实例变量可见度、setter、getter方法和自定义初始化方法

    在对类和对象有一定了解之后,我们进一步探讨实例变量的可见度等相关知识 实例变量的可见度分为三种情况:public(共有),protected(受保护的,默认),private(私有的),具体的不同和特 ...

  9. JAVA中 成员变量和和实例变量区别

    java语言支持的变量类型 类变量:独立于方法之外的变量,用 static 修饰. 局部变量:类的方法中的变量. 实例变量(全局变量):独立于方法之外的变量,不过没有 static 修饰. publi ...

随机推荐

  1. 【239】◀▶IEW-Unit04

    Unit 4 Youth Issues: Computer Use 1 Model1题目及范文分析 Some teenagers spend a lot of time playing compute ...

  2. François Hollande’s&…

    EVER since President François Hollande was elected last May, things have not gone right for him. He ...

  3. windows64位 redis安装 步骤

    官方下载:http://redis.io/download 可以根据需要下载不同版本 windows版:https://github.com/MSOpenTech/redis/releases 在D盘 ...

  4. HDU - 6344 2018百度之星资格赛 1001调查问卷(状压dp)

    调查问卷  Accepts: 1289  Submissions: 5642  Time Limit: 6500/6000 MS (Java/Others)  Memory Limit: 262144 ...

  5. HDU - 3664 Permutation Counting 排列规律dp

    Permutation Counting Given a permutation a1, a2, … aN of {1, 2, …, N}, we define its E-value as the ...

  6. ASP.NET学习笔记(四)CDOSYS邮件

    使用 CDOSYS 发送电子邮件 CDO (Collaboration Data Objects) 是一项微软的技术,设计目的是用来简化通信程序的创建. CDOSYS 是 ASP 中的内置组件.我们会 ...

  7. .net 扩展方法,lamada表达式 委托

    扩展方法 (1)扩展方法是一种特殊的静态方法,它定义在一个静态类中,但可以在其他类的对象上向调用实例方法那样进行调用.因此,通过扩展方法,我们就可以在不修改一个类型的前提下对一个类型进行功能上的扩充, ...

  8. Unity DOTS 走马观花

    https://segmentfault.com/a/1190000019143037 本文还在不断完善,可能不会及时同步在 SegmentFault,源文章在我的博客中:萤火之森 - Unity D ...

  9. [UE4]如何替换角色Mesh上的Material材质

    http://www.dawnarc.com/2016/10/ue4%E5%A6%82%E4%BD%95%E6%9B%BF%E6%8D%A2%E8%A7%92%E8%89%B2mesh%E4%B8%8 ...

  10. [Swift]LeetCode1079. 活字印刷 | Letter Tile Possibilities

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...