C# 检查实例是否正确实例化的最佳方法

C# 检查实例是否正确实例化的最佳方法,c#,exception,constructor,search-engine,C#,Exception,Constructor,Search Engine,因此,我有一个关于检查对象是否是使用特定构造函数实例化的问题。我有一个名为SearchWithTwoLevelCore的类,它是搜索引擎的一部分。它有这样一个构造函数: public SearchWithTwoLevelCache(ISearchCore s, ICurrentTimeProvider tp) { //Initialize the two levels. S=s; lvl2 = TimeBoundedQueryCache(s

因此,我有一个关于检查对象是否是使用特定构造函数实例化的问题。我有一个名为SearchWithTwoLevelCore的类,它是搜索引擎的一部分。它有这样一个构造函数:

public SearchWithTwoLevelCache(ISearchCore s, ICurrentTimeProvider tp)
    {
        //Initialize the two levels.
        S=s;
        lvl2 = TimeBoundedQueryCache(s.AsQueryDataSource, tp, TimeSpan(24,0,0));
        lvl1 = SizeBoundedQueryCache(lvl2, 10);


    }

其中,S、lvl1和lvl2都是类中声明的私有字段,它们包含其他公共类的对象。然后我有一个我想运行的公共方法,它驻留在SearchWithTwoLevelClass中,但首先我想检查用于生成SearchWithTwoLevelCache的构造函数是否是上面的构造函数,否则该方法无法正常运行,如果不是,则引发某种异常。最好的方法是什么?非常感谢

您可以在类内部和特定的
构造函数中设置
public
布尔属性
,您可以将其设置为
true
。此属性的默认值可以是
false

因此,如果对象是obj1,则可以在调用函数之前检查此布尔值

if(obj1.public_property)
     // do function call

这只是一个解决办法。可能还有比这更好的解决方案。

您可以在类内部和特定的
构造函数中设置
公共
布尔属性
,您可以将其设置为
true
。此属性的默认值可以是
false

因此,如果对象是obj1,则可以在调用函数之前检查此布尔值

if(obj1.public_property)
     // do function call

这只是一个解决办法。可能还有比这更好的解决方案。

这是一个很好的例子,说明了。我很喜欢这张照片

如果您的类有多个构造函数,并且方法的成功取决于调用了哪个构造函数,那么您有很多选择

这里的主要问题是,对象状态似乎依赖于调用哪个构造函数;这不是最好的设计技术,因为它会导致整个类中状态检查的激增,而不管您如何表示实现

1) 将对象重构为更小的对象

这里的想法是,构造函数应该只需要类运行所需的数据。如果您有多个构造函数,每个构造函数都需要不同数量的参数和数据,那么可以认为这个类实际上代表几个不同的对象

2) 对方法强制执行数据要求

public SearchWithTwoLevelCache(ISearchCore s, ICurrentTimeProvider tp)
{
    //Initialize the two levels.
    S=s;
    lvl2 = TimeBoundedQueryCache(s.AsQueryDataSource, tp, TimeSpan(24,0,0));
    lvl1 = SizeBoundedQueryCache(lvl2, 10);
}
可以说,这个状态实际上不是类本身所需要的,因为,如果它实际上是函数的先决条件,那么就把它作为函数本身的要求。这消除了歧义

因此,您的班级可能成为:

public SearchWithTwoLevelCache(ISearchCore s)
{
  S = s;
} 

public Whatever PerformTwoLevelSearch(ICurrentTimeProvider tp) { }
比如说

这里的想法是只在构造函数中提供整个类的状态绝对需要的数据

当然,您可以在方法级别实现检查并抛出异常,但是对于使用您的类的人来说,这可能非常令人沮丧。他们怎么知道要调用函数1,必须调用构造函数2并设置其他变量?他们如何知道使用哪个接口?这就是为什么将其作为函数的条件使用和维护都要简单得多


这也将使今后扩展这门课变得困难。如果一个方法的成功依赖于首先调用几个其他方法或构造函数,那么重构和更改此逻辑也会迫使所有客户机也进行更改

这是一个很好的例子,说明了。我很喜欢这张照片

如果您的类有多个构造函数,并且方法的成功取决于调用了哪个构造函数,那么您有很多选择

这里的主要问题是,对象状态似乎依赖于调用哪个构造函数;这不是最好的设计技术,因为它会导致整个类中状态检查的激增,而不管您如何表示实现

1) 将对象重构为更小的对象

这里的想法是,构造函数应该只需要类运行所需的数据。如果您有多个构造函数,每个构造函数都需要不同数量的参数和数据,那么可以认为这个类实际上代表几个不同的对象

2) 对方法强制执行数据要求

public SearchWithTwoLevelCache(ISearchCore s, ICurrentTimeProvider tp)
{
    //Initialize the two levels.
    S=s;
    lvl2 = TimeBoundedQueryCache(s.AsQueryDataSource, tp, TimeSpan(24,0,0));
    lvl1 = SizeBoundedQueryCache(lvl2, 10);
}
可以说,这个状态实际上不是类本身所需要的,因为,如果它实际上是函数的先决条件,那么就把它作为函数本身的要求。这消除了歧义

因此,您的班级可能成为:

public SearchWithTwoLevelCache(ISearchCore s)
{
  S = s;
} 

public Whatever PerformTwoLevelSearch(ICurrentTimeProvider tp) { }
比如说

这里的想法是只在构造函数中提供整个类的状态绝对需要的数据

当然,您可以在方法级别实现检查并抛出异常,但是对于使用您的类的人来说,这可能非常令人沮丧。他们怎么知道要调用函数1,必须调用构造函数2并设置其他变量?他们如何知道使用哪个接口?这就是为什么将其作为函数的条件使用和维护都要简单得多

这也将使今后扩展这门课变得困难。如果一个方法的成功依赖于首先调用几个其他方法或构造函数,那么重构和更改此逻辑也会迫使所有客户机也进行更改

快速解决方案(不好)是使用一个标志来指示调用了哪个构造函数——稍后在代码中的任何地方检查它

你需要的其实是F#。但是,由于C#中没有then,您应该将类抽象为一个
接口
,然后为该接口提供不同的具体实现

现在,您可以使用方法重载(对于每个具体实现)来决定使用哪个具体实现。

快速解决方案(不好)将使用一个标志来指示调用了哪个构造函数-通过检查它