说起静态类,你可能会联想到实例类。这两者并不难区分,前者(静态类)只在内存中创建一个,而后者(实例类)则是每次实例化后,就会再内存创建一份。今天来简单聊一下静态类的理解。

代码情景:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Person p1 = new Person();
  6. p1.Name = "zs";
  7. p1.LivePlanet = "earth";
  8.  
  9. Person p2 = new Person();
  10. p1.Name = "ls";
  11. p1.LivePlanet = "earth";
  12. }
  13. }
  14.  
  15. public class Person
  16. {
  17.  
  18. public string Name { get; set; }
  19. public int Age { get; set; }
  20. public string Phone { get; set; }
  21. public string LivePlanet { get; set; }
  22. }

根据以上的情景假如我需要实例化100个对象,而Person中的LivePlanet属性值都统一为earth,不就得反复重写100次? 这样妥吗?起码您应该知道违背了DRY原则。

好吧,我们来实现一下通过static 来改善这个代码:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Person.LivePlanet = "earth"
  6. Person p1 = new Person();
  7. p1.Name = "zs";
  8. //p1.LivePlanet = "earth";
  9.  
  10. Person p2 = new Person();
  11. p1.Name = "ls";
  12. //p1.LivePlanet = "earth";
  13. }
  14. }
  15.  
  16. public class Person
  17. {
  18.  
  19. public string Name { get; set; }
  20. public int Age { get; set; }
  21. public string Phone { get; set; }
  22. public static string LivePlanet { get; set; }
  23. }

我们在Person类把LivePlanet改成static,这样我们直接可以不需要实例化可以直接Person.LivePlanet = "earth"。这样的好处不仅在于此,而且这解决了当所有对象都共享同一个信息的时候,不需要重复去实例化再去调用这个对象。

请注意以下几点:

1.存储在静态成员中的信息只有在应用程序退出的时候才会从内存里释放出来。

2.静态成员不能通过对象访问,只能通过类名直接访问。

3.静态成员(内容)在内存中只存储一份。

4.静态成员,在整个应用程序中任何一个地方都可以访问的到,所以静态成员直到程序退出后才会释放内存。而实例成员,当没有变量使用就可以被垃圾回收,回收后内存就释放了.(可以把一些常用的工具函数,封装到一个静态类中,使用方便)


现在请您再看这个简单的改动会有什么问题,我在Person中添加一个静态方法然后通过this来调用静态成员。

  1. public class Person
  2. {
  3. public static void Say()
  4. {
  5. this.Name = "你好";
  6. }
  7.  
  8. public string Name { get; set; }
  9. public int Age { get; set; }
  10. public string Phone { get; set; }
  11. public static string LivePlanet { get; set; }
  12. }

可能在脱离编译器的情况下,您可能觉得this 就是Person,所以这个调用不应该会存在问题。实际上这边请您注意我用的是静态static,而静态成员访问实例成员必须要new一个实例。并且this指的是当前的对象,在使用静态成员的时候因为还没实例化一个对象,所以这个时候this无法得知自己的身份。

改动如下:

  1. public class Person
  2. {
  3. public static void Say()
  4. {
  5. Person p = new Person();
  6. p.Name = "你好";
  7. //this.Name = "你好";
  8. }
  9.  
  10. public string Name { get; set; }
  11. public int Age { get; set; }
  12. public string Phone { get; set; }
  13. public static string LivePlanet { get; set; }
  14. }

这才是我们想要的结果。

那什么是静态类呢?请看如下代码:

  1. public static class MyStaticClass
  2. {
  3. public static string Name { get; set; }
  4.  
  5. public static void SayHi()
  6. {
  7. Console.WriteLine("hi");
  8. }
  9.  
  10. }

观察以上代码可以看出静态类的几个特点:

1.在静态类中只能有静态成员,不能有实例成员
2.静态类不能创建对象,不能new对象

使用静态类跟使用静态成员的情景其实是一样的,即在整个应用程序中要共享数据的时候可以使用静态类。所以对于那些类中包含有大量的方法,并且类不需要创建对象的时候,可以使用静态类。

c#静态成员和静态类的更多相关文章

  1. .net学习之类与对象、new关键字、构造函数、常量和只读变量、枚举、结构、垃圾回收、静态成员、静态类等

    1.类与对象的关系类是对一类事务的统称,是抽象的,不能拿来直接使用,比如汽车,没有具体指哪一辆汽车对象是一个具体存在的,看的见,摸得着的,可以拿来直接使用,比如我家的那辆刚刚买的新汽车,就是具体的对象 ...

  2. 【C#小知识】C#中一些易混淆概念总结(三)---------结构,GC,静态成员,静态类

    目录: [C#小知识]C#中一些易混淆概念总结 [C#小知识]C#中一些易混淆概念总结(二) ---------------------------------------分割线----------- ...

  3. DotNet中静态成员、静态类、静态构造方法和实例构造方法的区别与联系

    在面向对象的C#程序设计中,关于静态的概念一直是很多人搞不明白的.下面介绍这些带“静态”的名称. 1.静态成员: 定义:静态成员是用static关键字修饰的成员(包括字段属性和方法) 所属:静态成员是 ...

  4. 静态类和静态类成员(C# 编程指南)

    静态类与非静态类基本相同,但存在一个区别:静态类不能实例化. 也就是说,不能使用 new 关键字创建静态类类型的变量. 因为没有实例变量,所以要使用类名本身访问静态类的成员. 例如,如果名为 Util ...

  5. C# 静态类和非静态类的区别

    静态类和非静态类的区别 静态类: static       关键字 调用 类名.方法 在静态方法中只能访问静态成员  在静态类中只能有静态成员 在非静态类中 即可有非静态成员,也可以有静态成员 在静态 ...

  6. 对static静态成员的理解

    疑惑: 数据成员可以分静态变量.非静态变量两种.  静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例 ...

  7. PHP静态成员变量和非静态成员变量

    数据成员可以分静态变量.非静态变量两种. 静态成员: 静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会 ...

  8. PHP静态成员变量

    静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员.. ...

  9. C++类中的静态成员变量和静态成员函数的作用

    数据成员可以分为静态变量.非静态变量两种. 静态成员:静态类中的成员加入static 修饰符,即是静态成员,可以使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配 ...

随机推荐

  1. C#后台执行bat

    C#后台执行bat ProcessStartInfo p = new ProcessStartInfo(); p.FileName = "C:\\1.bat"; p.WindowS ...

  2. 圣诞福利到!51Testing邀你一起来狂欢!有礼就是任性~(≧▽≦)/~

    “我想变成一棵树,一棵只为你存在的圣诞树,顶上最大最亮的那颗星是我的真心,下面挂满我对你的祝福. 你的关注是我的幸福,你的肯定是我的力量,而我将用更多精彩的内容,用心的分享,给你下一个一整年的 精彩! ...

  3. Unity3d Fast Indirect illumination Using Two Virtual Spherical Gaussian Lights-Square Enix论文

    博主实现(in Unity3d 5) used one spotlight 史克威尔效果展示(夜光引擎?) 博主近期渲染:最近用unity5弄的一些渲染 ---- by wolf96  http:// ...

  4. 路径和 二叉树 leecode

    题目不难,很快ac,纯粹靠手感.https://oj.leetcode.com/problems/sum-root-to-leaf-numbers/ /** * Definition for bina ...

  5. Android SlidingMenu 滑出侧边栏

    最近有个项目需要使用侧边栏,而且希望是左右两侧都能够滑出侧边菜单,在网上查找实现方式时,发现大家用的最多的还是大神jfeinstein10的SlidingMenu库,地址https://github. ...

  6. WE-1202 (JGX-X5 v1.3)刷openwrt

    当前固件版本显示 固件版本 RippleOS硬件型号 RippleTek WE-1202CPU型号是 MT7620N路由主板上面丝印是 JGX-X5  v1.3 买的时候选择的RippleOS固件,后 ...

  7. 【ACM/ICPC2013】线段树题目集合(一)

    前言:前一段时间在网上找了一个线段树题目列表,我顺着做了一些,今天我把做过的整理一下.感觉自己对线段树了解的还不是很深,自己的算法能力还要加强.光练代码能力还是不够的,要多思考.向队友学习,向大牛学习 ...

  8. Linux趣谈

    要解释操作系统是如何工作的,首先可以用这几个关键字来简单地概括一下:冯诺依曼.堆栈机制和中断机制. 提到冯诺依曼很显然就是在说存储程序了,这大概是计算机能够运行最为基础的条件,属于基石级别的.它的基本 ...

  9. Scanner类的.next()和.hashNext()方法

    使用Scanner类可以很方便地便获取用户的键盘输入,Scanner是一个基于正则表达式的文本扫描器,它可以从文件.输入流 .字符串中解析出基本类型值和字符串值.Scanner类提供了多个构造器,不同 ...

  10. 简约的返回顶部效果(jQuery)

    博客建好也快一个月了,主题是在原有主题的基础上做的修改,喜欢这样的清新简约风格,为了更好的体验,以后也会经常做修改. 一般博客的文章都比较长,看到下面不能快速返回到顶部还真是不方便,今天自己动手写了一 ...