静态类是不能实例化的,我们直接使用它的属性与方法,静态类最大的特点就是共享。

探究

public static class StaticTestClass
{
    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 标志。
  • 静态构造函数不可被直接调用,当创建类实例或引用任何静态成员之前,静态构造函数被自动执行,并且只执行一次。
  • 类与结构的实例比较
  • 类与结构的差别
  • 如何选择结构还是类

类与结构的示例比较

结构示例

public struct Person
{
    string Name;
    int  height;
    int  weight
    
    public bool overWeight()
    {
        //implement something
    }
}

类示例

public class TestTime
{
    int hours;
    int minutes;
    int seconds;
    
    public void passtime()
    {
        //implementation of behavior
    }
}

调用过程

public class Test
{
    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/ )的更多相关文章

  1. 推荐一些C#相关的网站、资源和书籍 (转载自http://www.cnblogs.com/jiangxiaofan/p/3808316.html)

    推荐一些C#相关的网站.资源和书籍 (转载自http://blog.csdn.net/chinacsharper/article/details/17514923)   一.网站 1.http://m ...

  2. 【redis】redis五大类 用法 【转载:https://www.cnblogs.com/yanan7890/p/6617305.html】

    转载地址:https://www.cnblogs.com/yanan7890/p/6617305.html

  3. mysql 监控及优化——转载自http://www.cnblogs.com/suansuan/

    1.Mysql连接数 Mysql默认最大连接数为100. 设置Mysql的最大连接数,在Mysql的配置文件中增加: max_connections = 1000   #Mysql的最大连接数,默认如 ...

  4. ASP.NET MVC路由配置(转载自http://www.cnblogs.com/zeusro/p/RouteConfig.html )

    把apress.pro.asp.net.mvc.4.framework里的CHAPTER 13翻译过来罢了. XD 首先说URL的构造. 其实这个也谈不上构造,只是语法特性吧. 命名参数规范+匿名对象 ...

  5. JVM学习(4)——全面总结Java的GC算法和回收机制---转载自http://www.cnblogs.com/kubixuesheng/p/5208647.html

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 一些JVM的跟踪参数的设置 Java堆的分配参数 -Xmx 和 –Xms 应该保持一个什么关系,可以让系统的 ...

  6. JVM学习(3)——总结Java内存模型---转载自http://www.cnblogs.com/kubixuesheng/p/5202556.html

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 为什么学习Java的内存模式 缓存一致性问题 什么是内存模型 JMM(Java Memory Model)简 ...

  7. 转载:http://www.cnblogs.com/double-K/p/6926367.html

    sql专家感悟:不可说的感悟-——十年老技术转型(一) http://www.cnblogs.com/double-K/p/6926367.html

  8. 关于pipeline的一篇转载博文https://www.cnblogs.com/midhillzhou/p/5588958.html

    引用自https://www.cnblogs.com/midhillzhou/p/5588958.html 1.pipeline的产生 从一个现象说起,有一家咖啡吧生意特别好,每天来的客人络绎不绝,客 ...

  9. HQL查询语言——转载(http://www.cnblogs.com/20gg-com/p/6045739.html)

    Hibernate查询语言(HQL)是一种面向对象的查询语言,类似于SQL,但不是对表和列操作,HQL适用于持久对象和它们的属性. HQL查询由Hibernate转换成传统的SQL查询,这在圈上的数据 ...

随机推荐

  1. 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/ 所有的“硬”指针指向的资源都 ...

  2. Django 多条件多表查询实例问题

    当时想做一个多条件查询,但是对于要查询的信息,是分布在不同的表里,这就涉及到了多表查询问题. DjangoBook里提到了一些查询的方式,但是不够全面,就去百度搜了下. 当去网上百度搜多表查询,或多条 ...

  3. [git更新中]版本控制工具git初步使用

    逐渐开始写规模稍大的程序, 如果在像以前一样每写完一次保存一个版本, 修改起来太蛋疼了, 而且还会忘记都有修改过哪里, 最终如果写完的话, 各种不方便, 于是便开始接触版本控制工具. 因为是在Linu ...

  4. DDD学习笔录——简介DDD的战术模式、问题空间和解空间

    DDD的战术模式 DDD的战术模式(也称为模型构造块)是一个帮助创建 用于复杂有界上下文的有效模型的 模式集合. 也就是我们常说的设计模式. 问题空间 问题空间将问题域提炼成更多可管理的子域,是真对于 ...

  5. java中的自动转型的学习理解

    java当中的继承是和c++中的继承类似,只是java中的继承时的父类只能有一位. 我们今天在这里讲的是关于java中的自动转型的理解:顾名思义,自动转型值得就是使用时自动的将自身的类型进行转化. 自 ...

  6. python爬虫框架(1)--框架概述

    框架概述 其中比较好用的是 Scrapy 和PySpider.pyspider上手更简单,操作更加简便,因为它增加了 WEB 界面,写爬虫迅速,集成了phantomjs,可以用来抓取js渲染的页面.S ...

  7. ruby 访问权限

    ##################### # 访问权限 ##################### class HeidSoft ##默认方法 def method1 ##### end prote ...

  8. ROS Learning-029 (提高篇-007 A Mobile Base-05) 控制移动平台 --- (Python编程)控制虚拟机器人的移动(精确的制定目标位置)

    ROS 提高篇 之 A Mobile Base-05 - 控制移动平台 - (Python编程)控制虚拟机器人的移动(精确的制定目标位置) 使用 odometry 消息类型 重写 out_and_ba ...

  9. Blender 软件 四视图布局的创建方法

    Blender 软件 四视图布局的创建方法 我使用的Blender版本:Blender V 2.77 Q: 为什么要创建一个:四视图布局场景? A: 原因1:四视图布局最适合模型建模.原因2:在 Bl ...

  10. 算法Sedgewick第四版-第1章基础-023-MultiwordSearch.java

    Multi-word search. Program MultiwordSearch.java reads a sequence of query words q[1], ..., q[k] from ...