为什么希望在c#中使用所有属性而不是公共实例变量?
我知道房产有一些好处,但是如果你认为你不需要房产,那么把它公开有什么坏处呢为什么希望在c#中使用所有属性而不是公共实例变量?,c#,properties,field,class-design,C#,Properties,Field,Class Design,我知道房产有一些好处,但是如果你认为你不需要房产,那么把它公开有什么坏处呢 人们说,如果以后再尝试将公共字段更改为属性,将破坏代码,但根据我的经验,将其更改为属性不会破坏任何东西。我认为人们的意思是它破坏了ABI(二进制)兼容性,而不是API(源代码)兼容性 虽然语法相同,但在幕后,对属性的访问和对成员变量的访问是不同的 这就是说,如果您的变量/属性不是从您自己不编译的程序集中使用的,那么更改它是无害的。但是,如果它是公共接口的一部分,那么最好将其设置为属性,这样将来您就不会后悔了。如果该属性只
人们说,如果以后再尝试将公共字段更改为属性,将破坏代码,但根据我的经验,将其更改为属性不会破坏任何东西。我认为人们的意思是它破坏了ABI(二进制)兼容性,而不是API(源代码)兼容性 虽然语法相同,但在幕后,对属性的访问和对成员变量的访问是不同的
这就是说,如果您的变量/属性不是从您自己不编译的程序集中使用的,那么更改它是无害的。但是,如果它是公共接口的一部分,那么最好将其设置为属性,这样将来您就不会后悔了。如果该属性只是字段上的包装器,那么我同意您的看法。 《编写恐怖代码》的家伙们似乎有着我们相同的观点,我发现他们使用的受惊图标非常有趣:) 一个简单的程序 这里我添加了两个属性和一个变量。我们可以根据自己的决定使用属性。但我更喜欢使用属性,因为它有助于实现一些业务验证,并且可以从调用方隐藏业务逻辑
class Program
{
static void Main(string[] args)
{
Human h = new Human();
h.FirstName = "Test";
h.LastName = "User";
Console.WriteLine(h.FullName);
Console.Read();
}
}
class Human
{
public string FullName { get { return FirstName + " " + LastName; } }
public string FirstName;//{ get; set; }
public string LastName;//{ get; set; }
}
它是关于维护二进制和源代码兼容性的。在将来的某个时候,您可能会决定使赋值逻辑更加复杂,并将字段更改为属性。这就是问题出现的地方
out
和ref
参数。属性不能。这将产生不可编译的代码显示一些代码示例!属性为您提供了对解析到类中的数据的更多控制,您不希望任何旧数据位未验证到类中并引发异常。如果您需要在设置字段之前对其进行验证,会发生什么情况?或者,如果希望在字段更改时触发事件,会发生什么情况?在一个字段中,这两种操作都不容易完成。使用属性并没有真正的性能损失,因为它是自动实现的,小的属性将被抖动内联。属性也用于数据绑定,所以你不需要手动更新你的GUI。对MVC来说很好。如果换了一处房产,可能会导致。(我是属性的粉丝)它们有什么不同?@Killercam:对属性的访问被编译为方法调用。@Killercam:要读取
T
类型的属性Foo
,编译器调用方法T get\u Foo()
,并调用void set\u Foo(T value)
。