Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带或不带支持字段的自动属性-首选项?_C#_Automatic Properties_Backing Field - Fatal编程技术网

C# 带或不带支持字段的自动属性-首选项?

C# 带或不带支持字段的自动属性-首选项?,c#,automatic-properties,backing-field,C#,Automatic Properties,Backing Field,我知道,当使用自动属性时,编译器会在屏幕后面创建自己的备份字段。然而,在我阅读学习的许多程序中,我看到人们明确地写 private int _backingField; public int Property { get { return _backingField; } } 上面和下面的区别是什么 public int Property { get; private set; } 我知道,当getter或setter中确实存在副作用时,使用该属性是显而易见的,但通常情况并非如此。另外,我

我知道,当使用自动属性时,编译器会在屏幕后面创建自己的备份字段。然而,在我阅读学习的许多程序中,我看到人们明确地写

private int _backingField;

public int Property { get { return _backingField; } }
上面和下面的区别是什么

public int Property { get; private set; }
我知道,当getter或setter中确实存在副作用时,使用该属性是显而易见的,但通常情况并非如此。另外,我知道在结构的情况下必须显式使用backing字段,不能通过属性访问其成员

我所能找到的唯一区别是调用值的方式在定义它的类中是不同的。那么,它是简单的首选项,还是通过其属性或直接访问字段来调用一个值有更多的功能?
简单约定?

这两个代码段之间没有太大区别——例如,您不能通过引用传递属性,但这很少是一个问题。但是,如果希望字段为只读,请执行以下操作:

private readonly int _backingField;    
public int Property { get { return _backingField; } }
那就不一样了。我上面写的代码防止在类中的其他地方更改值,这表明这实际上是不可变的。我真的希望能够声明一个只读字段,该字段具有只读自动实现属性,只能在构造函数中设置,但目前还不可用

顺便说一下,这相当令人困惑:

另外,我知道在结构的情况下必须显式使用backing字段,不能通过属性访问其成员

你什么意思?您完全可以在结构中使用属性。您是否在谈论可变结构的支持字段,即:

foo.someField.X = 10;


??如果是这样的话,我通常通过使我的结构一开始是不可变的来避免这个问题:)

以XNA的Vector2为例,如果我说公共Vector2 TheVector{get;set;},我就不能调用Vector.X=10;相反,我必须使用实际字段。关于通过值/引用传递的信息。(你是否有一些阅读材料澄清了c#的按值/引用传递,作为旁注?)另外,如果我的两个例子之间真的没有区别,为什么这么多人仍然显式地创建一个支持字段(没有真正的目的)?@Taelia:对,这是可变结构的情况——我通常避免这种情况。这是因为属性返回值的副本。我不会试图为其他人的行为给出理由。@Taelia Auto属性是在C#3.0中引入的。这可以解释为什么有些开发人员使用自动属性,而有些人不使用。因为一些使用早期版本的开发人员可能更喜欢“旧方法”。好的,谢谢你们。我经常看到这种情况发生,这让我怀疑我没有创建显式字段是否做了正确的事情。如果没有区别,那么我将继续编写没有它们的代码。
foo.SomeProperty.X = 10;