在CLR via CSharp第10章“属性”中,Jeff Richter写道:
属性方法可能需要很长时间才能执行;字段访问总是立即完成。使用属性的常见原因是执行线程同步,这可能会永远阻塞线程,因此,如果需要线程同步,则不应使用属性。在这种情况下,最好使用方法。此外,如果可以远程访问您的类(例如,您的类派生自System.MarshalByRefObject),则调用属性方法将非常缓慢,因此,在MarshalByRefObject场景中更喜欢使用方法而不是属性。在我看来,从MarshalByRefObject派生的类永远不应使用属性。
即使属性仅定义为返回私有字段,这也是这种情况吗?为什么在线程同步中首选方法?以及为什么在MarshalByRefObject方案中首选方法?
为了澄清我的问题:
Jeff似乎在做一个全面的陈述,即属性不可取,而在这两种情况下方法更好。正如Joe White所指出的那样,属性可以有任意代码。但是方法也可以运行相同的任意代码。这就是我遇到困难的部分。使用方法在同步或编排方面是否真的比属性有优势(假设使用相同的代码),或者他只是对语言约定有问题?
属性方法可能需要很长时间才能执行;字段访问总是立即完成。使用属性的常见原因是执行线程同步,这可能会永远阻塞线程,因此,如果需要线程同步,则不应使用属性。在这种情况下,最好使用方法。此外,如果可以远程访问您的类(例如,您的类派生自System.MarshalByRefObject),则调用属性方法将非常缓慢,因此,在MarshalByRefObject场景中更喜欢使用方法而不是属性。在我看来,从MarshalByRefObject派生的类永远不应使用属性。
即使属性仅定义为返回私有字段,这也是这种情况吗?为什么在线程同步中首选方法?以及为什么在MarshalByRefObject方案中首选方法?
为了澄清我的问题:
Jeff似乎在做一个全面的陈述,即属性不可取,而在这两种情况下方法更好。正如Joe White所指出的那样,属性可以有任意代码。但是方法也可以运行相同的任意代码。这就是我遇到困难的部分。使用方法在同步或编排方面是否真的比属性有优势(假设使用相同的代码),或者他只是对语言约定有问题?