C# 公共属性而不是私有字段

C# 公共属性而不是私有字段,c#,C#,首先,为了澄清和避免不必要的重复标记,这个问题不是的重复,也不是我已经搜索过的其他问题的重复。为什么?他们都谈论带有经典C#“属性”的公共字段或私有字段 我的问题是为什么我要写这样的东西(公共属性) 当我可以写(私有字段< /强>没有任何属性)(只是经典的C++风格的写东西的方式)< /P> 我挠头,读了很多资料,答案和问题,但没有人回答这个问题。他们都在谈论相对于公共领域的优势(我不是在问),或者新的自动属性相对于旧属性的优势(我也不是在问) 我猜我的问题是为什么C++不使用在java或C++

首先,为了澄清和避免不必要的重复标记,这个问题不是的重复,也不是我已经搜索过的其他问题的重复。为什么?他们都谈论带有经典C#“属性”的公共字段或私有字段

我的问题是为什么我要写这样的东西(公共属性

当我可以写(<强>私有字段< /强>没有任何属性)(只是经典的C++风格的写东西的方式)< /P> 我挠头,读了很多资料,答案和问题,但没有人回答这个问题。他们都在谈论相对于公共领域的优势(我不是在问),或者新的自动属性相对于旧属性的优势(我也不是在问)


我猜我的问题是为什么C++不使用在java或C++中工作得很好的相同的写作方式。我看不出有什么好处。我非常感谢有人教我这一优势,因为afaik不是其他地方写的。(甚至在我的C#books中也没有)

据我的理解,您所指的公共属性只是语法上的糖衣,包装了您上面描述的模式

我想这取决于可读性和平台标准。虽然你谈论的方式没有错,但我们也需要考虑维修性。对于另一个.Net开发人员来说,这种模式不适合他们所习惯的模式,可能会造成混乱


还有一个表面的原因,那就是需要编写更多的代码。特别是当你有DTO之类的东西时。

c#中的属性被进一步封装,并最终翻译成私有字段的中间语言和相应的Get Set方法,因此你不必为此烦恼。

自动访问器正是这方面的语法糖。生成的代码有一个支持字段和get/set方法。字段没有访问器,而属性有


Public/private是关于封装/安全性的,即谁应该能够访问您的信息。

您呈现信息的方式(编写
get
set
方法)很好,但您有两种方法-一种用于设置字段值,另一种用于获取此值。使用属性对我来说更自然,因为您将
set
get
方法“封装”在一个名称下,并以这种方式访问它更好(在我看来)。

使用
公共int-AValue{get;set;}
而不是一个私有字段和一对
getAValue
setAValue
函数,这就是C#中的工作方式。从“代码在运行时所做的事情”的角度来看,这两个属性与“自动属性”(由编译器负责生成私有备份字段的属性类型)几乎相同,它可以编译成与您编写的代码非常相似的代码(参见示例)

在您的问题上下文中(为什么使用属性而不是字段和get/set方法对)的主要“优势”是可预测性和可理解性。使用您的代码的任何人都希望看到属性,而不是私有字段/get/set实现,因此您的代码将更容易被他们理解。看到它以不同的方式实现会让他们质疑为什么,假设这是有原因的,因此在理解代码时会减慢他们的速度。

C#的getter和setter是语法糖,它去除了嘈杂的方法名(
SetValue
GetValue
而不是
Value
)并提高代码的可读性

在使用代码时可读性要好得多

// Without properties
var myClass = new MyClass();
myClass.SetAValue(aValue);
myClass.SetBValue(bValue);

//And with properties
var myClass = new MyClass 
{
    AValue = aValue,
    BValue = bValue
}
因为它只是语法上的糖分——每个开发人员/团队都可以自由地不使用它 它。

一些团队有一些“规则”,即属性应该只用于获取/设置值,而不使用getter/setter中的任何“重”逻辑。应该使用方法来设置或获取执行一些“繁重”操作的值。

我认为C#properties很大程度上受VB属性定义的影响,其中包括带有支持字段(例如:)的accessor(
Property Get
)和mutator(
Property Let/Set
)。事实上,在C#properties中有一个
value
变量作为支持字段,就像VB中的对应项一样。我建议属性比创建自己的适当方法来完成完全相同的任务更优雅、更直观。编写开发平台的标准代码有助于使其更易于维护。然而,所有这些都只是我的观点。这个问题不可能有普遍正确的答案,因为任何答案都主要基于观点。这使得这个问题偏离主题。简言之,C语言的特性受VB的影响,它是一种语法糖,用来保存键击,避免键入“GETX”和“SETX”,通常像java或C++一样。
class myClass{
private int aValue;
public int getValue{ return aValue;}
public void setValue(int value){ aValue=value;}
// Without properties
var myClass = new MyClass();
myClass.SetAValue(aValue);
myClass.SetBValue(bValue);

//And with properties
var myClass = new MyClass 
{
    AValue = aValue,
    BValue = bValue
}