试图理解C#中的属性是如何工作的

本文关键字:何工作 工作 属性 | 更新日期: 2023-09-27 18:20:41

我正在尝试获取用户输入,并检查它是否是用户输入的最大值;最大值应该保存到maxResult变量中,我正在尝试这样做,以便C使用get和set#以下是代码:

    //Number entred by user
    private static int intJudgeResult { get; set; }
    // varibale where to save the max entred number
    private static int _maxresult;
    private static int maxResult {
        get
        {
            return _maxresult;
        }
        set
        {
            if (intJudgeResult > intJudgeResult )
                maxResult = intJudgeResult ;
        }
    }

我知道这个人可以很好地设置maxResult = intJudgeResult,但我第一次尝试使用get和set:p问题是_maxresult从未初始化,不知道如何解决这个问题。。

试图理解C#中的属性是如何工作的

这里出现了几个错误。。。

这永远不会是真的:

if (intJudgeResult > intJudgeResult)

我想你的意思是:

if (intJudgeResult > _maxResult)

此外,这是一个等待发生的堆栈溢出异常:

maxResult = intJudgeResult;

您的意思是设置后备变量,而不是属性:

_maxResult = intJudgeResult;

(从属性中设置属性会导致setter无限调用自己。)

对于初始化值。。。由于它是一个int,它将默认为0。值类型必须具有值。如果你喜欢的话,你可以随时将其初始化为其他东西:

private static int _maxresult = 1;

任何关于未初始化值的编译器警告都可能是上面第二个问题的结果,因为您没有设置值本身。

在示例代码中,_maxresult成员是一个标准静态字段。以与任何其他字段相同的方式初始化它:

private static int _maxresult = 0;

如果要延迟初始化,则需要某种方式来指示字段尚未初始化。对于int,您可以为其指定一些无效值作为字段初始值设定项,然后在属性的get方法中测试该值。

首先不要过度使用静态。

//Number entered by user
private int _judgeResult
private int JudgeResult { 
    get 
    {
        return _judgeResult;
    }
    set
    {
        _judgeResult = value;
        if (MaxResult < value) 
            MaxResult = value;
    } 
}
// variable where to save the max entered number
private int _maxresult;
private int MaxResult {
    get
    {
        return _maxresult;
    }
    set
    {
        _maxresult = value;
    }
}

您的setter不正确,并且您有几个问题。

第一个问题是maxResult = intJudgeResult;应该是_maxResult = intJudgeResult

现在的方法应该是引起一个无限循环。通过,仅此更改并不能解决您的问题

第二个问题是条件intJudgeResult > intJudgeResult永远不会成立。

第三个问题是您没有使用特殊变量value来接受属性的输入值。

我认为这就是你想要的,尽管我想说房产可能不是实现的最佳方式

//Number entred by user
private static int _intJudgeResult;
private static int intJudgeResult 
{ 
    get
    {
        return _intJudgeResult; //EDIT: Missed the _ before
    } 
    set
    {
        intJudgeResult = value;
        maxResult = intJudgeResult;
    }
// varibale where to save the max entred number
private static int _maxresult = 0;
private static int maxResult 
{
    get
    {
        return _maxresult;
    }
    set
    {
        if (value > intJudgeResult )
            _maxResult = value;
    }
}

这将解决问题:

    public static int _judgeresult;
    private static int judgeResult
    {
        get { return _judgeresult; }
        set {
            _judgeresult = value;
            if (value > MaxValue)
                MaxValue = value;
        }
    }
    private static int MaxValue { get; set; }