You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在主程序无需传入输入即可激活类的setter方法?

问题分析与解决方案

你的核心问题在于混淆了属性赋值逻辑和用户输入获取逻辑,且强类型的int属性限制了外部传入非整数类型的值,导致无法在setter中完成有效的整数校验。同时原代码的setter直接调用Console.ReadLine()覆盖了外部传入的value,完全违背了属性setter的设计意图。

以下是两种符合你需求(setter负责校验整数有效性)的实现方案:

方案一:使用object类型属性(兼容多类型输入)

这种方案允许属性接收int或string类型的输入,在setter中统一校验转换:

internal class Dummy {
    private int _number;
            
    public object Number {
        get { return _number; }
        set {
            int intValue = 0;
            bool isValid = false;

            // 校验传入值是否为整数或可转换为整数的字符串
            if (value is int) {
                intValue = (int)value;
                isValid = true;
            } else if (value is string inputStr && int.TryParse(inputStr, out intValue)) {
                isValid = true;
            }

            if (isValid) {
                _number = intValue;
                Console.WriteLine($"The number is {_number}.");
            } else {
                Console.WriteLine("That is not a number.");
            }
        }
    }
}

主程序调用示例:

var dummy = new Dummy();
// 直接传入用户输入的字符串
dummy.Number = Console.ReadLine();
// 也可直接传入整数
dummy.Number = 456;

方案二:拆分输入属性与数值属性(符合单一职责)

将用户输入的字符串接收与整数校验放在专门的输入属性中,数值属性仅负责提供存储的整数值:

internal class Dummy {
    private int _number;
            
    // 对外暴露的只读数值属性,返回存储的整数
    public int Number {
        get { return _number; }
    }

    // 用于接收用户输入的属性,setter负责校验转换
    public string NumberInput {
        set {
            if (int.TryParse(value, out int intValue)) {
                _number = intValue;
                Console.WriteLine($"The number is {_number}.");
            } else {
                Console.WriteLine("That is not a number.");
            }
        }
    }
}

主程序调用示例:

var dummy = new Dummy();
// 传入用户输入的字符串
dummy.NumberInput = Console.ReadLine();
// 后续可通过dummy.Number获取存储的整数
Console.WriteLine($"Stored number: {dummy.Number}");

原代码问题说明

  1. 类型不匹配错误:Number是int类型属性,外部只能传入int值,直接传Console.ReadLine()(返回string)会触发编译错误。
  2. 崩溃原因:使用Convert.ToInt32(Console.ReadLine())时,若输入非数字,Convert方法会直接抛出FormatException导致程序崩溃,而int.TryParse()才是安全的容错转换方式。
  3. 逻辑错误:原setter中直接调用Console.ReadLine()覆盖了外部传入的value,导致主程序的赋值操作完全无效,必须在setter中重新输入,违背了属性setter的职责。

内容的提问来源于stack exchange,提问作者somebody1122

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 00:00:37