.NET7中如何将对象值存入字符串变量并避免空引用异常
问题描述
在.NET7环境中,尝试将SupPhone对象的PhoneNumber值存入字符串变量时,若SupPhone对象为null会触发**“对象引用未设置为对象实例”**异常;仅当SupPhone.PhoneNumber有值时能正常存储。尝试用suphone.ToString() == null判断无效,且无法使用三元运算符,寻求解决办法。
修正语法错误后的相关代码:
[XmlType("CustRec"), XmlRoot, Serializable] public class SupPhone { private string _phone; public SupPhone() { _phone = string.Empty; } [XmlElement(ElementName = "PHONE_NUMBER")] public string PhoneNumber { get { return _phone; } set { _phone = value; } } } // program.cs SupPhone suphone = phonecollection.GetMainPhone(); // 此处需处理suphone为null的情况,设置空字符串,尝试suphone.ToString()==null无效 // 注:用户称无法使用三元运算符 string phonenbr = suphone.PhoneNumber; // 此处suphone为null会报错 IsValidPhone(phonenbr); public SupPhone GetMainPhone() { SupPhone mainphone = null; for (int a = 0; a < base.Count; a++) { mainphone = base[a]; // 修正原代码的x为循环变量a } return mainphone; } bool IsValidPhone(string phone) { // 手机号验证逻辑 }
解决方案
空条件+空合并运算符组合(推荐)
这是.NET中处理空引用最简洁的方式,无需三元运算符:string phonenbr = suphone?.PhoneNumber ?? string.Empty;逻辑:若
suphone不为null则取其PhoneNumber,否则返回null;再通过??将null替换为空字符串。传统if分支判断
直接通过分支处理null情况,避免空引用:string phonenbr; if (suphone == null) { phonenbr = string.Empty; } else { phonenbr = suphone.PhoneNumber; }注意:你之前用
suphone.ToString() == null无效的核心原因是:当suphone为null时,调用ToString()会直接触发空引用异常,根本无法执行判断逻辑。必须先判断对象本身是否为null,再访问其成员。从根源避免null:优化GetMainPhone方法
如果业务允许,修改GetMainPhone方法,确保返回永远非null的SupPhone实例:public SupPhone GetMainPhone() { SupPhone mainphone = null; for (int a = 0; a < base.Count; a++) { mainphone = base[a]; } // 若循环后无结果,返回默认初始化的SupPhone(构造函数已将_phone设为空字符串) return mainphone ?? new SupPhone(); }优化后,后续代码可直接安全取值:
string phonenbr = suphone.PhoneNumber; // 无需再处理null
补充:关于“无法使用三元运算符”的说明
.NET7完全支持三元运算符,若之前尝试报错大概率是语法错误。正确写法如下:
string phonenbr = suphone != null ? suphone.PhoneNumber : string.Empty;
如果确实受限不能使用,前面的方案已足够解决问题。
内容的提问来源于stack exchange,提问作者Alevel
相关产品推荐
相关产品推荐

