【问题标题】:Trying to understand how properties in C# works试图了解 C# 中的属性是如何工作的
【发布时间】:2015-11-06 00:54:11
【问题描述】:

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

    //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# variables get set


    【解决方案1】:

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

    这永远不会是真的:

    if (intJudgeResult > intJudgeResult)
    

    我认为你的意思是:

    if (intJudgeResult > _maxResult)
    

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

    maxResult = intJudgeResult;
    

    您的意思是设置支持变量,而不是属性:

    _maxResult = intJudgeResult;
    

    (从属性内部设置属性会导致 setter 无限调用自身。)

    至于初始化值...因为它是int,所以默认为0。值类型必须有一个值。如果您愿意,您可以随时将其初始化为其他内容:

    private static int _maxresult = 1;
    

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

    【讨论】:

      【解决方案2】:

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

      private static int _maxresult = 0;
      

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

      【讨论】:

        【解决方案3】:

        首先不要过度使用静态。

        //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;
            }
        }
        

        【讨论】:

        • 这如何解决_maxresult字段的初始化问题?
        • _maxresult 将默认为 0,因为它是一个 int。并且会在 JudgeResult 设置为高于当前 MaxResult 的值时正确设置为最大值
        • 也许您可以在答案中包含对此的解释,而不是仅仅发布似乎无法回答问题的代码,即使它可以解决发帖人实际遇到的问题。
        【解决方案4】:

        您的二传手不正确,您有几个问题。

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

        您现在拥有它的方式应该会导致无限循环。不过,仅此更改并不能解决您的问题

        您的第二个问题是条件intJudgeResult &gt; 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;
            }
        }
        

        【讨论】:

        • 你的意思是_maxresult = value
        • 这将返回 System.StackOverflowException
        • 你认为你会从哪里得到 System.StackOverflowException?在此阶段,您可以在intJudgeResult 中使用maxResult = valuemaxResult = intJudgeResult,这没有什么区别您不想在intJudgeResult 中使用_maxResult,使用_maxResult 将通过逻辑测试您放入 maxResult 的设置器。理想情况下,_maxResult 只能由来自 maxResult 属性的 getter 和 setter 访问
        • 什么_maxResult??看看你的代码你没有在某处声明你的意思是_maxresult吗?
        • @Puddler Kob_24 是对的,StackOverflowException 发生在这一行:intJudgeResult = value;,它应该是_intJudgeResult = value;_maxResult_maxresult 也有大小写问题。
        【解决方案5】:

        这样可以解决问题:

            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; }
        

        【讨论】:

          猜你喜欢
          • 2016-11-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-03
          相关资源
          最近更新 更多