C# 你能在没有重载方法的情况下调用第二个构造函数吗

C# 你能在没有重载方法的情况下调用第二个构造函数吗,c#,json,constructor,linq-to-json,C#,Json,Constructor,Linq To Json,所以我有一个疑问。这并不是一个真正的问题,因为代码仍然有效,但它看起来很草率 我需要两个构造器 public class JsonQuery { const string currentWorkSheet = "GLHTanneryData_CurrentWeek"; const string unitTestingWorkSheet = "GLHTanneryData_UnitTesting"; private const string authorisation =

所以我有一个疑问。这并不是一个真正的问题,因为代码仍然有效,但它看起来很草率

我需要两个构造器

public class JsonQuery
{
    const string currentWorkSheet = "GLHTanneryData_CurrentWeek";
    const string unitTestingWorkSheet = "GLHTanneryData_UnitTesting";
    private const string authorisation = "XXXX";
    JObject jObject;

    public JsonQuery()
    {
        SmartsheetQuery smartsheetQuery = new SmartsheetQuery();
        jObject = JObject.Parse(smartsheetQuery.getJsonAsString(currentWorkSheet));
    }

    public JsonQuery(bool testing)
    {
        SmartsheetQuery smartsheetQuery = new SmartsheetQuery();
        jObject = JObject.Parse(smartsheetQuery.getJsonAsString(unitTestingWorkSheet));
    }
}
每个都从smartsheets上的不同位置获取一个json文件。为了调用第二个构造函数,我只给它一个布尔值true。从代码中可以看出,我实际上不需要在方法中使用任何布尔值,我只需要知道我要调用的是这个构造函数


有更好的方法吗?

它被称为构造函数链接或嵌套:

public JsonQuery() : this(false) // or true
{
}

public JsonQuery(bool testing) // or optional parameter value
{
    // use 'testing' here
}

这称为构造函数链接或嵌套:

public JsonQuery() : this(false) // or true
{
}

public JsonQuery(bool testing) // or optional parameter value
{
    // use 'testing' here
}

像这样的东西可以:

public JsonQuery(bool testing = false)
{
    SmartsheetQuery smartsheetQuery = new SmartsheetQuery();

    if (testing)
         jObject = JObject.Parse(smartsheetQuery.getJsonAsString(unitTestingWorkSheet));
    else
         jObject = JObject.Parse(smartsheetQuery.getJsonAsString(currentWorkSheet));
}

然后,对于非测试,您只需要使用新的JsonQuery进行初始化,您会这样做:

public JsonQuery(bool testing = false)
{
    SmartsheetQuery smartsheetQuery = new SmartsheetQuery();

    if (testing)
         jObject = JObject.Parse(smartsheetQuery.getJsonAsString(unitTestingWorkSheet));
    else
         jObject = JObject.Parse(smartsheetQuery.getJsonAsString(currentWorkSheet));
}

然后,对于非测试,您只需要使用新的JsonQuery进行初始化,您实际上不需要两个构造函数-看起来您可以从传入工作表中获益:

 public JsonQuery(string worksheet)
 {
    SmartsheetQuery smartsheetQuery = new SmartsheetQuery();
    jObject = JObject.Parse(smartsheetQuery.getJsonAsString(worksheet));    
 }

只需传入一个不同的工作表进行测试。

您实际上不需要两个构造函数-传入工作表似乎会让您受益匪浅:

 public JsonQuery(string worksheet)
 {
    SmartsheetQuery smartsheetQuery = new SmartsheetQuery();
    jObject = JObject.Parse(smartsheetQuery.getJsonAsString(worksheet));    
 }

只是在一个不同的工作表中进行测试。

您可能考虑的是设置一个用于测试

的编译器指令。
public JsonQuery()
{
    SmartsheetQuery smartsheetQuery = new SmartsheetQuery();
#if TEST
    jObject = JObject.Parse(smartsheetQuery.getJsonAsString(unitTestingWorkSheet));
#else
    jObject = JObject.Parse(smartsheetQuery.getJsonAsString(currentWorkSheet));
#endif
}

您可能考虑的是设置一个用于测试

的编译器指令
public JsonQuery()
{
    SmartsheetQuery smartsheetQuery = new SmartsheetQuery();
#if TEST
    jObject = JObject.Parse(smartsheetQuery.getJsonAsString(unitTestingWorkSheet));
#else
    jObject = JObject.Parse(smartsheetQuery.getJsonAsString(currentWorkSheet));
#endif
}

看起来您的类违反了,它正在确定数据并对其进行解析

在您的情况下,这个问题使得测试解析机制变得非常困难,因为它们在类中相互交织

另一种方法是让解析类依赖于某种数据提供程序接口

public interface ISmartSheetProvider
{
    string GetJsonData();
}

public class ProductionSmartSheetProvider : ISmartSheetProvider
{
    public string GetJsonData()
    {
        return new SmartsheetQuery().getJsonAsString("GLHTanneryData_CurrentWeek"));
    }
}

public class MockSmartSheetProvider : ISmartSheetProvider
{
    public string GetJsonData()
    {    
        return "..."; // whatever test data.
    }
}

public class JsonQuery(ISmartSheetProvider smartSheetProvider)
{
    jObject = jObject.Parse(smartSheetProvider.GetJsonData());
}

虽然由于所有的工作都是在构造函数中完成的,但是您最好将其作为字符串提供,或者将整个类转换为静态方法。我假设这里省略了一些代码,并假设该类所做的事情比提供的要多。

看起来您的类违反了,它既在确定数据,也在解析数据

在您的情况下,这个问题使得测试解析机制变得非常困难,因为它们在类中相互交织

另一种方法是让解析类依赖于某种数据提供程序接口

public interface ISmartSheetProvider
{
    string GetJsonData();
}

public class ProductionSmartSheetProvider : ISmartSheetProvider
{
    public string GetJsonData()
    {
        return new SmartsheetQuery().getJsonAsString("GLHTanneryData_CurrentWeek"));
    }
}

public class MockSmartSheetProvider : ISmartSheetProvider
{
    public string GetJsonData()
    {    
        return "..."; // whatever test data.
    }
}

public class JsonQuery(ISmartSheetProvider smartSheetProvider)
{
    jObject = jObject.Parse(smartSheetProvider.GetJsonData());
}

虽然由于所有的工作都是在构造函数中完成的,但是您最好将其作为字符串提供,或者将整个类转换为静态方法。我假设这里省略了一些代码,并且会假设类的功能比提供的要多。

我不确定编译器指令是什么?我不确定编译器指令是什么?嗨,Matt,我非常感谢,但我打算将类外数据的字符串移到配置文件中。嗨,Matt,我真的很感激这一点,但我打算将类外数据的字符串移动到配置文件中。