在无参数构造函数中设置属性
本文关键字:设置 属性 构造函数 参数 | 更新日期: 2023-09-27 18:17:48
我使用linq通过无参数构造函数填充对象。我在构造函数上设置了一个断点,并注意到"this"的值都没有被填充。我想要的一个性质是其它性质的总和。下面是我的类的简化示例:
// I'd like totalEstimatedUse to be the total of estimatedType1 + estimatedType2
public class EstimatedUse
{
public string ID { get; set; }
public double estimatedType1 { get; set; }
public double estimatedType2 { get; set; }
public double totalEstimatedUse { get; set; } // I'd like this to be the sum
}
// parameterless constructor - I cannot get anything to work inside this because
// 'this' has no values when it's populated (from linq in my code)
public EstimatedUse
{
}
// here is a constructor that has parameters
public EstimatedUse(string id, double estimatedType1, double estimatedType2)
{
this.ID = id;
this.estimatedType1 = estimatedType1;
this.estimatedType2 = estimatedType2;
this.totalEstimatedUse = estimatedType1 + estimatedType2;
}
发生的问题是,我使用linq填充它,它去无参数构造函数,那不设置我的totalEstimatedUse。为了避开它,我要做的是使用带参数的构造函数第二次设置它。是否有更合适的方式来完成这一点,而不是我下面的?
EstimatedUse estimatedUse = null;
// cutoff linq to keep example clean
.Select(e => new EstimatedUse
{
ID = e.ProjectID,
estimatedType1 = e.estimatedType1),
estimatedType1 = e.estimatedType2),
}).FirstOrDefault();
// below is to set the length but I wish I could set in the parameterless constuctor if
// it's possible
estimatedUse = new EstimatedUse(estimatedUse.ID, estimatedUse.estimatedType1,
stimatedUse.estimatedType2);
也许您将totalEstimatedUse
属性更改为自动求和的只读属性会更好。
public class EstimatedUse
{
public string ID { get; set; }
public double estimatedType1 { get; set; }
public double estimatedType2 { get; set; }
public double totalEstimatedUse
{
get { return this.estimatedType1 + this.estimatedType2; }
}
// ...
}
这样,您就不必在创建时设置属性的值,并且它将与您的其他值保持一致。
您也可以更改totalEstimatedUse
属性的getter,以便在访问它时自动计算总和:
public class EstimatedUse
{
public string ID { get; set; }
public double estimatedType1 { get; set; }
public double estimatedType2 { get; set; }
public double totalEstimatedUse { get { return estimatedType1 + estimatedType2; }
}
您没有在构造函数中设置值,您正在使用对象初始化器语法。该语法通过调用对象的构造函数创建对象,然后设置指定的属性。
要使用这些值执行对象的初始化,你需要实际有一个接受这些值的构造函数。
当然,另一种方法是首先避免对对象进行初始化。在本例中,这意味着不在字段中保存总和,而是在属性getter中根据请求计算总和。
如果你不想在构造函数中传递任何参数,那么你应该将你应该传递给构造函数的字段设置为全局。并在调用类之前设置该值。然后在构造函数中初始化它。
虽然这不是理想的方法,但这仍然是一种选择。但是您应该看看是否可以向构造函数传递一个参数来设置这些值。
直接去掉无参数构造函数,使用带参数的构造函数:
.Select(e => new EstimatedUse(e.ProjectID,e.estimatedType1e.estimatedType2))
.FirstOrDefault();
当你有更好的构造函数选项时,没有理由使用对象初始化式。