C#中静态成员和实例变量
昨天晚上看静态成员和实例变量的时候,看到这样的一句话:默认情况下,若成员被定义为实例变量,这就意味着类需要为每个实例都建立一个副本,而在定义一个静态变量的时候,只存在此成员的一个副本。
呵呵,今天跟前辈讨论了下,就写到这里吧。其实如果你学过基础你就知道,静态变量,无非前面加个static。可是这里面有很多知识的。
在c#中,我们访问静态成员用的是类名+成员名称,而我们在访问实例成员的时候必须是对象名称+成员名称来进行访问。静态成员都是需要初始化的,即使你没有实例化对象也会被实例化,比如:
public static int count;
因为静态成员是CLR组织加载的。因此你不赋值,系统也会默认给你初始化,这里就是0了。而实例成员是在实例化对象后才被CLR加载的。
现在来看下副本的问题,当然就是存储的位置。那么什么是副本呢,MSDN里说的让人很难理解,因此我一开始根本不理解,总以为是有多个版本,但根本不是这个样子的。我们知道面向对象就是面向自然界的万物,那么一个类就是一个真实的存在。那么它就是一个原版咯,然后你建的每个对象就是他的实例,也就是他的一个副本。这样就好理解了。
其实如果多个人访问一个页面,那么将会实例化多个对象。而这多个对象虽然可能是一样的,但是在内存中存储的位置是不一样的,这样就做到了相互之间对象不会发生冲突。而静态变量则是不管你多少个来访问,他的值一旦初始化就不会改变,很多实例用的对象都是一致的,因此可以公用。我们再看,比如我实例化了一个对象,里面有静态成员,也有实例成员,但是你访问这个对象却不能访问静态成员。
那么静态成员是怎么访问的呢?我们知道,CLR在分配内存时,根据对象的大小在内存中划分一段区域,跟操作系统是相似的。CLR在加载程序时,发现编译器已经标记了这个静态变量,然后就在内存中这个应用程序域中分配出了一段区域来存储该静态变量,当然就是静态存储区了。因为这个静态变量存储在程序集的区域内,那么只要程序存在,即使这个类没有了,这个静态变量依然存在。然后在内存中也存在另一副本,起到引用的作用,当我们在访问该变量的时候,通过访问这个副本,然后副本指向这块内存区域位置。
实例成员的存储也是这样的,类在实例化一个对象的时候,就在内存中就会为其分配一段区域,以后每生成一个对象,就继续划分区域,一个接一个的排列。当我们访问里面的实例成员的时候就通过该对象来访问就可以
C#中静态成员和实例变量的更多相关文章
- 关于javascript中静态成员和实例成员的详细解释
关于javascript中静态成员和实例成员的详细解释 在我们了解什么是静态成员和实例成员之前,我们首先来了解一下什么是实例? 实例就是由构造函数创建出来的对象. 例如案例中 p 就是实例: fun ...
- oc 中四种实例变量的范围类型@private@protected@public@package
To enforce the ability of an object to hide its data, the compiler limits the scope of instance vari ...
- Java中实例方法,实例变量,静态方法,静态变量,final方法重写的问题,覆盖
Java中只有非私有的实例方法能被重写,即实现多态,子类可以覆盖父类的方法,但是实例变量不能覆盖,若子类和父类均定义了同样名称的变量,则对于子类来说这是两个不同的变量,要想调用父类的变量必须显示去调用 ...
- iOS中四种实例变量的范围类型@private@protected@public@package
文档上记录是这样的 The Scope of Instance Variables Toenforce the ability of an object to hide its data, the c ...
- JVM存储位置分配——java中局部变量、实例变量和静态变量在方法区、栈内存、堆内存中的分配
Java中的变量根据不同的标准可以分为两类,以其引用的数据类型的不同来划分可分为“原始数据类型变量和引用数据类型变量”,以其作用范围的不同来区分可分为“局部变量,实例变量和静态变量”. 根据“Java ...
- Java中局部变量、实例变量和静态变量在方法区、栈内存、堆内存中的分配
转自:https://blog.csdn.net/leunging/article/details/80599282 感谢CSDN博主「leunging」的总结分享 ———————————————— ...
- ruby中的类实例变量和实例的实例变量
ruby中有实例变量这个语法,有点类似java的对象的属性,但是ruby中类也有实力变量, class Person @name = 'hello' def initialize(name,age) ...
- OC中实例变量可见度、setter、getter方法和自定义初始化方法
在对类和对象有一定了解之后,我们进一步探讨实例变量的可见度等相关知识 实例变量的可见度分为三种情况:public(共有),protected(受保护的,默认),private(私有的),具体的不同和特 ...
- JAVA中 成员变量和和实例变量区别
java语言支持的变量类型 类变量:独立于方法之外的变量,用 static 修饰. 局部变量:类的方法中的变量. 实例变量(全局变量):独立于方法之外的变量,不过没有 static 修饰. publi ...
随机推荐
- struts2+jquery+easyui+datagrid+j…
一.概述 struts2提供了针对json的插件支持.常规来讲我们将如何将对象数组转成json对象在客户端直接调用呢?尤其和jquery的easyui插件配合使用,这个可能会有很多的问题需要我们解决. ...
- Spring3注解零配置
我们在以前学习 Spring 的时候,其所有的配置信息都写在 applicationContext.xml 里,大致示例如下: java代码: 查看复制到剪贴板打印 OracleDriver& ...
- 《Java多线程编程核心技术》读后感(四)
将任意对象作为对象监视器 synchronized同步代码块还支持任意对象,使用格式为synchronized(非this对象) package Second; public class Servic ...
- hdu2732 Leapin' Lizards (网络流dinic)
D - Leapin' Lizards Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u ...
- 为什么选择Netty
支持高并发访问 比核心 Java API 更好的吞吐量,较低的延时资源消耗更少,这个得益于共享池和重用减少内存拷贝 https://baike.baidu.com/item/Netty/1006162 ...
- c程序实现unicode字符转utf-8字符
下面是一个unicode字符转换为utf-8的c程序实现: /* * ================================================================= ...
- 1、在 Windows 上安装 OpenCV-Python & ubuntu16.04安装 opencv
Goals In this tutorial We will learn to setup OpenCV-Python in your Windows system. Below steps are ...
- C#API接口调试工具
自从去年软件界网站开发推崇前后端分离,我们公司也在进行转行行,从原先的前端架构,后端架构,数据库搭建一肩挑的模式也逐渐转型为前后端分离,大量招收前端开发人员,原来的人员也转型为专职的后端开发,这样的变 ...
- bootstrap的popover()的使用
有一些选项是通过 Bootstrap 数据 API(Bootstrap Data API)添加或通过 JavaScript 调用的.下表列出了这些选项: 选项名称 类型/默认值 Data 属性名称 描 ...
- backgroundWorker取消后,重新开始就报错:此 BackgroundWorker 当前正忙,无法同时运行多个任务。
使用BackgroundWorker控件,有2个按钮buttonBegin和buttonCancel.其他都正常,只是在用buttonBegin开始运行,然后点击buttonCancel取消后,到这里 ...