如果字段和方法是静态的,为什么对一个类的实例创建新对象是没有意义的? [C#]

时间:2019-06-02 07:44:59

标签: c#

所以我在编程不一致服务器上。我很无聊,所以我写了一个随机代码段。这是我写的:

using System;

class test {
    public static double height = 1.82; // meters
    public static void grow(double rate) {
        height += rate;
    }
}

class MainClass {
    public static void Main(string[] args) {
        test human = new test();
        human.grow(0.05);
        double height = human.height;
        Console.WriteLine($"New height: {height}");
    }
}

服务器上的用户说“(检查)incapaz太糟糕了”,我说“ ofc就是这样”,但实际上我不知道自己做错了什么。我只是从我学到的过去的语言中了解C#和其他几种语言。

他说这很糟糕,因为“该字段和方法已经是静态的,new建立test实例的意义是什么。”

然后我说,“你会推荐什么”,然后他说:“如果它们都是静态的,那它实际上甚至不是一个类,就像一个名称空间”,以及“如果要每个测试对象独立,不要将字段和方法标记为静态”。

但是我不确定他的意思。有人可以帮我清理一下吗?我想改善和学习。

3 个答案:

答案 0 :(得分:3)

没有必要实例化新的test类的原因是因为它的成员都不是非staticStatic methodsproperties在启动时在应用程序生命周期中实例化一次,并保留在内存中,直到关闭应用程序。您无法创建它的另一个实例,只有一个实例,并且该实例在您的应用程序中共享。

 test human = new test();

现在,上面的问题成为了问题,因为当我们查看类test时,我们发现它没有可创建其实例的属性或方法,它们都是静态的。

class test {
    public static double height = 1.82; // meters
    public static void grow(double rate) {
        height += rate;
    }
}

如果您编写此代码,则您的代码将正常工作

class MainClass {
    public static void Main(string[] args) {
        test.grow(0.05);
        Console.WriteLine($"New height: {test.height}");
    }
}

然而,正确的做法是实际上确保您创建的类不使用静态属性/方法(至少直到您有更多经验并知道在哪里使用它们之前,然后再假设其不好的做法)

如果我要重写您的代码,请使用适当的命名约定,像这样。

public class Human 
{
    public Human(double height)
    { 
        this.Height = height;
    }

    public double Height { get; set; }

    public void Grow(double meters) 
    {
        this.Height += rate;
    }
}

class MainClass 
{
    public static void Main(string[] args) 
    {
        Human human = new Human(1.82);
        human.Grow(0.05);
        Console.WriteLine($"New height: {human.height}");
    }
}

您会注意到静态信息已消失,此外,现在已将constructor类重命名为Human类。

实例化Human的实例时,我们需要将其高度作为参数传递,像以前一样对其进行硬编码,这意味着您将无法容纳其他Humans,但仅那些特定高度的人。

还有更多让您思考的问题...看一下grow方法...它可能还有什么问题....例如,如果我们输入负值会发生什么?

答案 1 :(得分:1)

C#是一种面向对象的语言。这些类通过提供定义对象状态和行为的成员来帮助开发人员对其对象建模。也就是说,对象是类的实例。 现在,有一些实例,其中一个类表示状态(属性)或行为(方法),它们不会从一个实例更改为另一个实例。也就是说,这些成员对于从此类创建的所有对象都是相同的。这样,由于这些成员将具有相同的状态或行为,因此无需为这些成员实例化对象。 因此,C#会要求不实例化静态类。

答案 2 :(得分:1)

看看什么是静态的means

无需实例化声明的类即可访问它们。因此,您可以将代码更改为:

using System;

class test {
    public static double height = 1.82; // meters
    public static void grow(double rate) {
        height += rate;
    }
}

class MainClass {
    public static void Main(string[] args) {
        test.grow(0.05);
        double height = test.height;
        Console.WriteLine($"New height: {height}");
    }
}

更改静态属性不仅会为实例对象更改它,还会在全局范围内更改它:

class MainClass {
    public static void Main(string[] args) {
        test test2 = new test()
        test.height = 2;
        Console.WirteLine(test2.height) // --> prints 2
    }
}