【问题标题】:How to Declare and use Read/Write Properties如何声明和使用读/写属性
【发布时间】:2014-12-16 20:58:33
【问题描述】:

我刚刚开始学习 C#,并且在对以下代码的特定测试的答案中提到:

Tak 的设置属性丢失或不正确。

代码由2个类组成。

主类 1:

namespace ConsoleApplication6
{
    class Program
    {
        static void Main(string[] args)
        {
            Takis obj = new Takis();

            obj.Val = 23.4;
            Console.WriteLine(obj.Val);
        }
    }
}

第 2 类:

namespace ConsoleApplication6
{
    class Takis
    {
        double val;

        public double Val
        {
            get
            {
                return val;
            }
            set
            {
                val = 3.14;
            }
        }

        public Takis()
        {    
        }
    }
}

在 Visual Studio 中,我得到 不总是以下内容:

'ConsoleApplication6.vshost.exe' (CLR v4.0.30319: ConsoleApplication6.vshost.exe):已加载 'C:\Windows\Microsoft.Net\assembly\GAC_32\System.Data\v4.0_4.0.0.0__b77a5c561934e089\System.Data.dll'。 跳过加载符号。模块经过优化和调试器选项 “只是我的代码”已启用。 'ConsoleApplication6.vshost.exe' (CLR v4.0.30319:ConsoleApplication6.vshost.exe):已加载 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Xml\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.dll'。 跳过加载符号。模块经过优化和调试器选项 “只是我的代码”已启用。线程 0x1610 已退出,代码为 259 (0x103)。线程 0x1638 以代码 0 (0x0) 退出。线程 0x13f4 已退出,代码为 259 (0x103)。 'ConsoleApplication6.vshost.exe' (CLR v4.0.30319: ConsoleApplication6.vshost.exe):已加载 'c:\users\stefanos\documents\visual studio 2013\Projects\ConsoleApplication6\ConsoleApplication6\bin\Debug\ConsoleApplication6.exe'。 已加载符号。线程 0x1480 已退出,代码为 259 (0x103)。 线程 0x1498 已退出,代码为 259 (0x103)。

由于我对 Visual Studio 和 C# 非常陌生,如果有人能告诉我错误或向我解释问题所在,我将不胜感激。

【问题讨论】:

  • set 方法总是将 val 设置为 3.14 - 这显然是错误的
  • 您引用的输出在这里无关紧要。这看起来像是一种典型的行为。
  • 另外,对于设置方法,使用“值”来实际使用分配给设置的任何值。 set { val = value; }

标签: c# properties read-write


【解决方案1】:

属性Valset 始终将属性设置为相同的值。相反,它很可能应该将属性设置为用户输入的值:

set { val = value; }

或者,如果意图是 always 的值是 3.14(即只读),则可以删除 setter,get 将返回该值:

class Takis
{
    public double Val
    {
        get { return 3.14; }
    }

    public Takis()
    {    
    }
}

【讨论】:

  • 首先感谢您抽出时间Rufus。只是一个澄清。如果意图是使值始终为 3.14,那么我在初始帖子中提供的代码是错误的还是不合适的?
  • 两者兼而有之:这是错误的,因为如果用户从不尝试设置它,那么当他们得到它时它将是“0”,并且不合适,因为 1. 你不需要支持字段(@ 987654325@) 和 2. 公开 set 操作意味着您允许用户更改值,但您不允许。
【解决方案2】:

你的 Val 属性中的集合应该是 val = value; value 在 C# 中是关键字,是属性被实例化的值。

【讨论】:

    【解决方案3】:

    您的资产的行为方式与通常情况不同。当我设置一个像 23.4 这样的值时,我希望它会坚持下去。在您的情况下,您的班级并不关心 I 设置了什么。当我设置一些东西时,任何东西,属性都是 3.14。

    您的属性应该设置给定的值(在本例中为 23.4)。您可以使用valuekeyword:

        public double Val
        {
            get
            {
                return val;
            }
    
            set
            {
                val = value;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-07
      • 2023-03-14
      • 2016-03-24
      • 1970-01-01
      • 2011-10-04
      • 2014-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多