例如,静态,我如何正确处理

本文关键字:正确处理 静态 例如 | 更新日期: 2023-09-27 18:27:34

我有一个静态类,我正在弃用并修改该类以强制客户端使用实例变量。

问题是,我如何处理允许保留和使用以前的静态类(具有过时的属性)以及允许使用新的非静态类(相同的名称,相同的方法名称)?

这可能吗?

例如,静态,我如何正确处理

有几种方法可以使用,但没有一种能完全满足的要求:

  1. 删除static修饰符,使其成为一个普通的非静态类,并可选地使其成为分部类,在第二个文件中实现与实例相关的新代码。然而,使用此方法,您将无法废弃整个静态类,因为您只有一个类
  2. 将新类放在新的命名空间中
  3. 将新类放置在新项目中,但与原始类位于相同的命名空间中

如果你让所有旧的静态成员都过时了,我会选择nbr选项。1.

我认为不可能保持相同的名称和参数,但你可以这样做

[Obsolete("This class is obsolete; use class B instead")]

Visual Studio将提示用户,他们应该使用新类。

如果类名和成员相同,则类型不明确。这通常是使用过时属性的消息字段来告诉调用者要使用什么类,而在本例中,使用新的实例类。

也许你可以想出一些复杂的版本接口,但即使在最好的情况下,调用者也不清楚,他们必须知道自己在处理哪个版本。调用方需要以不同的方式处理instance和静态类,因此隐藏他们正在使用的类只会导致问题(如果可能的话)。

您可以做的一件事是通过显式实现的接口来实现方法的非静态版本,如下所示:

public interface ITest
{
    string Foo();
}
// your class
public class Test : ITest
{
    //original, static version of Foo
    public static string Foo() 
    {
        return "foo";
    }   
    // Foo reimplemented as a non-static method
    // note that you need to implement ITest explicitly
    // for it to compile
    string ITest.Foo()
    {
        return "foo";
    }   
}

这按照预期编译和工作,除了非静态方法只能通过接口调用,即:

ITest t = new Test();   //assigning to a variable of type ITest
Console.WriteLine(t.Foo()); // writes "foo"
Console.WriteLine(Test.Foo()); // and calling the static method still works too