【发布时间】:2013-12-17 17:23:12
【问题描述】:
我经常发现自己想做一些类似的事情:
Form form = new Form();
form.ClientSize.Width = 500;
当然编译器现在会抱怨这段代码无效,因为 ClientSize 是一个属性,而不是一个变量。
我们可以通过设置整个 ClientSize 来解决这个问题:
form.ClientSize = new Size(500, ClientSize.Height);
或者,一般来说:
Size s = form.ClientSize;
s.Width = 500;
form.ClientSize = s; //only necessary if s is a value-type. (Right?)
但这一切看起来都是不必要的和混淆的。为什么编译器不能为我做这个?当然,我问的是一般情况,可能涉及更深层次的属性,而不仅仅是上面的平凡示例
基本上,我在问为什么没有语法糖来将form.ClientSize.Width = 500 行翻译成上面的代码。这仅仅是一个尚未实现的功能吗,是为了避免堆叠来自不同 getter 和 setter 的副作用,在未定义其中一个 setter 时防止混淆,还是有完全不同的原因这不存在?
【问题讨论】:
-
@AndyT 我不太明白。你是说在这种特殊情况下标准库是邪恶的(因为 Size 是一个结构,而且绝对是可变的)?
-
@JSQuareD 整件事并不邪恶。这种特殊的类型是,是的。
-
@JSQuareD:有些人想假装 .NET 宇宙中的一切都是一个对象,并将任何行为不一样的东西视为邪恶。暴露场结构只是用胶带粘在一起的一堆变量,而不是一个对象。如果一个人想要是一堆用胶带粘在一起的变量,我认为最好使用暴露场结构(并将其视为一堆用胶带粘在一起的变量)比使用更不方便的数据类型并假装它是一个假装是一堆粘在一起的变量的对象。
-
@JSQuareD:顺便说一下,.NET 中的 any 结构类型只是一堆粘在一起的字段,但结构可以尝试表现得更像对象。可变结构不能很好地表现得像对象,而试图表现得像对象的可变结构通常是有问题的,但这意味着将是可变的结构通常不应该' t 假装是对象。如果一个结构不打算伪装成一个对象,那么公开(可变)公共字段是让这种缺乏伪装清晰的好方法。
标签: c# properties language-design