使用new或不使用new在c#中创建对象
本文关键字:new 创建对象 使用 | 更新日期: 2023-09-27 18:19:13
我有以下类:
public class Product
{
public int ProductID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public decimal Price { get; set; }
public string Category { set; get; }
}
public class LinqValueCalculator
{
public decimal ValueProducts(IEnumerable<Product> products)
{
return products.Sum(p => p.Price);
}
}
public class ShoppingCart
{
private LinqValueCalculator calc;
public ShoppingCart(LinqValueCalculator calcParam)
{
calc = calcParam;
}
public IEnumerable<Product> Products { get; set; }
public decimal CalculateProductTotal()
{
return calc.ValueProducts(Products);
}
}
在ShoppingCart类中,根据我的理解,有private LinqValueCalculator calc;
我们正在从该类创建对象,但这与private LinqValueCalculator calc = new LinqValueCalculator();
有何不同
应该选择哪一个…在哪里,为什么?
在ShoppingCart类中,有private LinqValueCalculator calc;根据我的理解,我们是从那个类中创建一个对象
不,没有。它声明了一个该类型的变量,但它不创建任何对象。最初,它将默认为null
…但是区分对象、变量和引用是很重要的。例如,您可以有两个变量,但只有一个对象…
LinqValueCalculator calc1 = new LinqValueCalculator();
LinqValueCalculator calc2 = calc1;
这里两个变量都有相同的值——是对它创建的单个对象的引用
在下面的代码中,您将ShoppingCart
类中的引用calc
分配给calcParam
中传递的引用。最初calc
字段是null
,一旦构造函数运行,它就被赋值给calcParam
。两个引用都指向同一个对象,因此任何引用的更改都会反映在对象中。
private LinqValueCalculator calc;
public ShoppingCart(LinqValueCalculator calcParam)
{
calc = calcParam;
}
下面的代码创建了一个新的LinqValueCalculator
对象,仅从该类引用。没有其他人有对该对象的引用,因此只有购物车可以使用该对象。
private LinqValueCalculator calc = new LinqValueCalculator();
这两种用法都是有用的,这取决于你是否想要一个共享计算器,以及你是否想在ShoppingCart
类中控制它的生命周期。
如果你有c++背景,c#引用更像是c++指针而不是引用。
所以假设LinqValueCalculator
有一个默认构造函数,创建ShoppingCart
可能看起来像这样:
LinqValueCalculator calc = new LinqValueCalculator();
ShoppingCart cart = new ShoppingCart(calc);
这只是一个架构决策。之所以把LinqValueCalculator
作为参数放在ShoppingCard
构造函数中,是因为作者想使用依赖注入。当您使用DI时,您将对象的生命周期的责任移到ShoppingCard
类之外,这在将来提供了更多的控制,因为每个对象都从外部接收它的依赖项,但它们只消耗它,而不是实例化。
使得遵循单一职责原则变得容易。通常,另一个名为composer或catalog的对象负责实例化所有依赖项,并将它们提供给相应的对象。
依赖注入的好处——程序员交换