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

本文关键字:何检测 构造函数 创建 定义 对象 检测 | 更新日期: 2023-09-27 18:30:38

我设计了一个库类(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类中添加一个代码来保存用户记住这个规则,从而使编译器在Bar的构造函数中没有初始化来自Foo的对象时抛出异常?

说来话长

虽然不太了解 C#,但我需要将我们的 dcs 库移植到 C# 中,这已经结束了

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

因此,我的应用程序以我想要的方式工作,并且完全工作的示例应用程序在这里。

但是,如果我在类定义下初始化该foo变量(如第一个示例所示),则SynchronizationContext.Current变量引用Bar应用程序自己的SynchronizationContext.Current变量中的其他内容。这就是为什么,当发生某些事情时应用程序不起作用(不要问它是什么)

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

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

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

否,因为两种初始化类型都有效。但是您可以创建自己的 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规则,并应用该规则,如果失败,则会引发构建错误。

我不太确定你的问题是什么,但你能不能只使用一个惰性加载的属性,然后从哪里调用它就无关紧要了:

private Foo _foo;
public Foo foo
{
    get
    {
        if (_foo == null)
        {
            _foo = new Foo();
        }
        return _foo;
    }
}

然后,当您第一次调用它时,它将被实例化。