gpt4 book ai didi

C#:具有两个构造函数的对象:如何限制将哪些属性设置在一起?

转载 作者:太空狗 更新时间:2023-10-29 23:55:07 24 4
gpt4 key购买 nike

假设您有一个 Price 对象,它接受(整数数量,小数价格)或包含“4/$3.99”的字符串。有没有办法限制哪些属性可以一起设置?请随意纠正我下面的逻辑。

The Test:A和B是相等的,但是C的例子应该是不允许的。因此问题如何强制所有三个参数都不会像 C 示例中那样被调用?

AdPrice A = new AdPrice { priceText = "4/$3.99"};                        // Valid
AdPrice B = new AdPrice { qty = 4, price = 3.99m}; // Valid
AdPrice C = new AdPrice { qty = 4, priceText = "2/$1.99", price = 3.99m};// Not

类(class):

public class AdPrice {
private int _qty;
private decimal _price;
private string _priceText;

构造函数:

    public AdPrice () : this( qty: 0, price: 0.0m) {} // Default Constructor
public AdPrice (int qty = 0, decimal price = 0.0m) { // Numbers only
this.qty = qty;
this.price = price; }

public AdPrice (string priceText = "0/$0.00") { // String only
this.priceText = priceText; }

方法:

    private void SetPriceValues() {
var matches = Regex.Match(_priceText,
@"^\s?((?<qty>\d+)\s?/)?\s?[$]?\s?(?<price>[0-9]?\.?[0-9]?[0-9]?)");
if( matches.Success) {
if (!Decimal.TryParse(matches.Groups["price"].Value,
out this._price))
this._price = 0.0m;
if (!Int32.TryParse(matches.Groups["qty"].Value,
out this._qty))
this._qty = (this._price > 0 ? 1 : 0);
else
if (this._price > 0 && this._qty == 0)
this._qty = 1;
} }

private void SetPriceString() {
this._priceText = (this._qty > 1 ?
this._qty.ToString() + '/' : "") +
String.Format("{0:C}",this.price);
}

访问器(accessor):

    public int qty { 
get { return this._qty; }
set { this._qty = value; this.SetPriceString(); } }
public decimal price {
get { return this._price; }
set { this._price = value; this.SetPriceString(); } }
public string priceText {
get { return this._priceText; }
set { this._priceText = value; this.SetPriceValues(); } }
}

最佳答案

Hmmmm....与其与编译器作对,也许您只需要重新考虑您的 API。您是否考虑过以下问题:

  • 没有二传手。您的类应该是不可变的,这样它就可以通过构造函数完全初始化,并且永远不会在无效状态下被初始化。

  • 如果您坚持使用 setter,那么您的 PriceText 属性可以是只读的,而其他属性是读/写的。至少在这样做时,您不需要验证传递到该属性的文本。

  • 也许完全删除 PriceText 属性,在 .ToString 方法中覆盖对象的字符串表示形式。

在我看来,最后一个选项是最好的方法。我认为用户不应该将伪序列化字符串传递给您的类,因为它需要解析和验证——而且负担实际上应该由使用您的类的客户端承担,而不是您的类本身。

关于C#:具有两个构造函数的对象:如何限制将哪些属性设置在一起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2935636/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com