【问题标题】:C# constructor calls constructor with more value than itselfC#构造函数调用构造函数,其值比它自己多
【发布时间】:2015-05-09 11:22:02
【问题描述】:

我很确定我在重复一个问题,但是在我的示例中它不起作用,请查看代码:

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
    }


}

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

【问题讨论】:

  • 要使用自定义参数调用不同的构造函数,它们需要能够在“构造函数空间”中进行评估。或静态变量
  • 第二个构造函数中的messageType 是什么?它来自哪里?
  • 如果可以,你能提供一个例子吗?
  • 它应该来自第一个构造函数,因为实例化对象我给了他字符串 strrr,它应该放在那个变量 messageType 中,构造函数 public Test (string value) : this (value, messageType) 应该使用它。因为它在里面会被操纵。
  • 为什么你不使用value 在需要两个参数的重载中?

标签: c# oop constructor chaining


【解决方案1】:

我认为你想要做的是调用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
}

【讨论】:

  • 感谢 qqww2 它做了我需要的,非常感谢:)
  • 对不起。看起来像带有两个参数的构造函数调用带有一个参数的构造函数:public Test(string value, string messageType) : this(value)。这样Initialize 方法被调用两次,属性将被分配两次。再次抱歉,这对我来说似乎没有意义
  • 不,在构造函数public Test(string value, string messageType)下面的代码中没有: this(value)调用。
【解决方案2】:

所以在你的例子中,你必须构造函数:一个接受值和类型,另一个只接受值。在这种情况下,如果用户只提供了一个值,那么该类型应该有一个默认的假定值。例如,您可以执行以下操作:

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

}

此代码的作用是从用户(即构造函数的调用者)那里获取值,并将其传递给另一个构造函数,以及一个名为“默认消息类型”的默认消息。

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

希望这会有所帮助。

编辑:从 cmets 中,我了解到 @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;
    }
}

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

【讨论】:

  • 不是因为messageType也是字符串,不是默认的,每次从数据库查询时都会有所不同。但它需要在这个构造函数内部工作public Test (string value) : this (value, messageType)
  • 所以你的意思是你想做一些逻辑来找出messageType,然后将它传递给另一个构造函数?
  • 这个对数据库的查询发生在哪里?
  • 是的 Rafid 正确地从第一个构造函数获取字符串和第二个使用,值将相同,但 messageType 将仅在第二个构造函数内部的函数中操作。 Abto 该 messageType 已经以字符串形式出现,我想如图所示进行操作。
  • 啊,不幸的是,在重定向到另一个构造函数之前您将无法执行任何逻辑,因此您将不得不再次输入相同的逻辑。但是,您可以做的是有一个由它们调用的通用方法,这将节省您的重复。让我用一些例子来编辑我的答案。
【解决方案3】:

在创建一个数据库之前调用数据库和消息字符串 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)

【讨论】:

  • 具有一个参数的构造函数应该以某种方式访问​​ messageType 以在其中使用,所以在我看来 null 不是这种情况,因为所有使用 value 和 messageType 的操作都应该发生在具有一个参数的 COnstructor 中,如果这有意义的话有吗?
  • 然后使用@Rafid 的更新建议。创建方法并在构造函数内部调用它。
  • 有趣的例子 fabio,但是当我这样做时:public string GetMessageType() { return this.mType; } 我是公开的,因为我的值 mType 是公共字符串,所以在构造函数 GetMessageType() 中说错误 Error 1 An object reference is required for the non-static field, method, or property 'ConsoleApplication1.Test.GetMessageType()' C:\Users\AG\documents\visual studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\Program.cs 38 27 ConsoleApplication1
  • 对不起,我的错。 GetMessageType 方法必须是静态的。再次检查更新的答案
  • 好的,我现在明白了,我想要实现的目标是不可能的,但是你的代码做了一件我能想到的事情,还有一个问题。可以像方法一样在方法内部调用其他构造函数,我猜不是吗?例如:public void DoSomething() { Test(this.testValue); }
猜你喜欢
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
  • 1970-01-01
  • 2017-02-08
  • 2021-07-09
相关资源
最近更新 更多