C#初始化对象值

时间:2016-10-19 14:15:26

标签: c# object initialization

有没有办法一次性更改C#对象值...在一行?

因此,如果我有一个Result string msgbool isPositive的课程,并且我已经在var result = new Result();之前的某处调用了构造函数,我可以通过不输入以某种方式更改值: / p>

result.msg = "xxxxxx";
result.bool = false;

但是做一些像实例化时你可以做的事情:

result { msg = "", bool = true}

我知道我可以通过以下方式再次实例化一个新对象来实现:

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

但这不是我的问题:)

5 个答案:

答案 0 :(得分:6)

为什么不创建一种能够为你做到这一点的方法......

public void SetResult(string msg, bool flag)
{
   myFlag = flag;
   myMsg = msg;

}

然后你调用它:

 myResult.SetResult("xxx", flase);  // one line 

答案 1 :(得分:4)

您可以编写一个函数来重置值。例如:

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.

答案 2 :(得分:4)

你可以制作一个二传手:

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并不是一个好习惯,因为你可以用各种方式设置它们中的每一个,但它仍然违反了{{3} }。

答案 3 :(得分:2)

明确地,您可以在类中实现满足您需要的方法,例如:

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

您也可以通过属性进行迭代,以便为每个属性设置不同的值,但是我觉得这有点过分了

答案 4 :(得分: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();