10

自动属性让我替换此代码:

private MyType myProperty;
public MyType MyProperty
{
    get { return myPropertyField; }
}

使用此代码:

public MyType MyProperty { get; private set; }

在这里和那里进行了一些更改-但是有没有办法替换此代码:

private readonly MyType myProperty;
public MyType MyProperty
{
    get { return myPropertyField; }
}

有类似的东西?

4

6 回答 6

10

确实,目前没有办法做到这一点。

我们意识到在 C# 3 中我们产生了一些哲学上的矛盾。LINQ 的设计在很大程度上沉浸在传统的不可变函数式编程风格中——执行被延迟,查询由不可变的单子表示,表达式树是不可变的,等等。

然而同时,对象初始化器、集合初始化器和自动道具都鼓励传统的基于可变组件的编程风格。似乎我们正在向两个方向推进——这表明了 C# 的本质;它是一种实用的编程语言,支持许多不同风格的编程。

但是,由于我们都是不可变编程风格的忠实拥护者,而且我们相信这种风格将带来好处,使在未来无处不在的多核架构中更容易确保大规模多线程应用程序的正确性,我们绝对感兴趣在想办法驯服我们引入的可变性。Readonly autoprops 是一种明显的方法。一小步,但很好。

话虽如此,我们甚至还没有发布 C# 4,也没有宣布之后会有任何新的语言特性。您应该将我对未发布产品的假设功能的所有思考视为“仅用于娱乐目的”的推测,而不是承诺或公告。

于 2009-10-08T14:52:09.093 回答
7

不,但这个想法正在Connect 上进行跟踪

于 2009-10-08T09:40:01.550 回答
5

不,很遗憾没有。我非常喜欢这个功能,它看起来像这样:

public readonly string Name { get; }

或(有点奇怪)

public readonly string Name { get; readonly set; }

这将被转换成类似的东西:

private readonly string <>_Name;

public string Name { get { return <>_Name; } }

不同的是,setter 调用将被允许 - 但仅限于构造函数内。此类调用将直接转换为对支持字段的分配。

我会非常非常喜欢这样的功能。也许对于 C# 5...

于 2009-10-08T09:45:53.503 回答
1

readonly只能应用于领域,所以我相信不会。

你不能只使用:

public readonly MyType MyProperty;

因为它只能从构造函数分配?

于 2009-10-08T09:39:13.360 回答
1

不,你没有办法做到这一点。事实上,我不明白您为什么要获取以前未设置的属性的值。出于显而易见的原因,如果既没有访问器,也没有支持字段,则无法设置该值。set

于 2009-10-08T09:40:35.373 回答
-1

这真是个令人费解的伙伴。

只需将其设为公共只读字段即可。

于 2009-10-08T09:42:54.267 回答