使用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();有何不同

应该选择哪一个…在哪里,为什么?

使用new或不使用new在c#中创建对象

在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的对象负责实例化所有依赖项,并将它们提供给相应的对象。

依赖注入的好处——程序员交换