首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该使用set一次变量吗?

我应该使用set一次变量吗?
EN

Stack Overflow用户
提问于 2009-07-03 13:10:34
回答 8查看 5.5K关注 0票数 4

这闻起来了吗?

我有几个属性你只能设置一次。它们可以在对象存在期间随时设置,不能撤消。

我就这样实施了。

代码语言:javascript
复制
    private FooThingy _foo;
    public FooThingy Foo
    {
        set { if (null == _foo) _foo = value; }
        get { return _foo; }
    }

但我不喜欢。我觉得我错过了什么。我有过吗?

编辑:为什么构造函数中没有它。

我无法深入到细节,但设置这一结果在<**bad analogy**>熔化蜡像<**/bad analogy**>.我不希望我的构造函数创建已经融化的对象。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-07-03 13:15:16

set --一次性属性违反了最小意外属性原则--调用方期望当属性可以设置一次时,可以再次设置属性。(当然,除了范围和兼容性检查之外-但是它们被绑定到特定的值或值组合中)。

在构造函数中初始化它们。

或者,如果它们需要编写所有构造函数,那么可以使用工厂/构建器类:

代码语言:javascript
复制
ThingieBuilder tb = new ThingieBuilder();
tb.FooThingy = 17.23;   // r/w properties
tb.BarThingy = 42;
tb.UseExtendedThingamagicAdapter = true;
Thingie t = tb.Create();
if (t.Bar==42) // r/o property
  ...

或者,分离配置对象中的设置,这些设置可以在构造过程中替换或传递。

票数 19
EN

Stack Overflow用户

发布于 2009-07-03 13:12:45

我认为,如果将这些值传递给构造函数,并将其公开为只读属性,则调用方将更加清楚。如果不能在构造时设置值,则如果再次设置值,则抛出异常可能是适当的:

代码语言:javascript
复制
private FooThingy _foo;
public FooThingy Foo
{
    set 
    { 
        if (null == _foo) { _foo = value; }
        else  { throw new WhatEverThatFitsException(); }
    }
    get { return _foo; }
}

需要非常清楚的是:I不以任何方式促进set一次性属性的使用;代码示例仅显示我可能使用的方法,如果由于任何原因在对象的构造时不能使用该值。尽管如此,在我参与的任何项目中,我从未遇到过这种情况。

票数 11
EN

Stack Overflow用户

发布于 2009-07-03 13:12:53

我建议把它们建在建筑上,这样就可以使设置者私人化。这似乎是一种更明智的方式。

如果你要这样做,抛出某种异常。至少让开发人员知道您没有设置他们的值,而不是默默地忽略它。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1079292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档