我偶尔发现自己处于一种情况,即我只有一个类中的一个方法才能使用变量。目前我使用的是一个实例变量,但是让这个变量对类的其余部分可见是一种糟糕的设计。示例只是为了说明我想要的情况:
private Window _Window;
private void Show()
{
if (_Window == null)
{
_Window = new Window();
_Window.Closed += delegate { _Window = null; };
_Window.Show();
}
_Window.BringIntoView();
}
实例变量仅存在以防止一次创建多个窗口,因此没有理由让其他人知道它。我想起了C ++在函数中定义静态变量的能力。
有没有办法实现这样的事情是C#?还是我坚持在糟糕的设计和糟糕的封装之间做出选择的决定? (假设这种方法确实不能保证它自己的一类。)
答案 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()
。