Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过接口实例化类时无法理解C编译器的行为_C# - Fatal编程技术网

C# 通过接口实例化类时无法理解C编译器的行为

C# 通过接口实例化类时无法理解C编译器的行为,c#,C#,我有一个实现接口的类。界面是 public interface IRiskFactory { void StartService(); void StopService(); } public class RiskFactoryService : IRiskFactory { } 实现接口的类是 public interface IRiskFactory { void StartService(); void StopService(); } public clas

我有一个实现接口的类。界面是

public interface IRiskFactory
{
   void StartService();
   void StopService();
}
public class RiskFactoryService : IRiskFactory
{
}
实现接口的类是

public interface IRiskFactory
{
   void StartService();
   void StopService();
}
public class RiskFactoryService : IRiskFactory
{
}
现在我有了一个控制台应用程序和一个窗口服务

如果我编写以下代码,请从控制台应用程序

static void Main(string[] args)
{
    IRiskFactory objIRiskFactory = new RiskFactoryService();
    objIRiskFactory.StartService();
    Console.ReadLine();
    objIRiskFactory.StopService();
}
它工作得很好。但是,当我在WindowService中编写相同的代码时

public partial class RiskFactoryService : ServiceBase
{
    IRiskFactory objIRiskFactory = null;
    public RiskFactoryService()
    {
        InitializeComponent();
        objIRiskFactory = new RiskFactoryService(); <- ERROR
    }

    /// <summary>
    /// Starts the service
    /// </summary>
    /// <param name="args"></param>
    protected override void OnStart(string[] args)
    {
        objIRiskFactory.StartService();
    }

    /// <summary>
    /// Stops the service
    /// </summary>
    protected override void OnStop()
    {
        objIRiskFactory.StopService();
    }
}

我的问题是为什么会这样?

我认为问题在于,在本例中,RiskFactoryService指的是不实现IRiskFactory的部分类定义RiskFactoryService:ServiceBase,您的意思是该类与实现IRiskFactory的RiskFactoryService类相同吗?-如果是这样的话,那么类定义可能也应该标记为partial


我看到的一个更紧迫的问题是,您正在递归地调用RiskFactoryService类内部的构造函数。这意味着每次尝试实例化RiskFactoryService时,堆栈都会溢出。

我认为问题在于,在这种情况下,RiskFactoryService是指不实现IRiskFactory的部分类定义RiskFactoryService:ServiceBase。您是指该类与RiskFactoryService类相同吗这是IRiskFactory吗如果是这样的话,那么类定义可能也应该标记为partial


我看到的一个更紧迫的问题是,您正在递归地调用RiskFactoryService类内部的构造函数。这意味着每次您尝试实例化RiskFactoryService时,堆栈都会溢出。

您的windows服务类是否应该实际实现如下所示的服务

public partial class RiskFactoryService : ServiceBase  , IRiskFactory
{
}

为什么要在RiskFactoryService的构造函数中创建RiskFactoryService,我认为这会导致堆栈溢出错误!!您只需调用此.StartService…

您的windows服务类不应该实际实现如下所示的服务

public partial class RiskFactoryService : ServiceBase  , IRiskFactory
{
}
为什么要在RiskFactoryService的构造函数中创建RiskFactoryService,我认为这会导致堆栈溢出错误!!您只需调用此.StartService…

就会产生两种想法:

如果您使用partial将类型的服务/接口部分放在单独的文件中,因为代码提到partial并且似乎没有实现接口本身,那么名称空间是否正确?使用分部类很容易意外地创建两种类型而不是一种类型 IRiskFactory是否因具有引用的dll和本地副本而面临解决问题?i、 所有的代码都在谈论同一个工厂吗? 有两种想法:

如果您使用partial将类型的服务/接口部分放在单独的文件中,因为代码提到partial并且似乎没有实现接口本身,那么名称空间是否正确?使用分部类很容易意外地创建两种类型而不是一种类型 IRiskFactory是否因具有引用的dll和本地副本而面临解决问题?i、 所有的代码都在谈论同一个工厂吗?
也许我忽略了一些东西,但是你没有从RiskFactoryService的创建中获得StackOverflowException…无参数构造函数递归地调用自己也许我忽略了一些东西,但是你没有从RiskFactoryService的创建中获得StackOverflowException…无参数构造函数调用自己递归地