自动属性让我替换此代码:
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; }
}
有类似的东西吗?
答案 0 :(得分:10)
事实上,目前无法做到这一点。
我们意识到在C#3中我们产生了一些哲学上的矛盾。 LINQ的设计沉浸在传统的不可变函数式编程中 - 执行被推迟,查询由不可变monad表示,表达式树是不可变的,等等。
然而,同时对象初始化器,集合初始化器和自动道具都鼓励传统的基于可变组件的编程风格。看起来我们正朝两个方向努力 - 这表明了C#的本质;它是一种实用的编程语言,支持许多不同的编程风格。
然而,由于我们都是不可改变的编程风格的忠实粉丝,并且因为我们相信这种风格将使得在未来无处不在的多核架构中更容易确保大规模多线程应用程序的正确性会带来好处,我们'我非常有兴趣找出一些方法来驯服我们引入的可变性。只读autoprops是一种明显的方法;一小步,但是很好。
大家都说,我们还没有发布C#4,并且还没有宣布之后会有任何新的语言功能。你应该把我所有关于未公布产品的假设特征的思考都视为“仅用于娱乐目的”的推测,而不是作为承诺或公告。
答案 1 :(得分:7)
不,但这个想法是tracked on Connect。
答案 2 :(得分: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 ......
答案 3 :(得分:1)
readonly
只能应用于字段,所以我不相信。
你能不能只使用:
public readonly MyType MyProperty;
因为它只能从构造函数中分配出来吗?
答案 4 :(得分:1)
不,你无法做到。实际上,我不明白你为什么要获取以前未 set 的属性值。出于显而易见的原因,如果既没有set
访问者,也没有支持字段,则不能设置。
答案 5 :(得分:-1)
那真是令人费解的伙伴。
只需将其设为公共只读字段即可。