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

呵呵,今天跟前辈讨论了下,就写到这里吧。其实如果你学过基础你就知道,静态变量,无非前面加个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. MFC编辑框数据实时更新问题

    在VC里,很多情况下需要更新控件,也就是调用UpdateData(FALSE);但是如果是在循环中调用该函数,会导致没有时间来刷新界面,消息得不到相应,从外部看来,似乎整个循环只执行了一次Update ...

  2. 《精通Spring4.X企业应用开发实战》读后感第四章(Java反射)

    package com.smart.reflect; public class Car { private String brand; private String color; private in ...

  3. Servlet拦截匹配规则可以自已定义,拦截哪种URL合适?

    Servlet拦截匹配规则可以自已定义,拦截哪种URL合适? 当映射为@RequestMapping("/user/add")时,为例: 1.拦截*.do.*.htm, 例如:/u ...

  4. 【原】spring+springmvc+mybatis整合

    整合框架的代码结构: 最全约束: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&q ...

  5. VisualStudio2017中新建的ASP.NET Core项目中的各个文件的含义

     Program.cs is the entry point for the web application; everything starts from here. As we mentione ...

  6. cogs 2057. [ZLXOI2015]殉国

    2057. [ZLXOI2015]殉国 ★☆   输入文件:BlackHawk.in   输出文件:BlackHawk.out   评测插件时间限制:0.05 s   内存限制:256 MB [题目描 ...

  7. 01分数规划初探?!By cellur925

    都要\(NOIp\)了为啥我还在看这种玄学玩意..... \(01\)分数规划:这是一个问题模型\(qwq\),一般是在求\[\frac{\sum_{i=1}^{n} a_i*x_i}{\sum_{i ...

  8. blur和focus的运用

    这两个事件不仅仅只能运用与input.span之类的元素.还可以运用于window. 可以切换title. 当切换当前页面时,改变title的文字为‘离开了’. <!DOCTYPE html&g ...

  9. C# 多线程程序隐患

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  10. python isinstance函数 判断元素是否是字符串、int型、float型

    isinstance(1, int) 判断是否是int型isinstance(1.0, float) 判断是否是float型isinstance(s, str) 判断是否是字符串型isinstance ...