C# 当 getter 已经实现时,对象的 setter 的目的是什么?
C# What is the purpose of a setter for an object when a getter is already implemented?
如果有一个class里面有一个getter的对象,当getterreturns这个对象你可以在它自己的[=之外修改这个对象28=] 容器,稍后您再次使用 getter 读取对象时将反映此更改;因此,当 getter 让我也可以读取和修改对象时,我看不到为对象设置 setter 的目标。
示例:
您有一个名为 CashRegister 的 class 并且此 class 有一个名为队列的对象,如果您通过 CashRegister 的 getter 读取队列,您可以从 MainClass 修改队列并在下次调用CashRegister 的 getter 之前在 MainClass 中所做的修改将会出现。顺便说一句 CLI.PrintAndJump() 打印队列的内容。
class MainClass
{
static void Main(string[] args)
{
Queue<int> tmpQueue, tmpQueue2;
CashRegister aCashRegister = new CashRegister();
tmpQueue = aCashRegister.GetCoinValues();
CLI.PrintAndJump(tmpQueue);
tmpQueue.Enqueue(10);
tmpQueue2 = aCashRegister.GetCoinValues();
CLI.PrintAndJump(tmpQueue2);
}
}
class CashRegister
{
Queue<int> coinValues = new Queue<int>(1);
public Queue<int> GetCoinValues()
{
return (coinValues);
}
}
输出:
1
1, 10
简而言之,如果你需要修改对象队列,你不需要为它设置一个setter(这种方法是一种好的做法吗?),但是如果我想要对象怎么办保持不变?
谢谢。
首先,这是 C#,而不是 Java。在 C# 中,我们不编写 getter 和 setters;我们改用属性。因此,C# 中的 GetXyz()
方法通常是 而不是 getter,并且它们很少与 SetXyz()
方法配对。例如,想想 ICollection.GetLength()
。一旦我们确定了这一点,让我们继续。
读写属性主要用于不可变值,例如基元。我希望您明白,您不能获取例如 int
,更改其值,并期望包含对象所持有的值也发生变化。你必须把它放回去。为此,您需要一个可写的 属性。但是你已经预料到了,因为在你的问题中你在谈论对象。
基元不是唯一不能修改的实体;存在大量行为相同的不可变 struct
和 class
。如果 属性 returns 给你一个对象,它根本不提供任何你可以用来改变它的状态的方法,你唯一能做的就是创建那个对象的一个不同的实例,并把它返回包含对象,为此您当然需要一个可写的 属性。
因此,可写属性是写回不可变实体所必需的。
说到可变对象,你是对的,读写没有多大意义属性,因为一旦你获得了对可变对象的引用,你就可以将它变异为你的心满意足,无需 "set" 返回。出于这个原因,您很少会看到可变的 setter。但它有时会发生。 Peter Duniho 在他的回答中举了一个例子。 (这样做主要是出于 performance/convenience 原因,在这些情况下隐含的协议是包含对象不拥有被设置到其中的对象的所有权。)
在 C# 的上下文中,我们通常谈论与 属性 相关的 "setter" 和 "getter" 方法,因此您的代码示例不包含这有点奇怪任何属性。但是,让我们暂时忽略它,并假设您可能有相应的 SetCoinValues()
方法。
如果您想替换 整个 Queue<int>
对象,则采用这种方法。修改 Queue<int>
对象本身和 用 替换 Queue<int>
对象是有区别的,你只能使用 getter 方法全新的,需要 setter 方法。
人们可能想要这样做的原因各不相同。这取决于具体情况。而且我认为人们不太可能想要替换队列对象,而不是说一些其他集合类型(如数组或列表)或集合以外的其他一些复杂类型。但它仍然可能发生。
用作 属性 值或非 属性 场景的复杂类型示例可能同时具有 getter 和 setter 方法, 包括 System.Windows.Media.Pen.DashStyle
and System.Diagnostics.Process.StartInfo
。 DashStyle
对象本身甚至具有设置和获取复杂值的属性,包括 Dashes
属性,它是 Double
值的集合。
我提到这些是为了强调这实际上 根本 与可变与不可变无关。 DashStyle
和 ProcessStartInfo
都是可变类型,但是除了 getter.[=23= 之外,我们仍然有引用这些类型的对象的属性,并且有 setter 方法]
可变性问题(这似乎是 的重点)是一个转移注意力的问题,只会分散您对实际发生的事情的注意力。真正的要点是,即使是可变的、复杂的类型,有时您也希望能够替换整个对象,而不是修改当前持有的对象。在这些情况下,您需要一个 setter 方法,以便您可以更改 属性 的实际引用,而不是修改 属性 引用的对象。
如果有一个class里面有一个getter的对象,当getterreturns这个对象你可以在它自己的[=之外修改这个对象28=] 容器,稍后您再次使用 getter 读取对象时将反映此更改;因此,当 getter 让我也可以读取和修改对象时,我看不到为对象设置 setter 的目标。
示例: 您有一个名为 CashRegister 的 class 并且此 class 有一个名为队列的对象,如果您通过 CashRegister 的 getter 读取队列,您可以从 MainClass 修改队列并在下次调用CashRegister 的 getter 之前在 MainClass 中所做的修改将会出现。顺便说一句 CLI.PrintAndJump() 打印队列的内容。
class MainClass
{
static void Main(string[] args)
{
Queue<int> tmpQueue, tmpQueue2;
CashRegister aCashRegister = new CashRegister();
tmpQueue = aCashRegister.GetCoinValues();
CLI.PrintAndJump(tmpQueue);
tmpQueue.Enqueue(10);
tmpQueue2 = aCashRegister.GetCoinValues();
CLI.PrintAndJump(tmpQueue2);
}
}
class CashRegister
{
Queue<int> coinValues = new Queue<int>(1);
public Queue<int> GetCoinValues()
{
return (coinValues);
}
}
输出:
1
1, 10
简而言之,如果你需要修改对象队列,你不需要为它设置一个setter(这种方法是一种好的做法吗?),但是如果我想要对象怎么办保持不变?
谢谢。
首先,这是 C#,而不是 Java。在 C# 中,我们不编写 getter 和 setters;我们改用属性。因此,C# 中的 GetXyz()
方法通常是 而不是 getter,并且它们很少与 SetXyz()
方法配对。例如,想想 ICollection.GetLength()
。一旦我们确定了这一点,让我们继续。
读写属性主要用于不可变值,例如基元。我希望您明白,您不能获取例如 int
,更改其值,并期望包含对象所持有的值也发生变化。你必须把它放回去。为此,您需要一个可写的 属性。但是你已经预料到了,因为在你的问题中你在谈论对象。
基元不是唯一不能修改的实体;存在大量行为相同的不可变 struct
和 class
。如果 属性 returns 给你一个对象,它根本不提供任何你可以用来改变它的状态的方法,你唯一能做的就是创建那个对象的一个不同的实例,并把它返回包含对象,为此您当然需要一个可写的 属性。
因此,可写属性是写回不可变实体所必需的。
说到可变对象,你是对的,读写没有多大意义属性,因为一旦你获得了对可变对象的引用,你就可以将它变异为你的心满意足,无需 "set" 返回。出于这个原因,您很少会看到可变的 setter。但它有时会发生。 Peter Duniho 在他的回答中举了一个例子。 (这样做主要是出于 performance/convenience 原因,在这些情况下隐含的协议是包含对象不拥有被设置到其中的对象的所有权。)
在 C# 的上下文中,我们通常谈论与 属性 相关的 "setter" 和 "getter" 方法,因此您的代码示例不包含这有点奇怪任何属性。但是,让我们暂时忽略它,并假设您可能有相应的 SetCoinValues()
方法。
如果您想替换 整个 Queue<int>
对象,则采用这种方法。修改 Queue<int>
对象本身和 用 替换 Queue<int>
对象是有区别的,你只能使用 getter 方法全新的,需要 setter 方法。
人们可能想要这样做的原因各不相同。这取决于具体情况。而且我认为人们不太可能想要替换队列对象,而不是说一些其他集合类型(如数组或列表)或集合以外的其他一些复杂类型。但它仍然可能发生。
用作 属性 值或非 属性 场景的复杂类型示例可能同时具有 getter 和 setter 方法, 包括 System.Windows.Media.Pen.DashStyle
and System.Diagnostics.Process.StartInfo
。 DashStyle
对象本身甚至具有设置和获取复杂值的属性,包括 Dashes
属性,它是 Double
值的集合。
我提到这些是为了强调这实际上 根本 与可变与不可变无关。 DashStyle
和 ProcessStartInfo
都是可变类型,但是除了 getter.[=23= 之外,我们仍然有引用这些类型的对象的属性,并且有 setter 方法]
可变性问题(这似乎是