面试题答案
一键面试策略阐述
- 自动属性:对于大部分简单的数据传输和存储需求,使用自动属性。它们简洁明了,编译器会自动生成存储字段,在代码可读性和性能之间取得良好平衡。例如,对于简单的业务对象属性,如用户的姓名、年龄等,这些属性通常只是简单的赋值和取值操作,不涉及复杂的业务逻辑。
- 只读属性:当属性值在对象创建后不应被修改,或者计算该属性值的成本较高且在对象生命周期内不会改变时,使用只读属性。比如,在计算一些复杂的统计值(如订单的总金额,计算过程涉及多个子项的累加等)且该订单一旦确定后总金额不会再改变的情况下,使用只读属性可以保证数据的一致性,并且避免重复计算带来的性能开销。
代码示例
- 数据访问层(DAL)
假设我们有一个
User
实体类,用于从数据库中获取和存储用户信息。
public class User
{
// 自动属性用于简单数据存储
public string Name { get; set; }
public int Age { get; set; }
// 只读属性,假设用户的唯一标识在数据库层面是固定的,从数据库获取后不应改变
public int UserId { get; }
// 构造函数用于初始化只读属性
public User(int userId, string name, int age)
{
UserId = userId;
Name = name;
Age = age;
}
}
- 业务逻辑层(BLL)
在业务逻辑层,我们可能会有一个
UserService
类,用于处理与用户相关的业务逻辑。
public class UserService
{
// 模拟从数据访问层获取用户数据
public User GetUserById(int userId)
{
// 实际应用中这里会调用数据访问层方法从数据库获取数据
return new User(userId, "John Doe", 30);
}
// 示例方法,根据业务需求修改用户信息
public void UpdateUser(User user, string newName, int newAge)
{
user.Name = newName;
user.Age = newAge;
// 这里可以添加保存修改到数据库的逻辑,调用数据访问层方法
}
}
- 表示层(PL) 在表示层(如ASP.NET MVC控制器),我们使用业务逻辑层提供的服务。
public class UserController : Controller
{
private readonly UserService _userService;
public UserController(UserService userService)
{
_userService = userService;
}
public ActionResult UserDetails(int userId)
{
var user = _userService.GetUserById(userId);
// 将用户信息传递给视图
return View(user);
}
[HttpPost]
public ActionResult UpdateUser(User user, string newName, int newAge)
{
_userService.UpdateUser(user, newName, newAge);
return RedirectToAction("UserDetails", new { userId = user.UserId });
}
}
通过这种方式,在不同的层次中合理使用自动属性和只读属性,既满足了复杂业务逻辑对属性的灵活读写需求,又在一定程度上优化了性能。