C#自动实现属性与构造函数冲突?构造对象后输出为空求助
问题分析与解决
你的核心问题是构造函数没有正确给属性(或其关联的字段)赋值,导致自动属性返回null。下面结合常见错误场景和正确写法说明:
常见错误场景
场景1:手动定义字段但和自动属性无关
很多新手会误以为自动属性和自己写的字段是绑定的,比如写了这样的代码:
public class Book { // 手动定义的字段 private string title; // 自动实现属性 public string Title { get; set; } public Book(string bookTitle) { // 给手动字段赋值,但自动属性有自己的幕后字段,两者没关系 title = bookTitle; } }
这里自动实现属性Title的幕后字段是编译器自动生成的,和你手动写的title字段完全独立,所以构造函数给title赋值后,Title依然是null。
场景2:构造函数未处理参数
如果构造函数里根本没把传入的参数赋值给属性,自然拿不到值:
public class Book { public string Title { get; set; } public Book(string bookTitle) { // 空构造函数逻辑,没给Title赋值 } }
正确写法
写法1:直接给自动属性赋值
自动实现属性不需要手动定义字段,直接在构造函数里给属性赋值即可:
public class Book { // 自动实现属性,编译器生成幕后字段 public string Title { get; set; } public Book(string bookTitle) { // 直接给属性赋值,值会存在编译器生成的幕后字段中 Title = bookTitle; } }
写法2:手动字段+自定义属性(非自动实现)
如果要手动控制字段和属性的逻辑,确保字段和属性关联,构造函数给字段或属性赋值都可以:
public class Book { private string _title; public string Title { get { return _title; } set { _title = value; } } public Book(string bookTitle) { // 方式1:给字段赋值 _title = bookTitle; // 方式2:通过属性赋值(会触发set访问器给字段赋值) // Title = bookTitle; } }
关键要点
- 自动实现属性的幕后字段是隐藏的,只能通过属性的
get/set访问,不能直接操作。 - 构造函数的核心作用是初始化对象状态,必须把传入的参数关联到属性(或其对应的字段)上,才能让属性返回预期值。
内容的提问来源于stack exchange,提问作者Linh Tran
相关产品推荐
相关产品推荐

