C#如何跨类访问静态方法内拆分生成的姓名变量
问题原因
你在方法内声明的FirstName/MiddleName/LastName属于局部变量,作用域仅限定在当前SplitFullName方法内部,方法执行结束后变量就会被回收,不管是其他类还是同一个类的其他方法,都没法直接访问这三个变量。要实现跨类访问,核心思路是把这三个值作为方法的返回结果对外暴露,有两种常用的实现方式。
方案1:定义专用模型类返回(工程化场景推荐)
这种写法可读性最强、后续扩展方便,适合正式项目使用。
首先定义专门用来承载姓名拆分结果的类:
public class SplitNameResult { public string FirstName { get; set; } = string.Empty; public string MiddleName { get; set; } = string.Empty; public string LastName { get; set; } = string.Empty; }
改造原有的SplitFullName方法,将返回值类型从string改为上面定义的SplitNameResult,同时顺便修复原代码里的两个逻辑问题:单名场景下LastName被错误赋值、MiddleName拼接后带前导空格:
public static SplitNameResult SplitFullName(string fullName) { var result = new SplitNameResult(); if (string.IsNullOrWhiteSpace(fullName)) { return result; } // 拆分时自动去除连续空格产生的空条目 string[] names = fullName.Split(' ', StringSplitOptions.RemoveEmptyEntries); if (names.Length == 1) { result.FirstName = names[0]; } else if (names.Length == 2) { result.FirstName = names[0]; result.LastName = names[1]; } else { result.FirstName = names[0]; // 拼接中间名,不会产生多余前导空格 result.MiddleName = string.Join(" ", names.Skip(1).Take(names.Length - 2)); result.LastName = names[^1]; } Console.WriteLine($"The first name is: {result.FirstName}; The middle name is: {result.MiddleName}; The last name is: {result.LastName}"); return result; }
其他类调用时,直接接收方法返回的结果对象,就能访问三个拆分后的值:
// 调用示例,把NameHelper替换成你定义SplitFullName方法的类名 var nameInfo = NameHelper.SplitFullName("John Michael Smith"); // 直接访问三个属性 Console.WriteLine(nameInfo.FirstName); // 输出 John Console.WriteLine(nameInfo.MiddleName); // 输出 Michael Console.WriteLine(nameInfo.LastName); // 输出 Smith
方案2:使用值元组返回(轻量场景适用)
如果不想额外定义类,在C# 7.0及以上版本可以直接用值元组作为返回值,写法更简洁:
public static (string FirstName, string MiddleName, string LastName) SplitFullName(string fullName) { string firstName = string.Empty; string middleName = string.Empty; string lastName = string.Empty; if (string.IsNullOrWhiteSpace(fullName)) { return (firstName, middleName, lastName); } string[] names = fullName.Split(' ', StringSplitOptions.RemoveEmptyEntries); if (names.Length == 1) { firstName = names[0]; } else if (names.Length == 2) { firstName = names[0]; lastName = names[1]; } else { firstName = names[0]; middleName = string.Join(" ", names.Skip(1).Take(names.Length - 2)); lastName = names[^1]; } Console.WriteLine($"The first name is: {firstName}; The middle name is: {middleName}; The last name is: {lastName}"); return (firstName, middleName, lastName); }
其他类调用时既可以直接解构为三个独立变量,也可以通过元组对象访问成员:
// 方式1:直接解构 var (firstName, middleName, lastName) = NameHelper.SplitFullName("John Michael Smith"); // 方式2:通过返回对象访问 var nameResult = NameHelper.SplitFullName("John Michael Smith"); Console.WriteLine(nameResult.LastName);
注意:不要尝试把三个局部变量改成类的静态字段来实现跨类访问,静态字段是全局共享的,多线程同时调用方法时会出现值覆盖的问题,产生非常难排查的bug。
内容的提问来源于stack exchange,提问作者Daniel Amoah
相关产品推荐
相关产品推荐

