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

探究

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。

转载于:https://www.cnblogs.com/joyang/p/5125167.html

C#静态类 转载:(原文:http://www.cnblogs.com/chenlulouis/ )相关推荐

  1. 全面理解Javascript闭包和闭包的几种写法及用途--转载自https://www.cnblogs.com/yunfeifei/p/4019504.html...

    全面理解Javascript闭包和闭包的几种写法及用途 好久没有写博客了,过了一个十一长假都变懒了,今天总算是恢复状态了.好了,进入正题,今天来说一说javascript里面的闭包吧!本篇博客主要讲一 ...

  2. 存储过程使用事物的几种方式 转载自--http://www.cnblogs.com/chengxiaoming/archive/2010/06/11/1756163.html...

    --方式一 ifexists (select*from dbo.sysobjects where id =object_id(N'[dbo].[USP_ProcedureWithTransaction ...

  3. SharePoint 入门书籍推荐 转载来源http://www.cnblogs.com/jianyus/p/3513238.html

    最近,总有人说刚入门SharePoint,没有好的资料或者电子书,资料推荐大家多看看博客园和CSDN的博客.对于看博客,我一般是两个思路,要么找一个人的从头到尾看一遍,觉得有意义的,就把地址加收藏:或 ...

  4. 【mysql+RBAC】RBAC权限处理(转载:http://www.cnblogs.com/xiaoxi/p/5889486.html 平凡希)...

    1.这里我只讲核心,mysql查询语句:FIND_IN_SET(str,strlist) 2.具体教程可以参考[童攀老师的RBAC],很清晰,赞一个. 3.详解:mysql的find_in_set 首 ...

  5. 转载:原文http://www.cnblogs.com/gao241/p/3522143.html

    shell实例手册0说明{手册制作: 雪松更新日期: 2013-12-06欢迎系统运维加入Q群: 198173206请使用"notepad++"打开此文档,"alt+0& ...

  6. java中的逆变、协变、不变概念讲解转载自http://www.cnblogs.com/en-heng/p/5041124.html,感谢编程路上的前辈们!

    En-Heng 无他,但手熟尔 博客园 首页 新随笔 联系 订阅 管理 随笔 - 32  文章 - 0  评论 - 33 Java中的逆变与协变 看下面一段代码 Number num = new In ...

  7. C#事件与委托详解【精华 多看看】--转载于https://www.cnblogs.com/sjqq/p/6917497.html

    Delegate delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类.与其它的类不同,delegate类能够拥有一个签名(signature),并且它"只能持有与 ...

  8. IntelliJ IDEA2017 修改缓存文件的路径(转载:https://www.cnblogs.com/acm-bingzi/p/ideaCachePath.html)

    IDEA的缓存文件夹.IntelliJIdea2017.1,存放着IDEA的破解密码,各个项目的缓存,默认是在C盘的用户目录下,目前有1.5G大小.现在想要把它从C盘移出. 在IDEA的安装路径下中, ...

  9. 64位Linux下安装mysql-5.7.13-linux-glibc2.5-x86_64 || 转载:http://www.cnblogs.com/gaojupeng/p/5727069.html

    由于公司临时让将Oracle的数据移植到mysql上面,所以让我在公司服务器上面安装一下mysql.下面就是我的安装过程以及一些错误解决思路.其实对于不同版本安装大体都有差不多. 1. 从官网下载 m ...

最新文章

  1. Android必备:Android的体系结构
  2. 安装View Agent失败: The system must be rebooted before installation can continue
  3. ubuntun_11.04安装
  4. boost::mp11::mp_eval_or相关用法的测试程序
  5. IIS发布站点错误收集(持续更新)
  6. ios nstimer实现延时_iOS 中常见 Crash 总结
  7. primefaces_Primefaces CommandLink
  8. 【bzoj1593-预定旅馆】线段树维护连续区间
  9. AFNetworking实现程序重新启动时的断点续传
  10. 吉林大学计算机学院杜天宇,2016年全国研究生数学建模竞赛获奖名单
  11. PAT 甲级 图形输出 1031 Hello World for U (20 分)
  12. C语言使用socket通过IP138获取外网IP
  13. 在win7的iis下部署asp网站
  14. (转)学习打印机,了解打印命令 .
  15. 实现语音对讲_校园IP广播对讲融合解决方案
  16. 小哥哥,你代码写得真好。
  17. 鸿蒙跨屏协作实现原理,跨屏协作满足效率党 高效工作这几款手机必备
  18. 为什么反向传播更加高效
  19. 基于区块链溯源系统后端开发
  20. Cisco ASA 5585 with firepower upgrade 升级 配置证书

热门文章

  1. 深入浅出Node.js(八):Connect模块解析(之二)静态文件中间件
  2. 重构授课班时间安排模块代码
  3. Websphere 7小版本不同导致的JAXP兼容性问题
  4. why do you want to university of cambridge?
  5. tableau的2020.3在mac上可以使用,2020.4不行:亲测有效
  6. Eclipse(STS) 初次搭建Spring Cloud项目之断路器Hystrix(五)
  7. Flutter ListView封装,下拉刷新、上拉加载更多
  8. SpingBoot-Thymeleaf-bootstrapTable-分页之H5
  9. SEO搜索引擎优化排名方法大全
  10. ASP.NET的错误处理机制之二(实例log4net)