C# holder类的严格用法

C# holder类的严格用法,c#,C#,如果我有一门课,比如说汽车 class Car { private Color m_Color; private int m_Passengers; } 现在,当我在这个状态下使用这个类时,我在我的软件中的X个位置上实现了这个。后来,我的老板说他还想存储汽车的最大速度。无论如何,他是个好人,应该增加他的财产 class Car { private Color m_Color; private int m_Passengers; private int m

如果我有一门课,比如说汽车

class Car {
    private Color m_Color;
    private int m_Passengers;
}
现在,当我在这个状态下使用这个类时,我在我的软件中的X个位置上实现了这个。后来,我的老板说他还想存储汽车的最大速度。无论如何,他是个好人,应该增加他的财产

class Car {
    private Color m_Color;
    private int m_Passengers;
    private int m_MaxSpeed;
}
使用此工作流,我们可能会在一段时间后遇到类似的情况

class Car {
    private Color m_Color;
    private int m_Passengers;
    private int m_MaxSpeed;
    private int m_Year;
    private List<Seats> m_Seats;
    private DateTime m_LatestCHeckup;
    private double m_GasUsage;
}
这是我的第二辆车:

Car c2 = new Car();
c2.m_Color = Color.White;
c2.m_Passengers = 4;
c2.m_MaxSpeed=200;
和第三辆车

Car c3 = new Car();
c3.m_Color = Color.Green;
c3.m_Passengers = 8;
c3.m_MaxSpeed=180;
c3.m_Year = 2000;
c3.m_Seats = mySeatList;
c3.m_LatestCheckup = Datetime.Now;
c3.m_GasUsage=1.8;
我想确保在我将GasUsage添加到类中时,在c和c2上添加GasUsage。但是c和c2是很久以前创造的,当时还不存在天然气的使用。如何防止对象未使用所有属性?我可能有一个类,但有2000个对象


我之所以想要这种行为,是因为我可能会遍历所有的汽车对象,并计算出它们使用了多少汽油。或者类似的。如果不是所有对象都有GasUsage中的值,则calc将失败

假设“必须使用属性”意味着您希望实例化对象为每个新属性设置一个值,然后您可以更改构造函数以要求新属性,为新属性设置默认值,或者在调用对象上需要设置值的方法时引发异常

汽车等级的第一个版本:

class Car
{
    public Car(Color mColor, int mPassengers)
    {
        m_Color = mColor;
        m_Passengers = mPassengers;
    }

    private Color m_Color;
    private int m_Passengers;

}
具有具有默认值的构造函数的car类的第二个版本:

class Car
{
    public Car(Color mColor, int mPassengers, int mMaxSpeed = 130)
    {
        m_Color = mColor;
        m_Passengers = mPassengers;
        m_MaxSpeed = mMaxSpeed;
    }

    private Color m_Color;
    private int m_Passengers;
    private int m_MaxSpeed;

}

如果您有需要初始化的必需属性,则应在构造函数中声明它们。任何可选值都可以设置为属性

如果将任何必需的属性添加到
Car
类中,则应将它们添加到构造函数中,那么编译将失败,直到修复以前创建的值

从您的注释来看,您似乎希望添加一个包含所有已声明属性的接口,然后将它们设置为实现类中的所有构造函数参数:

public interface ICar {
    Color Color { get; }
    int Passengers { get; }
    ...
    double GasUsage { get; }
}

class Car : ICar {
    public Car(Color color, int passengers, int maxSpeed, ..., double gasUsage) {
        this.m_Color = color;
        this.m_Passengers = passengers;
        ...
        this.m_GasUsage
    }
    private Color m_Color;
    private int m_Passengers;
}

类实例的初始化也可以使用要求所有属性的构造函数来完成;一旦添加了一个新属性,所有安装都会在语法上变得不正确。

您在X个位置实现的“this”是什么?您只需更换
汽车一次。你想在某个地方处理它的所有属性吗?这取决于你所说的“使用”是什么意思。初始化?阅读还有别的吗?@lee我已经更新了我的问题。我希望它变得更清楚:)@Adriano我所说的“使用”是指一个属性得到了一个值。如果不是所有属性都使用其类型的数据设置,我不希望对象有效。如果某个属性未调用,则不能强制编译器发出错误。有很多解决方案(都是在运行时)。我通常倾向于将所有内容初始化为公共/有效值,然后在第一次调用方法时执行检查(如果(!IsFullyInitialized())throw…它将在运行时进行检查,但这是最好的方法(您甚至可以强制在构造函数中传递所有必需的参数,但在我看来,如果您有很多参数,这将非常糟糕)。这是我想要的,但我不想允许默认值。我想知道接口对方法来说是什么,但对属性来说是什么。@user3427831-你可以在接口中放置属性,请参阅更新。我甚至不知道我怎么会错过这一点。但是,谢谢你,伙计!街头信条!你能举个例子吗?谢谢你的回答。我知道这个解决方案ion,但这里的问题是,所有东西都没有默认值。例如,同一型号的两辆车可能有不同的发动机,从而导致不同的最大速度。因此,我需要更严格的要求。例如,此属性是否设置为值?否?脸上有例外!:)至少类似于此:)是的!我可以问一个例子吗?我的答案与用户904895的答案基本相同。
public interface ICar {
    Color Color { get; }
    int Passengers { get; }
    ...
    double GasUsage { get; }
}

class Car : ICar {
    public Car(Color color, int passengers, int maxSpeed, ..., double gasUsage) {
        this.m_Color = color;
        this.m_Passengers = passengers;
        ...
        this.m_GasUsage
    }
    private Color m_Color;
    private int m_Passengers;
}