我有以下课程:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
在ShoppingCart类中,private LinqValueCalculator calc;根据我的理解,我们正在从该类创建一个对象,但这与它有什么不同private LinqValueCalculator calc = new LinqValueCalculator();
应该首选哪一个...在哪里以及为什么?
在ShoppingCart类中,有私有的LinqValueCalculator calc; 根据我的理解,我们正在从该类创建一个对象
不,它没有.它声明了该类型的变量,但它不会创建任何对象.最初,这将默认为null......但区分对象,变量和引用很重要.例如,您可以有两个变量但只有一个对象......
LinqValueCalculator calc1 = new LinqValueCalculator();
LinqValueCalculator calc2 = calc1;
Run Code Online (Sandbox Code Playgroud)
这里两个变量都具有相同的值 - 这是对它创建的单个对象的引用.
在下面的代码中,您将calc类ShoppingCart中的引用分配给传入的引用calcParam.最初该calc字段是,null并且一旦构造函数运行,它就被分配给calcParam.两个引用都指向同一个对象,因此任何引用都会在对象中反映出更改.
private LinqValueCalculator calc;
public ShoppingCart(LinqValueCalculator calcParam)
{
calc = calcParam;
}
Run Code Online (Sandbox Code Playgroud)
下面的代码创建了一个LinqValueCalculator仅从此类引用的新对象.没有其他人对此对象有引用,因此只有购物车才能使用该对象.
private LinqValueCalculator calc = new LinqValueCalculator();
Run Code Online (Sandbox Code Playgroud)
根据您是否需要共享计算器以及是否要在ShoppingCart类中控制其生命周期,这两种用法都很有用.
如果你有C++背景,C#引用更像是C++指针而不是引用.
所以假设LinqValueCalculator有一个默认的构造函数,创建一个ShoppingCart可能看起来像这样:
LinqValueCalculator calc = new LinqValueCalculator();
ShoppingCart cart = new ShoppingCart(calc);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2997 次 |
| 最近记录: |