C#静态类 转载:(原文:http://www.cnblogs.com/chenlulouis/ )
静态类是不能实例化的,我们直接使用它的属性与方法,静态类最大的特点就是共享。
探究
{
public static int n = 0;
public static void Add()
{
n++;
}
}
- 网页 P1.aspx 调用 StaticTestClass.Add(),并在页面上输出 n。
- 网页 P2.aspx 调用 StaticTestClass.Add(),并在页面上输出 n。
- 访问者 V1 从客户端 C1 访问 P1.aspx,此时输出为 1。
- 访问者 V2 从客户端 C2 访问 P2.aspx,此时输出为 2。
- 访问者 V1 关闭浏览器,重新打开访问 P1.aspx,此时输出为 3。
只要 StaticTestClass 没有被重新编译,即使 P1.aspx、P2.aspx 被重新编译,每当调用 StaticTestClass.Add(),n 都会在前一个次的基础上加 1。
原则
- 静态类中的所有成员必须是静态的。
静态构造函数
- 静态类可以有静态构造函数,静态构造函数不可继承。
- 静态构造函数可以用于静态类,也可用于非静态类。
- 静态构造函数无访问修饰符、无参数,只有一个 static 标志。
- 静态构造函数不可被直接调用,当创建类实例或引用任何静态成员之前,静态构造函数被自动执行,并且只执行一次。
- 类与结构的实例比较
- 类与结构的差别
- 如何选择结构还是类
类与结构的示例比较
结构示例
{
string Name;
int height;
int weight
public bool overWeight()
{
//implement something
}
类示例
{
int hours;
int minutes;
int seconds;
public void passtime()
{
//implementation of behavior
}
}
调用过程
{
public static ovid Main
{
Person Myperson=new Person //声明结构
TestTime Mytime=New TestTime //声明类
}
}
从上面的例子中我们可以看到,类的声明和结构的声明非常类似,只是限定符后面是 struct 还是 class 的区别,而且使用时,定义新的结构和定义新的类的方法也非常类似。那么类和结构的具体区别是什么呢?
类与结构的差别
值类型与引用类型
结构
结构是值类型,值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应 system.string 结构 ,通过使用结构可以创建更多的值类型。
类
类是引用类型,引用类型在堆上分配地址。
堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑。
因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用。
说明:
- 虽然结构与类的类型不一样,可是他们的基类型都是对象(object),C# 中所有类型的基类型都是 Object。
- 虽然结构的初始化也使用了 new 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用。
继承性
结构
不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用 sealed 声明,可是结构是隐式的 sealed。
类
完全可扩展的,除非显示的声明 sealed,否则类可以继承其他类和接口,自身也能被继承。
说明:
- 虽然结构不能被继承 可是结构能够继承接口,方法和类继承接口一样。
例如:结构实现接口
interface IImage
{
void Paint();
}
struct Picture : IImage
{
public void Paint()
{
// painting code goes here
}
private int x, y, z;
// other struct members
}
内部结构
结构
- 没有默认的构造函数,但是可以添加构造函数
- 没有析构函数
- 没有 abstract 和 sealed(因为不能继承)
- 不能有 protected 修饰符
- 可以不使用 new 初始化
- 在结构中初始化实例字段是错误的
类
- 有默认的构造函数
- 有析构函数
- 可以使用 abstract 和 sealed
- 有 protected 修饰符
- 必须使用 new 初始化
如何选择结构还是类
讨论了结构与类的相同之处和差别之后,下面讨论如何选择使用结构还是类:
- 堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些。
- 结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。
- 在表现抽象和多级别的对象层次时,类是最好的选择。
- 大多数情况下该类型只是一些数据时,结构时最佳的选择。
----
网友在 CSDN 上的回答:
结构可以看作是轻量级的类,在性能上要好一点。
相同之处:
- 结构和类对于程序来讲都通过指针操作,同样是面向对象的形式。
不同之处:
- 结构体对象总是在线程堆栈上操作,而不是托管堆上。
- 不能继承一个结构体(所以在调用结构体的方法时不需要查找 vtable: 虚函数继承表)
- 我们不能声明构造函数为空的结构体(不晓得为啥非得要这么设计)
- 结构体的构造函数内必须初始化所有变量(不晓得为啥非得要这么设计)
- 结构体的字段不能有默认值(默认都是二进制意义上的零值),但是可以在构造函数内改变“默认值”
.....
按照MSDN上的意思,实际上适合用 struct 的场合很小,结构使用指南:
- 行为与基元类型一样。
- 具有 16 字节以下的实例大小。
- 是不可改变的。
- 值语义是合意的。
在 C# 中结构与类的区别一文中,已经介绍了 struct 的相关知识,本文就结合应用作些强调、补充、修正。
关于字段
不能在声明字段时初始化它,除非字段被标明为 const 或 static。
关于构造函数
构造函数必须有参数。
构造函数中必须为所有的字段赋值。
说明
不允许在结构中显式地声明无参数的构造函数,若要显示地声明则必须是有参数的。但在使用 new 实例化时可以使用无参数的构造函数,也可以使用有参数的构造函数,说明存在着一个看不到的、默认的无参数构造函数,《C# 中结构与类的区别》一文中说结构“没有默认的构造函数”,这种说法有误。
要不要使用 new
如果使用结构中的属性、方法,则必须使用 new,否则可以不使用 new。
嵌套类型
在类或结构内部定义的类型称为嵌套类型。例如:
class Container { class Nested { Nested() { } } }
不管外部类型是类还是结构,嵌套类型均默认为 private,但是可以设置为 public、protected internal、protected、internal 或 private。在上面的示例中,Nested 对外部类型是不可访问的,但可以设置为 public,如下所示:
class Container { public class Nested { Nested() { } } }
嵌套类型(或内部类型)可访问包含类型(或外部类型)。若要访问包含类型,请将其作为构造函数传递给嵌套类型。例如:
public class Container { public class Nested { private Container m_parent; public Nested() { } public Nested(Container parent) { m_parent = parent; } } }
嵌套类型可访问包含类型的私有成员和受保护的成员(包括所有继承的私有成员或受保护的成员)。
在前面的声明中,类 Nested 的完整名称为 Container.Nested。这是用来创建嵌套类的新实例的名称,如下所示:
Container.Nested nest = new Container.Nested();
作者:ChenLuLouis
出处:http://www.cnblogs.com/chenlulouis/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-chenlulouisBlog。
C#静态类 转载:(原文:http://www.cnblogs.com/chenlulouis/ )的更多相关文章
- 推荐一些C#相关的网站、资源和书籍 (转载自http://www.cnblogs.com/jiangxiaofan/p/3808316.html)
推荐一些C#相关的网站.资源和书籍 (转载自http://blog.csdn.net/chinacsharper/article/details/17514923) 一.网站 1.http://m ...
- 【redis】redis五大类 用法 【转载:https://www.cnblogs.com/yanan7890/p/6617305.html】
转载地址:https://www.cnblogs.com/yanan7890/p/6617305.html
- mysql 监控及优化——转载自http://www.cnblogs.com/suansuan/
1.Mysql连接数 Mysql默认最大连接数为100. 设置Mysql的最大连接数,在Mysql的配置文件中增加: max_connections = 1000 #Mysql的最大连接数,默认如 ...
- ASP.NET MVC路由配置(转载自http://www.cnblogs.com/zeusro/p/RouteConfig.html )
把apress.pro.asp.net.mvc.4.framework里的CHAPTER 13翻译过来罢了. XD 首先说URL的构造. 其实这个也谈不上构造,只是语法特性吧. 命名参数规范+匿名对象 ...
- JVM学习(4)——全面总结Java的GC算法和回收机制---转载自http://www.cnblogs.com/kubixuesheng/p/5208647.html
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 一些JVM的跟踪参数的设置 Java堆的分配参数 -Xmx 和 –Xms 应该保持一个什么关系,可以让系统的 ...
- JVM学习(3)——总结Java内存模型---转载自http://www.cnblogs.com/kubixuesheng/p/5202556.html
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 为什么学习Java的内存模式 缓存一致性问题 什么是内存模型 JMM(Java Memory Model)简 ...
- 转载:http://www.cnblogs.com/double-K/p/6926367.html
sql专家感悟:不可说的感悟-——十年老技术转型(一) http://www.cnblogs.com/double-K/p/6926367.html
- 关于pipeline的一篇转载博文https://www.cnblogs.com/midhillzhou/p/5588958.html
引用自https://www.cnblogs.com/midhillzhou/p/5588958.html 1.pipeline的产生 从一个现象说起,有一家咖啡吧生意特别好,每天来的客人络绎不绝,客 ...
- HQL查询语言——转载(http://www.cnblogs.com/20gg-com/p/6045739.html)
Hibernate查询语言(HQL)是一种面向对象的查询语言,类似于SQL,但不是对表和列操作,HQL适用于持久对象和它们的属性. HQL查询由Hibernate转换成传统的SQL查询,这在圈上的数据 ...
随机推荐
- UE4异步载入资源
转自:http://blog.ch-wind.com/ue4%E5%BC%82%E6%AD%A5%E8%BD%BD%E5%85%A5%E8%B5%84%E6%BA%90/ 所有的“硬”指针指向的资源都 ...
- Django 多条件多表查询实例问题
当时想做一个多条件查询,但是对于要查询的信息,是分布在不同的表里,这就涉及到了多表查询问题. DjangoBook里提到了一些查询的方式,但是不够全面,就去百度搜了下. 当去网上百度搜多表查询,或多条 ...
- [git更新中]版本控制工具git初步使用
逐渐开始写规模稍大的程序, 如果在像以前一样每写完一次保存一个版本, 修改起来太蛋疼了, 而且还会忘记都有修改过哪里, 最终如果写完的话, 各种不方便, 于是便开始接触版本控制工具. 因为是在Linu ...
- DDD学习笔录——简介DDD的战术模式、问题空间和解空间
DDD的战术模式 DDD的战术模式(也称为模型构造块)是一个帮助创建 用于复杂有界上下文的有效模型的 模式集合. 也就是我们常说的设计模式. 问题空间 问题空间将问题域提炼成更多可管理的子域,是真对于 ...
- java中的自动转型的学习理解
java当中的继承是和c++中的继承类似,只是java中的继承时的父类只能有一位. 我们今天在这里讲的是关于java中的自动转型的理解:顾名思义,自动转型值得就是使用时自动的将自身的类型进行转化. 自 ...
- python爬虫框架(1)--框架概述
框架概述 其中比较好用的是 Scrapy 和PySpider.pyspider上手更简单,操作更加简便,因为它增加了 WEB 界面,写爬虫迅速,集成了phantomjs,可以用来抓取js渲染的页面.S ...
- ruby 访问权限
##################### # 访问权限 ##################### class HeidSoft ##默认方法 def method1 ##### end prote ...
- ROS Learning-029 (提高篇-007 A Mobile Base-05) 控制移动平台 --- (Python编程)控制虚拟机器人的移动(精确的制定目标位置)
ROS 提高篇 之 A Mobile Base-05 - 控制移动平台 - (Python编程)控制虚拟机器人的移动(精确的制定目标位置) 使用 odometry 消息类型 重写 out_and_ba ...
- Blender 软件 四视图布局的创建方法
Blender 软件 四视图布局的创建方法 我使用的Blender版本:Blender V 2.77 Q: 为什么要创建一个:四视图布局场景? A: 原因1:四视图布局最适合模型建模.原因2:在 Bl ...
- 算法Sedgewick第四版-第1章基础-023-MultiwordSearch.java
Multi-word search. Program MultiwordSearch.java reads a sequence of query words q[1], ..., q[k] from ...