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

探究

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. Java-API-Package:java.io

    ylbtech-Java-API-Package:java.io 1.返回顶部 1. Package java.io Provides for system input and output thro ...

  2. SQL 从身份证号得到出生日期、年龄、男女

    ), CONVERT(smalldatetime, SUBSTRING(b.IDCard, , )), ) AS BrithDate_Name, DATEDIFF(year, CONVERT(smal ...

  3. Java事务的原理与应用

    Java事务的原理与应用 一.什么是Java事务 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性 (isolation ...

  4. adb基本命令总结(Android Debug Bridge)

    adb 是PC和设备连接的桥梁,可以通过adb对devices进行相关操作 adb devices           列出你的devices adb kill-server         杀掉ad ...

  5. 2016.2.28 DataTable用法汇总

    将控件的DataSource转换为DataTable,但是,此控件的DataSource绑定时必须是DataTable,不能是List DataTable dt = (bgvRoutePortion. ...

  6. javascript——屏蔽右键快捷菜单

    JS: function menufalse(){ return false; } document.oncontextmenu = menufalse; //禁用快捷菜单 Jquery: $(&qu ...

  7. ASP.NET 页面生命中的关键事件的执行顺序

    表 1:ASP.NET 页面生命中的关键事件 阶段 页面事件 可覆盖的方法 页面初始化 Init   加载视图状态   LoadViewState 处理回发数据   任意实现 IPostBackDat ...

  8. Android CTS(frome google)

    Compatibility Test Suite How does the CTS work? The Compatibility Test Suite (CTS) is a free, commer ...

  9. Git中远程仓库的使用

    1.查看当前的远程库 要查看当前配置有哪些远程仓库,可以用 git remote 命令,它会列出每个远程库的简短名字.在克隆完某个项目后,至少可以看到一个名为 origin 的远程库,Git 默认使用 ...

  10. 项目一:第十一天 2、运单waybill快速录入 3、权限demo演示-了解 5、权限模块数据模型 6、基于shiro实现用户认证-登录(重点)

    1. easyui DataGrid行编辑功能 2. 运单waybill快速录入 3. 权限demo演示-了解 4. Apache shiro安全框架概述 5. 权限模块数据模型 6. 基于shiro ...