C#构造函数调用构造函数,其值大于自身

时间:2015-05-09 11:22:02

标签: c# oop constructor chaining

我很确定我正在复制一个问题,但在我的例子中它不起作用,请看代码:

Dropzone.options.newTicket =
        clickable:'#previews'
        previewsContainer: "#previews"
        dictDefaultMessage: "Drop files here or click to select files"
        autoProcessQueue: false
        uploadMultiple: true
        paramName1: "ticket[attachments_attributes]"
        paramName2: "[file]"
        parallelUploads: 5
        maxFiles: 5
        addRemoveLinks: true
此构造函数class Program { static void Main(string[] args) { Test test1 = new Test("str", "strrr"); } } class Test { public string testValue, mType; public Test(string value, string messageType) { this.testValue = value; this.mType = messageType; } public Test (string value) : this (value, messageType) { //want to manipulate value and messageType here } } 中的

messageType表示它在当前上下文中不存在。我想以这种方式调用它,因为首先我希望我的代码用两个字符串实例化类,然后我想只为一个参数构造函数提供值但不丢失public Test (string value) : this (value, messageType),因为我将在其中使用它这个构造函数messageType。我读到了链接和实例化构造函数,但似乎这与我读到的相反。对不起,如果这是一个简单的问题,我还没有很多练习,我想知道代码的外观。在我指出这个问题之前我已经阅读过:Call one constructor from anotherHow call constructor inside other constructor?http://www.csharp411.com/constructor-chaining/,它对我不起作用,如果我复制或做傻事,我会再次感到抱歉。

3 个答案:

答案 0 :(得分:0)

因此,在您的示例中,您必须构造函数:一个接受值和类型,另一个接受唯一值。在这种情况下,如果用户仅提供值,则类型应具有默认的假定值。例如,您可以执行以下操作:

public Test (string value) : this (value, "Default Message Type")
{

}

这段代码的作用是它从用户获取值,即构造函数的调用者,并将其传递给另一个构造函数,以及一个名为“Default Message Type”的默认消息。

请注意,您不需要在此构造函数中放置任何代码,因为它将调用另一个将设置值和类型的构造函数。

希望这有帮助。

编辑:从评论中我理解@ArnosGo想要对值进行一些操作并添加一些找到messageType值的逻辑,然后将两者都传递给另一个构造函数。不幸的是,在调用其他构造函数之前不可能对数据进行一些操作,但这是一个诀窍:

class Test
{
    public string testValue, mType;

    public Test(string value, string messageType)
    {
        Initialise(value, messageType);
    }

    public Test (string value)
    {
        // Do some manipulation here and found out the value of messageType.
        Initialise(value, messageType);
    }

    protected void Initialise(string value, string messageType)
    {
        this.testValue = value;
        this.mType = messageType;
    }
}

基本上,您正在创建一个执行两个构造函数的函数,然后构造函数只计算值并将它们传递给该函数。

答案 1 :(得分:0)

  

在创建数据库之前调用数据库和消息字符串   Test类的对象,然后我想在其中放入两个值,然后   在里面操纵这些值并将它们提供给构造函数   一个参数。如果这解释了什么。

根据OP的评论,我认为使用静态方法的方法会更好 因为值只被操作一次而属性只被赋值一次。

public class Test
{
    private static ManipulateValues(string value, string msgtype)
    {
        //Do your manipulating 
        Return manipulatedValue;
    }

    public static Create(string value, string msgtype)
    {
        return new Test(Test.ManipulateValues(value, msgtype), msgtype); 
    }

    public Test(string value, string msgType)
    {
        this.testValue = value;
        this.mType = messageType;
    }

}

然后使用它:

string messageType = someValue;
string value = someDatabaseValue;
Test temp = Test.Create(value, messageType)

答案 2 :(得分:0)

我认为您要做的是调用Test test1 = new Test("Value", "MessageType");来实例化一个对象。然后,带有两个字符串的构造函数会将这些参数设置为testValuemType字段,并调用第一个构造函数进行操作。

在你的代码中,第一个构造函数不调用第二个构造函数,实际上第二个构造函数调用第一个构造函数。如果你想让第一个构造函数调用第二个构造函数,那么你的构造函数签名应该是这样的:

public Test(string value, string messageType) : this(value)
public Test(string value)

但是在这里你不能将messageType参数发送给第二个构造函数。因此,您应该编写一个初始化方法,将第二个构造函数的内容放在此方法中,并从两个构造函数中调用它,并且不要使用构造函数链接。

public Test(string value, string messageType)
{
    this.testValue = value;
    this.mType = messageType;

    Initialize();
}
public Test(string value)
{
    this.testValue = value;

    Initialize()
}

public void Initialize()
{
    //This is the code in the second constructor
}