关于C#:为什么不自动合成属性

Why don't properties get automatically synthesized

也许这是个愚蠢的问题。每次我做一个@property,我都要做一个@synthesize。但这毫无意义,您对@property(whatever) Type* property唯一能做的就是在实现文件中执行@synthesize property。为什么两者都需要?为什么编译器不自动生成getter/setter方法而不需要我编写@synthesize property


在当前的生产编译器中,缺省情况(没有@synthesize的情况)是什么都不做,然后在没有提供实现时发出警告。

在最新版本的llvm 2.0编译器中,@synthesize是自动的。

自己实现setter/getter时不需要@dynamic。在运行时动态提供实现时使用@dynamic。也就是说,如果不提供-foo-setFoo:实现,@dynamic foo;@property foo;组合将导致编译器不发出警告。

请注意,您也可以使用@synthesize propertyName = instanceVariableName;将特定的、不同名称的实例变量用作后备存储。

接口中的@property非常适合getter/setter方法声明。它还包含更多的元数据(保留、分配等),编译器在@synthesize期间使用这些元数据。

和往常一样,atomic属性对线程安全没有真正的帮助。


它只是历史上的,所以当前的编译器需要这样做。在Xcode4中,不再需要那些@synthesis(根据WWDC视频,希望我不会违反这里的NDA)。


不是唯一的选择。也可以使用@dynamic property


从xcode 4.4开始,这就是现在发生的事情。合成不再是明确要求的。


@合成不是唯一的选择;还有@dynamic,这意味着您将自己实现这些方法。[修订;请参阅bbum的答案了解更多详细信息。]