c#静态成员和静态类
说起静态类,你可能会联想到实例类。这两者并不难区分,前者(静态类)只在内存中创建一个,而后者(实例类)则是每次实例化后,就会再内存创建一份。今天来简单聊一下静态类的理解。
代码情景:
class Program
{
static void Main(string[] args)
{
Person p1 = new Person();
p1.Name = "zs";
p1.LivePlanet = "earth"; Person p2 = new Person();
p1.Name = "ls";
p1.LivePlanet = "earth";
}
} public class Person
{ public string Name { get; set; }
public int Age { get; set; }
public string Phone { get; set; }
public string LivePlanet { get; set; }
}
根据以上的情景假如我需要实例化100个对象,而Person中的LivePlanet属性值都统一为earth,不就得反复重写100次? 这样妥吗?起码您应该知道违背了DRY原则。
好吧,我们来实现一下通过static 来改善这个代码:
class Program
{
static void Main(string[] args)
{
Person.LivePlanet = "earth"
Person p1 = new Person();
p1.Name = "zs";
//p1.LivePlanet = "earth"; Person p2 = new Person();
p1.Name = "ls";
//p1.LivePlanet = "earth";
}
} public class Person
{ public string Name { get; set; }
public int Age { get; set; }
public string Phone { get; set; }
public static string LivePlanet { get; set; }
}
我们在Person类把LivePlanet改成static,这样我们直接可以不需要实例化可以直接Person.LivePlanet = "earth"。这样的好处不仅在于此,而且这解决了当所有对象都共享同一个信息的时候,不需要重复去实例化再去调用这个对象。
请注意以下几点:
1.存储在静态成员中的信息只有在应用程序退出的时候才会从内存里释放出来。
2.静态成员不能通过对象访问,只能通过类名直接访问。
3.静态成员(内容)在内存中只存储一份。
4.静态成员,在整个应用程序中任何一个地方都可以访问的到,所以静态成员直到程序退出后才会释放内存。而实例成员,当没有变量使用就可以被垃圾回收,回收后内存就释放了.(可以把一些常用的工具函数,封装到一个静态类中,使用方便)
现在请您再看这个简单的改动会有什么问题,我在Person中添加一个静态方法然后通过this来调用静态成员。
public class Person
{
public static void Say()
{
this.Name = "你好";
} public string Name { get; set; }
public int Age { get; set; }
public string Phone { get; set; }
public static string LivePlanet { get; set; }
}
可能在脱离编译器的情况下,您可能觉得this 就是Person,所以这个调用不应该会存在问题。实际上这边请您注意我用的是静态static,而静态成员访问实例成员必须要new一个实例。并且this指的是当前的对象,在使用静态成员的时候因为还没实例化一个对象,所以这个时候this无法得知自己的身份。
改动如下:
public class Person
{
public static void Say()
{
Person p = new Person();
p.Name = "你好";
//this.Name = "你好";
} public string Name { get; set; }
public int Age { get; set; }
public string Phone { get; set; }
public static string LivePlanet { get; set; }
}
这才是我们想要的结果。
那什么是静态类呢?请看如下代码:
public static class MyStaticClass
{
public static string Name { get; set; } public static void SayHi()
{
Console.WriteLine("hi");
} }
观察以上代码可以看出静态类的几个特点:
1.在静态类中只能有静态成员,不能有实例成员
2.静态类不能创建对象,不能new对象
使用静态类跟使用静态成员的情景其实是一样的,即在整个应用程序中要共享数据的时候可以使用静态类。所以对于那些类中包含有大量的方法,并且类不需要创建对象的时候,可以使用静态类。
c#静态成员和静态类的更多相关文章
- .net学习之类与对象、new关键字、构造函数、常量和只读变量、枚举、结构、垃圾回收、静态成员、静态类等
1.类与对象的关系类是对一类事务的统称,是抽象的,不能拿来直接使用,比如汽车,没有具体指哪一辆汽车对象是一个具体存在的,看的见,摸得着的,可以拿来直接使用,比如我家的那辆刚刚买的新汽车,就是具体的对象 ...
- 【C#小知识】C#中一些易混淆概念总结(三)---------结构,GC,静态成员,静态类
目录: [C#小知识]C#中一些易混淆概念总结 [C#小知识]C#中一些易混淆概念总结(二) ---------------------------------------分割线----------- ...
- DotNet中静态成员、静态类、静态构造方法和实例构造方法的区别与联系
在面向对象的C#程序设计中,关于静态的概念一直是很多人搞不明白的.下面介绍这些带“静态”的名称. 1.静态成员: 定义:静态成员是用static关键字修饰的成员(包括字段属性和方法) 所属:静态成员是 ...
- 静态类和静态类成员(C# 编程指南)
静态类与非静态类基本相同,但存在一个区别:静态类不能实例化. 也就是说,不能使用 new 关键字创建静态类类型的变量. 因为没有实例变量,所以要使用类名本身访问静态类的成员. 例如,如果名为 Util ...
- C# 静态类和非静态类的区别
静态类和非静态类的区别 静态类: static 关键字 调用 类名.方法 在静态方法中只能访问静态成员 在静态类中只能有静态成员 在非静态类中 即可有非静态成员,也可以有静态成员 在静态 ...
- 对static静态成员的理解
疑惑: 数据成员可以分静态变量.非静态变量两种. 静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例 ...
- PHP静态成员变量和非静态成员变量
数据成员可以分静态变量.非静态变量两种. 静态成员: 静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会 ...
- PHP静态成员变量
静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员.. ...
- C++类中的静态成员变量和静态成员函数的作用
数据成员可以分为静态变量.非静态变量两种. 静态成员:静态类中的成员加入static 修饰符,即是静态成员,可以使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配 ...
随机推荐
- 关于Azure Auto Scale的高级属性配置
Auto Sacle是一种自动化管理云服务负载的功能,系统可以根据预先制定的规则,在满足条件的情况下对计算实例的数量进行增减从而可以用来优化使用Azure的计算资源,可以适用于Cloud Servic ...
- Ajax长连接应用
所谓的长连接,就是不断去发送请求,把请求阻塞在服务器端,每次超过请求时间就去重新发送请求,保持连接,随时获取服务器端的响应的数据 function connection(){ $.ajax({ typ ...
- windows下 破解 Sublime Text3 和汉化
这货已经出到3了. windows下载,破解,使用方法: 一:破解 1: 去官网下载最新版本 http://www.sublimetext.com/3 2:下载破解器(SublimeTextKeyge ...
- 动态规划(DP计数):HDU 5116 Everlasting L
Matt loves letter L.A point set P is (a, b)-L if and only if there exists x, y satisfying:P = {(x, y ...
- eclipse 常用快捷键整理
1.整理代码的快捷键ctrl+shift + F 2.跳转代码行ctrl+L 3.可以列出所有快捷键 Ctrl+Shift+L
- HDOJ/HDU 2087 剪花布条(indexOf()应用~~)
Problem Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? Input 输入 ...
- 页面中引入带中文的JS文件乱码问题
1. WebConfig: <globalization requestEncoding="gb2312" responseEncoding="gb2312&quo ...
- Bzoj 3289: Mato的文件管理 莫队,树状数组,逆序对,离散化,分块
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 1539 Solved: 665[Submit][Status][Di ...
- 初级程序员应该了解的Linux命令
基于Linux的系统最美妙的一点,就是你可以在终端中使用命令行来管理整个系统.使用命令行的优势在于,你可以使用相同的知识和技能来管理随便哪个Linux发行版. 对于各个发行版以及桌面环境(DE)而言, ...
- 1115 HTML CSS
1. HTML 全称HyperText Markup Language (超文本标记语言). 2. 网页=HTML文件 + Web服务器 + CSS文本. 3. Web服务器:处理浏览器请求,寻找资源 ...