静态到实例,我该如何正确处理?

时间:2012-03-13 15:33:18

标签: c# static instance

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

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

这可能吗?

4 个答案:

答案 0 :(得分:2)

您可以使用多种方式,但没有一种完全您想要的方式:

  1. 删除static修饰符,使其成为普通的非静态类,并可选择使其成为局部,在第二个文件中实现新的实例相关代码。但是,使用此方法,您将无法废弃整个静态类,因为您只有一个类。
  2. 将新类放入新名称空间
  3. 将新类放在新项目中,但与原始项目位于相同的名称空间中
  4. 如果你让所有旧的静态成员都过时了,我会选择nbr。 1。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

不可能使用相同的类名和相同的成员,类型将是不明确的。这通常使用过时属性的消息字段来告诉调用者使用哪个类,在本例中是新实例类。

你可能会想出一些复杂的版本化界面,但即使在最好的情况下,调用者也不清楚,他们必须知道他们正在处理哪个版本。调用者需要以不同方式处理instace和静态类,因此隐藏它们正在使用的只会导致问题(是否可能这样做)。

答案 3 :(得分:0)

您可以做的一件事是通过explicitly implemented interface实现方法的非静态版本,如下所示:

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