c#初始化对象值
本文关键字:对象 初始化 | 更新日期: 2023-09-27 18:13:52
是否有一种方法可以一次性改变c#对象的值…一句话?
如果我有一个包含string msg
和bool isPositive
的类Result
并且我之前已经在某处调用了构造函数比如var result = new Result();
我可以通过不输入
result.msg = "xxxxxx";
result.bool = false;
但是做一些类似于实例化时可以做的事情:
result { msg = "", bool = true}
我知道我可以通过实例化一个新对象来实现:
var result = new Result() { msg = "", bool = true}
但这不是我的问题:)
您为什么不创建一个方法来为您做这些呢?
public void SetResult(string msg, bool flag)
{
myFlag = flag;
myMsg = msg;
}
然后调用它:
myResult.SetResult("xxx", false); // one line
您可以编写一个函数来重置值。例如:
public class Result
{
...
public void ResetResult()
{
msg = "xxxxxx";
boole = false;
}
}
然后,执行重置,
var result = new Result() { msg = "", boole = true}
//...Do whatever you want to do with result.
result.ResetResult();
//...Do whatever you want to do with the *reset* result.
你可以创建一个setter:
class Result
{
public string msg;
public bool boolean;
public SetValues(string message, bool boolean)
{
msg = message;
this.boolean = boolean;
}
}
那么你可以调用:
SetValues("a string", true);
您还可以利用可选参数:
public SetValues(string message = "", bool boolean = false)
{
msg = message;
this.boolean = boolean;
}
所以你可以在不指定任何参数的情况下调用该方法,它将作为重置:
SetValues();
但是我仍然建议使用初始化列表,因为创建一个设置多个属性的setter并不是一个好的做法,因为你可以以各种方式设置它们中的每一个,并且它仍然违反了SRP。
你可以显式地在你的类中实现一个方法来做你需要的事情,例如:
public class Result
{
public string Property1 { get; set; }
public int Property2 { get; set; }
//directly in the instatation of the object
public Result()
{
this.Property1 = "a";
this.Property2 = 1;
}
//or explicitely within a method
public void ChangeValues()
{
this.Property1 = "a";
this.Property2 = 1;
}
//or explicitely setting the values from outside as parameters
public void ChangeValues(string property1, int property2)
{
this.Property1 = property1;
this.Property2 = property2;
}
}
Ussage:
//option 1
var result = new Result(); //values would be already set here
//option 2
var result = new Result();
result.ChangeValues(); //values would be set here
//option 3
var result = new Result();
result.ChangeValues("a",1);
您也可以遍历属性以便为每个属性设置不同的值,但我认为这有点过分了
好的,所以这和这里的其他答案非常相似-(几乎相同)几乎。
我想我应该对其他答案提供一点不同的看法——只是提供一种使用public
方法来调用…的替代方法。
您可以在Result
类中定义属性的"默认"值,通过使用const
蚂蚁(甚至只是普通字段)。
然后,将属性的默认值设置为这些常量(或字段,以哪个为准)。
然后,当你构造一个没有初始化项的新Result()
时,Result
对象将使用这些默认值创建。
您可以使用Reset()
函数,该函数也使用这些默认值。
当涉及到重构时,这也可以证明更容易维护。
下面是如何定义
Result
类的属性和方法:
public class Result
{
private const string defaultMsg = "xxx";
private const bool defaultIsPositive = false;
public string Msg { get; set; } = defaultMsg;
public bool IsPositive { get; set; } = defaultIsPositive;
public void Reset()
{
Msg = defaultMsg;
IsPositive = defaultIsPositive;
}
}
请注意,public string Msg { get; set; } = defaultMsg;
是初始化属性的一种很好的简便方法(我认为它只在c# 6.0中可用)。
public Result()
{
Msg = defaultMsg;
IsPositive = defaultIsPositive;
}
那么,消费它就像创建对象一样简单,用它做任何事情;然后调用Reset()
方法:
// create a Result object with its default values
var result = new Result();
// OR
// create a Result object with some non-default values
var result = new Result { Msg = "something", IsPositive = true };
然后,对result
对象进行操作或做您想做的事情。
然后,重置值:
... // do whatever with your result object
// reset the result to its default values
result.Reset();