C#如何获取从栈中弹出的自定义Class1对象的成员属性值(如人员姓名)
核心问题定位
你当前的代码存在两个无法正常运行的核心问题:
- Class1中定义的
string _name { get; set; }这类自动属性,默认访问级别为private,属于类的私有成员,外部代码完全无法读取;同时你在Main方法中写的person.name()调用完全不匹配实际的成员定义:既没有叫name的公开方法,属性名也不是不带下划线的name。 - 存储在实例内部的人员姓名没有对外暴露公开读取入口,导致即便成功弹出栈内的Class1对象,也无法获取内部存储的姓名值。
落地修正方案
1. 调整Class1的成员访问级别
把需要外部读取的属性改成公开可读的自动属性,原有构造函数的赋值逻辑保持不变即可:
// 公开属性设置为可读,写入权限限定在类内部,避免外部随意篡改实例数据 public string Name { get; private set; } public int Rank { get; private set; } public string RankName { get; private set; } public Class1(string name, int rank) { Name = name; Rank = rank; } public Class1(string name, string rankName) { Name = name; RankName = rankName; }
如果强行保留你原来的_name命名,也可以把属性写成public string _name { get; private set; },但这种写法不符合.NET平台的公开成员命名规范,长期维护会增加额外成本,不推荐使用。
2. 修正Main方法中的调用逻辑
属性是类的存储成员,不是可执行方法,不需要加括号调用,修改为直接读取公开属性即可:
Deck d = new Deck(); Class1 person = d.getPerson(); // 直接访问公开的Name属性,无需加括号 Console.WriteLine(person.Name);
常见踩坑提醒
- 如果不调整属性的访问级别,无论怎么修改外部调用代码,都会触发编译错误,提示“当前上下文中不存在对应名称”,因为私有成员只能在类的内部方法中访问。
- 你写的
getPerson()方法直接调用stackOne.Pop(),如果栈内没有任何元素,会直接抛出运行时异常,建议在Pop之前增加stackOne.Count的栈空判断,避免程序意外崩溃。
内容的提问来源于stack exchange,提问作者User17353
相关产品推荐
相关产品推荐

