【问题标题】:Down Sides to Using Properties as Opposed to Method Variables使用属性而不是方法变量的缺点
【发布时间】:2015-04-25 14:58:33
【问题描述】:

我正在讨论我拥有的几个实用程序类的优缺点。这些类有几个在调用类方法之前设置的属性。但是,我想知道这种方法是否有任何缺点,而不是与方法调用一起发送变量?这些类中通常只有一两个方法。

谢谢。

【问题讨论】:

标签: c# methods properties


【解决方案1】:

我不知道你的班级是什么样子的,所以我来猜测一下......

我假设你有类似的东西:

public class MyClass
{
    public static int X { get; set; }

    public static void MyMethod()
    {
        Console.WriteLine("X = {0}", X);
    }
}

你这样称呼它:

MyClass.X = 42;
MyClass.MyMethod();

这种方法至少有两个问题:

  • 没有明显迹象表明您需要在调用MyMethod之前设置X
  • 它使方法非线程安全:如果 thread1 和 thread2 都在调用它,你可以有类似的东西:

    thread1 将 X 设置为 42 thread2 将 X 设置为 99 thread1 调用 MyMethod => 打印 99 而不是 42 thread2 调用 MyMethod => 打印 99

更好的方法是将值作为参数传递给方法:

public class MyClass
{
    public static void MyMethod(int x)
    {
        Console.WriteLine("X = {0}", x);
    }
}

然后这样称呼它:

MyClass.MyMethod(42);

这样就解决了前面提到的两个问题:

  • 很明显,您需要将x 的值提供给MyMethod
  • 类中没有存储状态,所以该方法是线程安全的

【讨论】:

  • 谢谢,托马斯。我理解这些担忧,它们是合理的担忧。但是,所有属性不都是这样吗?那么,除了提供一个可供整个班级访问的变量之外,为什么还要使用它们呢?如果是这样,为什么要使用公共财产呢?但我确实喜欢你的理由。
  • @physics90,这里有两件事要考虑:a)可变状态与不可变状态,b)实例与静态。通过属性暴露不可变状态是可以的,因为它不能被改变,所以你不会因为状态意外改变而出现错误。可变的实例状态通常是必要的,因为某些对象是隐式有状态的(例如 UI 控件)。但是,应尽可能避免可变静态状态,因为如果您不小心,它很容易导致错误,如上例所示。所以一般来说,你应该避免 static 属性,除非它们是只读的。
【解决方案2】:

我想说这主要取决于您倾向于如何调用这些方法。在某些情况下,可能首选任何一种方法。

当您倾向于在多个调用中传递相同的值时,实例化一个将这些值作为属性保存的类可能会更方便,根据具体需要,只读或可写。然后,您可以方便地多次调用您的方法,而无需过多重复。 HttpClient 就是一个很好的例子:你配置一次,然后多次调用某些方法。

如果您需要在方法调用之间保持某种状态,这种方法也很有效。

但是,默认情况下,如果上述注意事项不适用,我建议使用纯静态方法。它们是独立的,它们不会因相对外部因素(前一段时间设置的属性值)而有所不同。每次调用前不必担心是否正确设置了属性,因为所有的值都是传入的。最后,自包含方法在多线程场景中更易于理解和使用。

【讨论】:

    猜你喜欢
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    相关资源
    最近更新 更多