问题来源
这两天在学习ASP.Net MVC框架,遇到C#类中属性的访问问题,由于学艺不精,出现了程序异常,但通过一番折腾终于找出问题所在,因此写下本篇博文,以此防止再犯此错误。而且曾经在Unity3D中也曾经常使用set和get方法来访问类的属性。如果类中定义了一个私有数据,那么应该通过代码对数据进行赋值;如果是公有数据,那么有种Unity常用的选择,那就是在Unity的Inspector面板中通过拖拽对数据进行赋值。ASP.NetC#类中的数据也是需要在代码的某个地方进行适当的赋值。下面对所犯错误进行剖析,这里只为分析错误,不再分析MVC中是怎样的原理。
代码分析
M——在Models中分别添加Product.cs,LinqValueCalculator.cs和ShoppingCart.cs
namespace EssentialTools.Models
{
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 { get; set; }
}
}
using System.Collections.Generic;
using System.Linq;
namespace EssentialTools.Models
{
public class LinqValueCalculator
{
public decimal ValueProducts(IEnumerable<Product> products) {
decimal totalValue = 0;
foreach(Product p in products){
totalValue += p.Price;
}
return totalValue; //products.Sum(p => p.Price);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace EssentialTools.Models
{
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);
}
}
}
C——在Controllers添加控制器HomeController.cs
using System.Linq;
using System.Web.Mvc;
using EssentialTools.Models;
namespace EssentialTools.Controllers
{
public class HomeController : Controller
{
private Product[] products = { new Product{Name = "Kayak", Category="Watersports", Price=275M},
new Product{Name = "Lifejacket", Category="Watersports", Price=48.95M},
new Product{Name = "Soccer ball", Category="Soccer", Price=19.50M},
new Product{Name = "Corner flag", Category="Watersports", Price=34.95M}
};// 对象的初始化器
public ActionResult Index()
{
LinqValueCalculator calc = new LinqValueCalculator();
ShoppingCart cart = new ShoppingCart(calc);
decimal totalValue = cart.CalculateProductTotal();
return View(totalValue);
}
}
}
在VS2013中运行代码(这里代码不全),出现异常:
这是因为在HomeController中忘记给ShoppingCart中定义的赋值,正确的代码如下:
C#语言两个小特性
使用自动实现的属性,使用对象的初始化器(上面图片中已经注明);自动实现的属性如下:
对应的有点笨的方法的代码如下:
private IEnumerable<Product> products;
public IEnumerable<Product> Products{
get { return products; }
set { products = value; }
}