如何检测对象是在类定义下还是在类的构造函数中创建的

时间:2016-01-15 20:20:13

标签: c#

我设计了一个库类(Foo),我需要使用这个类,如:

class Bar
{
    Foo foo; 

    public Bar() 
    {
        foo = new Foo(); 
        ...
    }

    ...
}

如果我在课程下创建foo对象:

class Bar
{
    Foo foo = new Foo(); 

    public Bar() 
    {
        ...
    }

    ...
}

然后我的Bar应用程序(认为这是一个Windows Form应用程序)无论如何都可以正常工作,但是当出现特定情况时它会引发异常(Cross-thread operation not valid例外情况在我的实例中)。

所以我警告我的伙伴这个用法提示:“你必须在应用程序的构造函数中初始化你的Foo类型对象。”

有没有办法在Foo类中添加一个能够保存用户记住此规则的代码,如果来自Foo的对象未在Bar中初始化,则会使编译器抛出异常的构造函数?

长篇故事

虽然不太了解C#,但我需要将dcs library移植到C#中,这是over here

当我尝试在另一个线程中设置GUI对象的变量时,我遇到了that问题。所以我需要以某种方式同步它们,因为我问here并找到了正确答案here

所以我的应用程序以我想要的方式工作,而完全正常的示例应用程序是here

但是,如果我在类定义下初始化foo变量(如第一个示例中所示),SynchronizationContext.Current变量引用Bar应用程序自己的{{1}中的其他内容。变量。这就是为什么,当事情发生时(do not ask what it is

,应用程序不起作用

这就是为什么,而不是警告用户并强迫他们记住他们必须初始化他们想要使用的类'构造函数中的SynchronizationContext.Current对象,我正在寻找一种方法来通过添加一些东西来按需警告他们在foo班。

2 个答案:

答案 0 :(得分:0)

我不太确定你的问题是什么,但是你不能只使用延迟加载的属性然后调用它的位置并不重要:

public class A {
    @NotNull private String name;

    public static void main(String[] args) {
        A a = new A();
        a.name = null;
    }
}

然后第一次调用它然后它将被实例化。

答案 1 :(得分:0)

  

有没有办法让编译器抛出异常......

否,导致两种初始化类型都有效。但是你可以创建自己的Exception类型,如果没有在

之类的构造函数中初始化则抛出它
class Bar
{
Foo foo = null; 

public void Bar() 
{
   if(foo == null)
   {
    foo = new Foo(); 
   }
  else
   {
       throw new Exception("foo not initialized in constructor");
    ...
}

仅抛出编译器错误的其他方法是使用code analysis rule。您可以为此创建FxCop规则,并应用在失败时抛出构建错误的规则。