c#初始化对象值

本文关键字:对象 初始化 | 更新日期: 2023-09-27 18:13:52

是否有一种方法可以一次性改变c#对象的值…一句话?

如果我有一个包含string msgbool isPositive的类Result并且我之前已经在某处调用了构造函数比如var result = new Result();我可以通过不输入

来改变值吗?
result.msg = "xxxxxx";
result.bool = false;

但是做一些类似于实例化时可以做的事情:

result { msg = "", bool = true}

我知道我可以通过实例化一个新对象来实现:

var result = new Result() { msg = "", bool = true}

但这不是我的问题:)

c#初始化对象值

您为什么不创建一个方法来为您做这些呢?

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();