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对象

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

时间: 2024-10-10 04:52:41

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

静态成员,静态类,抽象成员,抽象类,单例模式

静态成员: ?static修饰的成员称为静态成员. 静态成员只能由类来调?. 静态类: ?static修饰的类称为静态类.静态类不能实例化,所以内部只允许有静态成员或const修饰的常量. 1.仅包含静态成员和const修饰的常量. 2.不能被实例化. 3.是密封的.(默认已经是sealed,不能再?sealed修饰) 4.有静态构造?法(函数),但静态构造?法必须是?参数的. 静态构造方法:静态构造?法?于初始化任何静态数据, 或?于执?仅需 执??次的特定操作.在创建第?个实例或引?任何静态

面向对象基础——静态成员、静态类

1. 静态方法 VS 实例方法 2. 静态类 (1)常见的静态类:Math.Console.Convert (2)静态类中只能包括静态成员.静态构造函数.常量成员,不能有实例成员,不能有普通构造函数 (3)静态构造函数不能有参数.不能有访问修饰符(默认为private) 静态构造函数的作用:用来初始化静态成员 在加载类的时候使用,只会执行一次 3. 使用建议 当多个对象共享同一个数据的时候就可以在实例类中加入静态成员. 少使用静态类,静态类.静态成员所分配的内存在程序退出时才会释放 在项目中需要

C#中的静态成员与静态类

在C#中每个对象都有自己的数据成员,那对于不同对象的数据成员其各自的值是不相干的.但有的时候有可能某一个或者几个数据成员为所有对象共有,如在一个Car类里可能有很多个对象,这是我们定义一个变量carCount来记录,但是carCount并不属于某个对象,而是属于整个类的,这个时候我们就需要使用静态字段. 1.静态成员 静态成员是通过static关键字来标识 的,有静态字段.方法.属性或者事件. 定义静态成员的语法格式: Class 类名 { public static 数据类型  变量名称 pu

静态类、静态方法、静态成员和实例成员的比较

任何项目中都会使用到静态类.静态方法.静态成员和实例成员了.那么这几个名词到底有哪些区别呢? 1.静态成员和实例成员 静态成员:静态成员通常和类是相关联的.它可以作为类中公有的变量,不依赖特定对象的存在.通常我们在访问它们的时候很简单,直接通过类名加点操作符再加变量名来进行操作. 实例成员:实例成员通过和对象是相关联的.一般情况下,我们都是对类的实例化来进行访问操作.如果实例不存在,那么也就无法访问实例成员对象. 所以实例成员的存在必须要有对象实例的存在,如果对象实例都不存在了,那么就将无法访问

C# 静态类的使用

静态类与非静态类基本相同,但存在一个区别:静态类不能实例化.也就是说,不能使用 new 关键字创建静态类类型的变量.因为没有实例变量,所以要使用类名本身访问静态类的成员. static class CompanyInfo { public static string GetCompanyName() { return "CompanyName"; } public static string GetCompanyAddress() { return "CompanyAddre

PHP静态成员变量

静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员..因为静态成员存在于内存,所以非静态成员可以直接访问类中静态的成员. 1.静态全局变量 定义:在全局变量前,加上关键字 static 该变量就被定义成为了一个静态全局变量. 特点:  A.该变量在全局数据区分配内存.  B.初始化:如果不显式初始化,那么将被隐式初始化为0(自动变量是随机的,除非显式地

static作用,静态成员变量和静态成员函数

static关键字有俩作用:(1).控制存储分配:(2).控制一个名字的可见性和连接. 随着C++名字空间的引入,我们有了更好的,更灵活的方法来控制一个大项目的名字增长. 在类的内部使用static是在全程序中控制名字的另一种方法.这些名字不会与全局名冲突,并且可见性和访问也限制在程序内部,使得在维护代码时有更多的控制. 数据成员可以分静态变量.非静态变量两种. 静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静

对static静态成员的理解

疑惑: 数据成员可以分静态变量.非静态变量两种.  静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员..因为静态成员存在于内存,所以非静态成员可以直接访问类中静态的成员.  非成静态员:所有没有加Static的成员都是非静态成员,当类被实例化之后,可以通过实例化的类名进行访问..非静态成员的生存期决定于该类的生存期..而静态成员则不存在生存期的概念,

静态类的重要知识点

小结一下关于静态类的重要知识点: 1.调用静态方法的时候只能通过类名直接来调用,不能通过对象来调用.也就是说静态成员不需要实例化对象. 2.静态成员在整个程序推出时才才释放资源,所以可以在整个应用程序中用到静态成员,它相当于在共享数据. 3.静态类的构造函数,只会在第一次使用静态类之前调用执行,并且只会执行一次. 4.当给一个普通类添加静态字段后,系统会默认为该类生成一个静态构造函数.[静态构造函数不能有访问修饰符,并且不能够带参数] 5.静态类不能被实例化,并且不能被继承. 6.由于静态成员在