C# get/set访问器仅返回属性原值未返回预期拼接文本的问题
问题描述
我尝试编写一个用于采集用户姓名、年龄、意向工作岗位的C#程序,将Employee类中的job字段设置为私有类型,希望通过get/set访问器返回「姓名+提示文本+实际岗位值」的拼接结果,但实际运行时仅返回输入的岗位原值,未得到预期的拼接内容,实现代码如下:
using System; namespace Exercise_Project { class Program { static void Main(string[] args) { //Apply for job application Console.Write("Enter your name: "); string name = Console.ReadLine(); Console.Write("Enter how old are you: "); int age = Convert.ToInt32(Console.ReadLine()); if (age < 18) { Console.WriteLine("You are too young to work!"); Console.ReadKey(); } else { Console.Write("Which job would you like to work: Programmer, Magician, Baker - "); string job = Console.ReadLine(); Employee Person = new Employee(name, age, job); Console.WriteLine(Person.Job); } Console.ReadKey(); } } class Employee { public string name; public int age; private string job; public Employee(string aName, int aAge, string aJob) { name = aName; age = aAge; job = aJob; } public string Job { get { return job; } set { if(value=="Programmer" || value== "Magician" || value == "Baker") { job = name + ", welcome to your new job as " + value; } else { job = name + ", you don't have a job!"; } } } } }
问题原因
你在Employee的构造函数中,直接对私有字段job赋值,完全绕过了Job属性的set访问器——你写的岗位拼接逻辑全在set块里,根本没有被执行,私有字段job里存的始终是构造函数传入的原始岗位字符串,get访问器自然只能返回原始输入值。
修复方案
修改Employee类的构造函数,不要直接给私有支撑字段job赋值,改为给公有属性Job赋值,让初始化流程自动触发set块里的拼接逻辑:
public Employee(string aName, int aAge, string aJob) { name = aName; age = aAge; // 替换原有的 job = aJob; Job = aJob; }
修改后重新运行,输入合法岗位时会输出[姓名], welcome to your new job as [岗位],输入不在可选范围内的岗位时会输出[姓名], you don't have a job!,和预期效果一致。
补充建议:
name和age也建议改为封装了私有字段的属性,不要直接暴露公有字段,符合C#面向对象的封装规范。
内容的提问来源于stack exchange,提问作者Nikola Ivaniš
相关产品推荐
相关产品推荐

