静态成员练习题讲解

请用静态成员相关知识实现:

一个类对象,在整个应用程序的生命周期中,有且仅会有一个该对象的存在,不能在外部实例化,直接通过该类类名就能够得到唯一的对象。

我们先声明一个类:

class Test{
}

不能在外部实例化,而实例化是通过什么实例化的呢?构造函数。

默认构造函数是公有的,既然它不让外部实例化,那就设置成私有的。

class Test{

private Test(){

}

}

可以测试一下,如果我们在main函数里写Test t = new Test()是会报错的。

在整个应用程序的生命周期中,有且仅会有一个该对象的存在。

那肯定联想到静态~(唯一性,全局性)

class Test{

public static Test t = new Test();

private Test(){

}


}

在这段代码中,public static Test t = new Test(); 是在 Test 类内部声明了一个公共静态成员 t,并将其初始化为一个新的 Test 对象。

知识小补充:1.这种方式常用于实现单例模式,确保在程序中只能存在一个特定类型的对象实例。在这个例子中,Test 类的构造函数是私有的,这意味着除了类内部,其他地方不能直接通过 new Test() 来创建 Test 的实例,因此通过静态成员 t 来访问唯一的实例,这样就能实现所谓的单例模式。

2.类的实例化并不仅限于 Main 函数内部,它可以在程序的任何地方进行。类的实例化(也称为对象的创建)是通过调用类的构造函数来完成的,只要能够访问到类的构造函数,就可以在任何方法、属性或其他类的成员内部进行实例化。

看似大功告成了,实际还打咩!

因为我们仍然可以从外部改变 t 的值!

class Program
{
    static void Main()
    {
        

        // 将 t 设为 null
        Test.t = null;  


    }
}

看起来我们创造了唯一的静态对象,可它还是能被外部改变,这不太符合唯一性呀。

如果我们希望外部能够得到,但是改不了的话,就联想到成员属性

成员属性可以让成员变量在外部,只能获取不能修改,或,只能修改不能获取:

class Test
{
    private static Test t = new Test();

    public static Test T
    {
        get
        {
            return t;
        }
    }


    private Test()
    {

    }

}

我们再加一个变量测试一下:

 class Test
 {
     private static Test t = new Test();
     public int testInt = 10;
     public static Test T
     {
         get
         {
             return t;
         }
     }


     private Test()
     {

     }

 }

 static void Main(string[] args)
 {
     

     //Test.t = null;
     Console.WriteLine(Test.T.testInt);




 }

Test.T.testInt可能有人会看不懂,首先Test.T会返回t,t是静态成员变量,也是实例化出来的一个对象,也就是说可以“点”出来成员变量testInt。

大家可以自行测试一下~有什么问题评论区欢迎留言~

你可能感兴趣的:(c#)