方法范围的实例变量

时间:2012-08-29 16:38:41

标签: c# scope

我偶尔发现自己处于一种情况,即我只有一个类中的一个方法才能使用变量。目前我使用的是一个实例变量,但是让这个变量对类的其余部分可见是一种糟糕的设计。示例只是为了说明我想要的情况:

private Window _Window;
private void Show()
{
    if (_Window == null)
    {
        _Window = new Window();
        _Window.Closed += delegate { _Window = null; };
        _Window.Show();
    }
    _Window.BringIntoView();
}

实例变量仅存在以防止一次创建多个窗口,因此没有理由让其他人知道它。我想起了C ++在函数中定义静态变量的能力。

有没有办法实现这样的事情是C#?还是我坚持在糟糕的设计和糟糕的封装之间做出选择的决定? (假设这种方法确实不能保证它自己的一类。)

4 个答案:

答案 0 :(得分:4)

  

有没有办法实现这样的事情是C#?

没有

  

还是我坚持选择糟糕的设计和糟糕的封装之间的决定? (假设这种方法确实不能保证它自己的一类。)

好吧,我不确定你是否真的遇到过这两种情况。听起来这是对象状态的一部分,即使其他方法都不需要引用其状态的那个方面。对于同一类中的其他代码来说,引用状态的这个方面是逻辑错误吗?如果是这样,为什么?

(不可否认,我偶尔希望能够在一个属性声明中声明一个字段,强迫其余的人通过该属性访问该状态......)

答案 1 :(得分:1)

  

有没有办法实现这样的事情是C#?

不,不幸的是,C#没有能力定义作用于方法的类级变量。

作为旁注,Visual Basic通过Static modifier允许这样做。这会导致编译器创建(修饰)类级别变量,但该语言只允许在其定义的Sub或Function中使用它。但是,其他语言会将其视为成员变量。

答案 2 :(得分:1)

我所知道的唯一方法比你想要避免的混乱更糟糕。

// Constructor
public MyClass()
{
    {
        // _Window is private to this closure
        Window _Window;
        Show = () =>
        {
            if (_Window == null)
            {
                _Window = new Window();
                _Window.Closed += delegate { _Window = null; };
                _Window.Show();
            }
            _Window.BringIntoView();
        };
    }
}

// Replaces Show method
private Action Show;

然后使用Show.Invoke()而不是Show()。但是,这种方法有更好的地方:http://www.headspring.com/patrick/public-private-super-private/。但是,在我看来,方法private应该在C#/ Java中。

答案 3 :(得分:0)

一个选项是让窗口类本身保持对自身实例的静态引用。您还将在窗口类中公开静态方法Display(),让窗口类处理实例的创建和处理。基本上你必须将代码移到windows的类中。

private static DisplayWindow _window;

public static void Display()
{
    if (_window == null)
    {
        _window = new DisplayWindow();
        _window.Closed += delegate { _window = null; };
        _window.Show();
    }
    _window.BringIntoView();
}

在另一个班级

DisplayWindow.Display(); // No variable required here!

如果你想禁止“狂野”创建这种类型的窗口,请将窗口的构造函数设为私有

private DisplayWindow()
{
}

如果要打开此窗口,会强制其他类调用Display()