C# 构造函数调用比自身更有价值的构造函数
C# constructor calls constructor with more value than itself
我很确定我在重复一个问题,但在我的例子中它不起作用,请看代码:
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)
表示它在当前上下文中不存在。我想以这种方式调用它,因为首先我希望我的代码用两个字符串实例化 class,然后我想只向一个参数构造函数提供值但不丢失 messageType
,因为我将在此构造函数 public Test (string value)
中使用它。我读过有关链接和实例化构造函数的内容,但似乎这件事与我读到的相反。抱歉,如果这是一个简单的问题,那么编程方面还没有太多练习,我想知道代码应该是什么样子。在提出这个问题之前我读过的内容:Call one constructor from another, How call constructor inside other constructor?, http://www.csharp411.com/constructor-chaining/,它对我不起作用,如果我在重复或做愚蠢的事情,再次抱歉。
所以在你的例子中,你必须构造函数:一个接受值和类型,另一个只接受值。在这种情况下,如果用户只提供一个值,则该类型应该有一个默认的假设值。例如,您可以这样做:
public Test (string value) : this (value, "Default Message Type")
{
}
这段代码的作用是从用户那里获取值,即构造函数的调用者,并将其传递给另一个构造函数,连同名为 "Default Message Type".[=12= 的默认消息]
请注意,您不需要在此构造函数中放置任何代码,因为它将调用另一个将设置值和类型的构造函数。
希望对您有所帮助。
编辑:从评论中,我了解到@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;
}
}
基本上,您正在创建一个函数来执行两个构造函数所做的事情,然后构造函数只计算值并将它们传递给该函数。
The call to the database and message string comes before creating an
object of Test class and then i want to put two values in it, and then
manipulate those values inside and provide them to constructor with
one parameter. If that explains something.
根据 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)
我想你要做的是调用 Test test1 = new Test("Value", "MessageType");
来实例化一个对象。然后带有两个字符串的构造函数将这些参数设置为 testValue
和 mType
字段并调用第一个构造函数进行操作。
在你的代码中,第一个构造函数没有调用第二个,实际上是第二个构造函数调用了第一个。如果你想让第一个构造函数调用第二个你的构造函数签名应该是这样的:
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
}
我很确定我在重复一个问题,但在我的例子中它不起作用,请看代码:
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)
表示它在当前上下文中不存在。我想以这种方式调用它,因为首先我希望我的代码用两个字符串实例化 class,然后我想只向一个参数构造函数提供值但不丢失 messageType
,因为我将在此构造函数 public Test (string value)
中使用它。我读过有关链接和实例化构造函数的内容,但似乎这件事与我读到的相反。抱歉,如果这是一个简单的问题,那么编程方面还没有太多练习,我想知道代码应该是什么样子。在提出这个问题之前我读过的内容:Call one constructor from another, How call constructor inside other constructor?, http://www.csharp411.com/constructor-chaining/,它对我不起作用,如果我在重复或做愚蠢的事情,再次抱歉。
所以在你的例子中,你必须构造函数:一个接受值和类型,另一个只接受值。在这种情况下,如果用户只提供一个值,则该类型应该有一个默认的假设值。例如,您可以这样做:
public Test (string value) : this (value, "Default Message Type")
{
}
这段代码的作用是从用户那里获取值,即构造函数的调用者,并将其传递给另一个构造函数,连同名为 "Default Message Type".[=12= 的默认消息]
请注意,您不需要在此构造函数中放置任何代码,因为它将调用另一个将设置值和类型的构造函数。
希望对您有所帮助。
编辑:从评论中,我了解到@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;
}
}
基本上,您正在创建一个函数来执行两个构造函数所做的事情,然后构造函数只计算值并将它们传递给该函数。
The call to the database and message string comes before creating an object of Test class and then i want to put two values in it, and then manipulate those values inside and provide them to constructor with one parameter. If that explains something.
根据 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)
我想你要做的是调用 Test test1 = new Test("Value", "MessageType");
来实例化一个对象。然后带有两个字符串的构造函数将这些参数设置为 testValue
和 mType
字段并调用第一个构造函数进行操作。
在你的代码中,第一个构造函数没有调用第二个,实际上是第二个构造函数调用了第一个。如果你想让第一个构造函数调用第二个你的构造函数签名应该是这样的:
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
}