【问题标题】:C# How do I know when to make a property both read and write rather than just read-onlyC#我如何知道何时使属性既可读又可写,而不仅仅是只读
【发布时间】:2016-04-27 23:35:28
【问题描述】:

我知道属性中读和写的区别,

我知道您只能从只读属性中读取(仅使用 getter),但是当涉及到 write 关键字(setter)时,我如何知道将其应用于哪些属性?

简单地说,我的问题是 - 当您应用 get 和 set 访问属性时,您会问自己关于您正在编写的属性的什么问题?

我的下一个问题是,如果您不提供对该属性的设置访问权限,它到底是如何定义的?

如果你能帮助我,非常感谢。

【问题讨论】:

  • setter 可以让你用那个属性做什么?如果您希望能够做到这一点,您可以编写 setter:通过赋值设置属性。

标签: c# properties get set


【解决方案1】:

只读属性是由类决定的,类外的任何东西都不能改变。例如,考虑List<string>。它有一个Count 属性。这样做是没有意义的:

var list = new List<string>();
list.Count = 5;

什么设置了只读属性?当项目被添加到列表中或从列表中删除时,它的值会发生变化。这是一个例子,其中一个属性反映了一个类的一些内部状态。另一个例子是StopWatch 类。您不能设置ElapsedMilliseconds 的值。该属性取决于自时钟开始以来经过了多少时间。

这是另一个例子。

public class Price
{
    public decimal Amount {get; private set;}
    public Price(decimal amount)
    {
        if(amount < 0) throw new ArgumentOutOfRangeException("amount", 
            "amount must be greater than zero.");
        Amount = amount;
    }

    public Void Discount(decimal discountAmount)
    {
        if(discountAmount >= amount)
            amount = 0
        else
            amount -= discountAmount;
    }
}

Amount 是只读的。有两种设置Amount的方法。一种是在创建类时,通过将数量传递给构造函数。

var myPrice = new Price(5);

另一种是调用Discount 方法。

myPrice.Discount(3);

在这两种情况下,类都控制Amount 的设置方式,因此您不能将其设置为负数。该类提供了允许更改其状态的方法,但它使更改决定了允许的更改。

在某些情况下,您可能希望一个属性或整个类是不可变的(不可更改),以便在创建类时确定的任何值都不会改变。

【讨论】:

  • 感谢您花时间解释这一点。
  • 我的荣幸。如果是答案,请不要忘记将其标记为答案。,
【解决方案2】:

你对你正在写的属性问自己什么问题 什么时候你的应用 get 和 set 访问它?

简单地说就是您是否要允许您的类的用户在创建类之后更改该特定属性。当他们这样做时会发生什么完全由班级决定。

我的下一个问题是,如果您不提供对该属性的设置访问权限, 到底是怎么定义的?

  1. 可以通过构造函数设置。它可能是一个参数 传递给构造函数,所以你想要一些硬编码的值 可用的。
  2. 有些属性可以延迟实例化。想象一下,您的类上有两个属性,称为 FistName 和 LastName。你有一个 名为 FullName 的最终属性,其定义为:

    结果 = this.FirstName + " " + this.LastName;

希望这能让你开始。如果您想更深入地研究,请查看 [在此处输入链接描述]SOLID1,您可以随时通过 Google 获取有关属性的更多信息。

【讨论】:

  • 您好 TheEdge,谢谢。您提到“您班级的用户”只是想说明我班级的用户到底是谁?协助编写我的代码的工程师或我的应用程序的用户?您还提到“在创建类后更改该特定属性”。我的问题是
  • 在未完成先前评论的情况下意外发送。创建课程后是否意味着我的应用程序上线后?再次感谢。
  • 您的 1234562 的用户 = 任何可以在代码中访问您的课程的人。那是使用您的课程的任何人。由于我不知道该类是否在您与他人共享的程序集中、通用代码、可通过 Web API 访问,因此我无法确定。
  • 创建类之后 = 每当类被实例化或构造时。
猜你喜欢
  • 2016-11-26
  • 2013-08-23
  • 1970-01-01
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 2013-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多