我在ASP.Net和Unity3D中遇到的C#类属性的问题

问题来源

这两天在学习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; }
} 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值