我意识到它似乎是C#中字段和属性之间有什么区别的重复?但我的问题略有不同(从我的观点来看):
一旦我知道了
是否有任何区别(风格/未来发展除外),如设置属性时的某种控制类型?
是否有任何额外的区别:
public string MyString { get; set; }
Run Code Online (Sandbox Code Playgroud)
和
public string myString;
Run Code Online (Sandbox Code Playgroud)
(我知道,第一个版本需要C#3.0或更高版本,并且编译器会创建私有字段.)
我看到很多C#类的示例代码执行此操作:
public class Point {
public int x { get; set; }
public int y { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
或者,在旧代码中,具有显式私有支持值并且没有新的自动实现属性:
public class Point {
private int _x;
private int _y;
public int x {
get { return _x; }
set { _x = value; }
}
public int y {
get { return _y; }
set { _y = value; }
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么.在执行上述操作与仅将这些成员设为公共字段之间是否有任何功能差异,如下所示?
public class Point {
public int x;
public int y;
}
Run Code Online (Sandbox Code Playgroud)
为了清楚起见,当您需要对基础数据进行一些翻译时,我理解了getter和setter的价值.但是,如果你只是传递价值观,那似乎是不必要的冗长.
我对C#很新,我认为属性是一件很棒的事情.事实上,如此精彩,我看不到使用字段的任何真正优势.即使对于私人领域,性能提供的灵活性和模块性似乎最多可以避免严重的麻烦,最糟糕的是根本没有效果.
我可以在字段中看到的唯一优势是您可以内联初始化它们.但是大多数时候,你想在构造函数中初始化它们.如果您不使用内联初始化,是否有任何理由不使用属性?
编辑:有些人提出需要使用字段备份属性(显式或自动).让我们澄清一下我的问题:除了备份属性之外,有没有理由使用字段?也就是说,有没有比这SomeType someField;更好的时间了SomeType SomeProperty { get; set; }?
编辑2:DanM,Skurmedel和Seth都提供了非常有用的答案.我已经接受了DanM,因为它是最完整的,但如果有人将他们的回答总结为一个答案,我会很乐意接受它.