gpt4 book ai didi

c# - 使用 ref over return

转载 作者:行者123 更新时间:2023-11-30 16:19:47 24 4
gpt4 key购买 nike

我正在创建一个实例化私有(private)结构的“适配器”基类。该结构通过抽象的 Configure() 方法暴露给继承者,因此他们可以在其上设置属性。实现如下:

public abstract class PaymentAdapter {

private PaymentObject p = new PaymentObject();

protected PaymentObject CreditCardPayment {
get { return p; }
}

protected abstract void Configure(PaymentObject payment);

public MyResponse ProcessPayment() {
// Run the adapter's setup
Configure(p);

// Charge the customer
var chargeResult = p.DoSomething();

return new MyResponse {
MyResult = chargeResult
};
}
}

细心的人会发现以下行需要注意什么:

protected abstract void Configure(PaymentObject payment);

当在具体类中重写时,此方法(几乎)让使用者有机会直接修改结构的属性。这是期望的结果。

我的问题是 - 我应该使用 ref 参数,还是将 void 更改为 PaymentObject,让消费者自己返回一个实例?

方法一:

protected abstract PaymentObject Configure(PaymentObject payment);

方法二:

protected abstract void Configure(ref PaymentObject payment);

因此,在继承类时,消费者必须执行以下操作:

方法一:

public class MyConsumer : PaymentAdapter {
#region Overrides of PaymentAdapter

protected override PaymentObject Configure(PaymentObject payment) {
payment.AProperty = "Something";
return payment;
}

#endregion
}

方法二:

public class MyConsumer : PaymentAdapter {
#region Overrides of PaymentAdapter

protected override void Configure(ref PaymentObject payment) {
payment.AProperty = "Something";
}

#endregion
}

除了语法上的细微变化外,还有其他区别吗?这是偏好的事情,还是我看不到使用其中一个优于另一个的好处?

由于代码略少,我倾向于使用“ref”方法,这与我多年来专门从方法返回对象相反。这似乎是 ref 参数的完美案例 - 它使消费者的工作稍微容易一些,并且意味着我不会在所有地方设置对象。

最佳答案

引用类型默认通过引用传递,所以你不必在这里使用ref关键字。

如果您的类型是 Struct,您绝对应该使用 return 语句,因为结构应该是不可变的(为什么?阅读 Why are mutable structs “evil”?Why are C# structs immutable? 的答案)

关于c# - 使用 ref over return,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14980321/

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