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

呵呵,今天跟前辈讨论了下,就写到这里吧。其实如果你学过基础你就知道,静态变量,无非前面加个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. [codeforces219D]Choosing Capital for Treeland树形dp

    题意:给出一棵树,带有向边,找出某个点到达所有点需要反转的最少的边. 解题关键:和求树的直径的思路差不多,将求(父树-子树)的最大值改为求特定值.依然是两次dfs,套路解法. 对树形dp的理解:树形d ...

  2. win10 ObservableCollection 排序自动收缩问题

    ObservableCollection本身是没有排序Sort功能的,不过我们可以通过冒泡排序来实现,以下是扩展功能: public static void Sort<T>(this Ob ...

  3. [转]C/C++获取当前系统时间

    原文转自:http://www.cnblogs.com/mfryf/archive/2012/02/13/2349360.html 个人觉得第二种还是比较实用的,而且也是最常用的~ 不过当计算算法耗时 ...

  4. SharePoint 2010 将带有工作流的模板移动到另一个站点集

    HOWTO Move or Migrate SharePoint 2010 List-based Workflows between Sites and Site Collections I’ve e ...

  5. Java8函数式接口之Predicate<T>

    作用: 这是一个功能接口,因此可以作为lambda表达式或方法引用的赋值目标. 实例: /** * Created by luo on 2017/5/3. */ public class Predic ...

  6. Sharepoint2013搜索学习笔记之设置业务数据内容源(六)

    Sharepoint搜索爬网组件支持爬Business Data Connectivity Service 承载的外部数据,关于Business Data Connectivity Service设置 ...

  7. 反射(type和assembly)

    这里简要介绍type和assembly 自定义特性 为了理解编写自定义特性的方式,应了解一下在编译器遇到代码中某个应用自定义特性的元素时,该如何处理. [AttributeUsage(Attribut ...

  8. Unity中场景异步加载

    引入命名空间 using UnityEngine.UI; using UnityEngine.SceneManagement; using System.Collections; using Syst ...

  9. 无监督学习:Deep Generative Mode(深度生成模型)

    一 前言 1.1 Creation 据说在费曼死后,人们在他生前的黑板上拍到如图画片,在左上角有道:What i cannot create ,I do not understand. Generat ...

  10. OVN学习(二)

    部署OVN实验环境 同OVN学习(一) L3网络 创建逻辑交换机和路由 ### Central节点 ### 创建逻辑交换机和路由器 # ovn-nbctl ls-add inside # ovn-nb ...