有没有办法让readonly(不仅仅是私有)自动属性?

Sim*_*mon 10 c# readonly automatic-properties

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

private MyType myProperty;
public MyType MyProperty
{
    get { return myPropertyField; }
}
Run Code Online (Sandbox Code Playgroud)

使用此代码:

public MyType MyProperty { get; private set; }
Run Code Online (Sandbox Code Playgroud)

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

private readonly MyType myProperty;
public MyType MyProperty
{
    get { return myPropertyField; }
}
Run Code Online (Sandbox Code Playgroud)

有类似的东西?

Eri*_*ert 10

实际上,目前没有办法做到这一点.

我们意识到在C#3中我们产生了一些哲学上的矛盾.LINQ的设计沉浸在传统的不可变函数式编程中 - 执行被推迟,查询由不可变monad表示,表达式树是不可变的,等等.

然而,与此同时,对象初始化器,集合初始化器和自动道具都鼓励传统的基于可变组件的编程风格.看起来我们正朝两个方向努力 - 这表明了C#的本质; 它是一种实用的编程语言,支持许多不同的编程风格.

但是,由于我们都是不可改变的编程风格的忠实粉丝,并且因为我们相信这种风格将使得在未来无处不在的多核架构中更容易确保大规模多线程应用程序的正确性会带来好处,我们肯定会感兴趣找出一些方法来驯服我们引入的可变性.只读autoprops是一种明显的方法; 一小步,但一个很好的一步.

总而言之,我们还没有发布C#4,并且还没有宣布之后会有任何新的语言功能.你应该把我所有关于未宣布产品的假设特征的思考都视为"仅用于娱乐目的"的推测,而不是承诺或公告.


Mar*_*ann 7

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


Jon*_*eet 5

不,不幸的是没有.我非常喜欢这个功能,它看起来像这样:

public readonly string Name { get; }
Run Code Online (Sandbox Code Playgroud)

或者(有点奇怪)

public readonly string Name { get; readonly set; }
Run Code Online (Sandbox Code Playgroud)

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

private readonly string <>_Name;

public string Name { get { return <>_Name; } }
Run Code Online (Sandbox Code Playgroud)

扭曲是允许setter调用 - 但仅限于构造函数.此类调用将直接转换为支持字段的分配.

亲爱的,我非常喜欢这样的功能.也许对于C#5 ......

  • 我见过人们在别处要求支持只能从构造函数调用的方法,但是可以修改只读变量.也许制定者可能就是这种特征.我不确定你在C#中称它们为什么 - 托管的C++'initonly'关键字实际上比C#的'readonly'关键字更具描述性. (2认同)