c#vb:当他们说静态类不应该有状态

c#vb:当他们说静态类不应该有状态,c#,vb.net,programming-languages,static,C#,Vb.net,Programming Languages,Static,当他们说静态类不应该有状态/副作用时,这是否意味着: static void F(Human h) { h.Name = "asd"; } 违反了吗 编辑: 我有一个私有变量,现在叫做p,它是一个整数。它在整个程序中根本不会被读取,所以它不会影响任何程序流 这是否违反了“无副作用” 在这种情况下,输入和输出始终相同。静态成员的副作用意味着它会更改其容器类中某些其他成员的值。您案例中的静态成员不会影响其类的其他成员,也不会违反您提到的句子 编辑 在第二个

当他们说静态类不应该有状态/副作用时,这是否意味着:

    static void F(Human h)
    {
        h.Name = "asd";
    }
违反了吗

编辑:

我有一个私有变量,现在叫做p,它是一个整数。它在整个程序中根本不会被读取,所以它不会影响任何程序流

这是否违反了“无副作用”


在这种情况下,输入和输出始终相同。
静态
成员的副作用意味着它会更改其容器
中某些其他成员的值。您案例中的
静态
成员不会影响其
类的其他成员
,也不会违反您提到的句子


编辑


在第二个示例中,您通过编辑问题添加的内容违反了它。

静态成员的副作用意味着它会更改其容器
类中其他一些成员的值。您案例中的
静态
成员不会影响其
类的其他成员
,也不会违反您提到的句子


编辑

在第二个示例中,您通过编辑问题添加的内容违反了它。

当您说“他们”时,您指的是谁

不管怎样,继续前进。一个方法,比如你所介绍的,是完全好的——如果你希望它这样做,那就好了。不用担心

类似地,静态类具有某种静态也是完全有效的。再说一次,你可能在某个时候需要它

真正需要注意的是

static class A
{
    private static int x = InitX();

    static A()
    {
        Console.WriteLine("A()");
    }

    private static int InitX()
    {
        Console.out.WriteLine("InitX()");
        return 0;
    }
    ...
}
如果您按照这些思路使用一些东西,那么您很容易混淆何时调用静态构造函数以及何时调用
InitX()
。如果您有一些副作用/状态改变,如本例所示,那么这将是一种糟糕的做法

但就你的实际问题而言,这些状态变化和副作用是可以接受的

编辑

看看你的第二个例子,按照上面所说的规则,那么,是的,你违反了它

但是

不要让这条规则阻止你做这样的事情。它在某些情况下非常有用,例如,当方法进行密集计算时,记忆是降低性能成本的简单方法。虽然从技术上讲,记忆有状态和副作用,但每个输入的输出总是相同的,这一点非常重要。

当你说“他们”时,你指的是谁

不管怎样,继续前进。一个方法,比如你所介绍的,是完全好的——如果你希望它这样做,那就好了。不用担心

类似地,静态类具有某种静态也是完全有效的。再说一次,你可能在某个时候需要它

真正需要注意的是

static class A
{
    private static int x = InitX();

    static A()
    {
        Console.WriteLine("A()");
    }

    private static int InitX()
    {
        Console.out.WriteLine("InitX()");
        return 0;
    }
    ...
}
如果您按照这些思路使用一些东西,那么您很容易混淆何时调用静态构造函数以及何时调用
InitX()
。如果您有一些副作用/状态改变,如本例所示,那么这将是一种糟糕的做法

但就你的实际问题而言,这些状态变化和副作用是可以接受的

编辑

看看你的第二个例子,按照上面所说的规则,那么,是的,你违反了它

但是


不要让这条规则阻止你做这样的事情。它在某些情况下非常有用,例如,当方法进行密集计算时,记忆是降低性能成本的简单方法。虽然记忆在技术上有状态和副作用,但每个输入的输出总是相同的,这一点非常重要。

对于静态类的方法来说,更改传递给它们的对象的状态是完全可以接受的。事实上,这是非函数静态方法的主要用途(因为不改变某个对象状态的非函数方法是非常无用的)

要避免的模式是有一个静态类,其中的方法具有副作用,这些副作用不限于传入的对象或它们引用的对象。例如,假设有一个刺绣绘图类,该类具有选择刺绣模块以及缩放、平移或旋转未来图形操作的功能。如果多个例程希望绘制一些图形,则很难防止一个例程所做的设备选择或转换影响其他例程。解决此问题有两种常见方法:

  • 让所有静态图形例程接受一个参数,该参数将保持当前设备和世界变换的句柄。
  • 拥有一个非静态类,该类包含设备句柄和世界变换,并公开一整套图形方法。
    在许多情况下,最好的解决方案是让一个类使用第二种方法作为其外部接口,但可能在内部使用第一种方法。第一种方法在单责任原则方面稍好一些,但从外部调用的角度来看,使用类方法通常比使用静态方法更好。

    静态类的方法更改传递给它们的对象的状态是完全可以接受的。事实上,这是非函数静态方法的主要用途(因为不改变某个对象状态的非函数方法是非常无用的)

    要避免的模式是有一个静态类,其中的方法具有副作用,这些副作用不限于传入的对象或它们引用的对象。例如,假设有一个刺绣绘图类,该类具有选择刺绣模块以及缩放、平移或旋转未来图形操作的功能。如果有多个例程