如何定义属性

时间:2010-10-11 13:17:30

标签: c# properties

我注意到一些开发人员将此语法用于属性:

private int someVar;
public int SomeVar
        {
            get { return someVar; }
            set { someVar= value; }
        }

虽然有些开发人员使用它:

public int SomeVar
        {
            get;
            set;
        }

我猜两个人的表现都是一样的。为了可读性,可重用性以及您可能知道的其他因素,哪一个更好,并被视为在社区内使用的方式。

7 个答案:

答案 0 :(得分:5)

如果您在访问或更改属性时不打算进行任何验证或其他任何操作,请使用auto属性(您的第二个示例)。如果您需要验证您的setter,或在某人获取或设置该值或某种性质时调用方法,请使用您的第一个示例。如果您不需要两者,则auto属性只会阻止您同时拥有属性和支持字段。

答案 1 :(得分:1)

更高版本更具可读性。并避免“someVar”或“SomeVar”的错误

答案 2 :(得分:1)

它归结为它时真的是一样的。对于自动实现的属性,编译器会为您创建字段。如果您不需要字段,因为它是标准的getter或setter,那么大多数人都是自动实现的属性。如果您需要属性中的逻辑而不是需要字段。

答案 3 :(得分:1)

这取决于......

如果你所做的只是设置和回读字段的值,那么第二种方法是首选的,因为它被认为更具可读性。这种机制是在C#3.0中引入的。

如果您的getter需要对值进行一些验证,或者您的setter需要触发PropertyChanged事件以便UI可以更新,那么第一种方法是必需的。

答案 4 :(得分:1)

正如其他人所说,后者称为自动属性,可在编译时自动生成字段。还需要注意的一点是,与你所拥有的完全相同的是

public int SomeVar
    {
        get;
        private set;
    }

答案 5 :(得分:0)

方法1

private int someVar;
public int SomeVar
    {
        get { return someVar; }
        set { someVar= value; }
    }

这种方法通常不是首选方法,因为某些语言(如VB.NET)不区分大小写。因此,someVarSomeVarSOMEVARsomevar以及大写和小写的所有可能组合,您可以认为对编译器来说意味着相同,这可能是产生错误。


方法2

public int SomeVar{get; set;}

此方法称为自动属性实现,它在阴影中创建一个私有变量,用于存储和检索传递给属性的数据。

在VB.NET中,为每个自动实现的属性创建的变量的名称与前缀为下划线(_)的属性相同。因此,名为SomeProperty的属性将具有名为_SomeProperty的对应私有变量。

这可以在您的VB.NET代码中通过创建任何自动实现的属性,然后创建一个与前缀为下划线的自动实现属性同名的变量来演示。

但是,在C#中,如果您有自动实现的属性,则会使用CompilerGenerated属性修饰的变量用于该属性。因此,您可以使用自动实现的属性和与属性同名但在不同大小写中的变量(,如方法1 中所示)。


<强>结论
通常优选尽可能使用自动实现的属性。如果需要在将属性分配给它的相应变量之前执行某些验证,建议使用name作为属性值存储的变量,并使用下划线前缀,如下所示。

private int _SomeVar;
public int SomeVar
{
    get { return _SomeVar;}
    set { _SomeVar = value > 0 ? value : 0; }
}

答案 6 :(得分:-1)

定义属性的基本和最佳方法是这样的

private int _student_rollnumber;
private string _student_name;
public int Student_RollNumber
{
 get { return _student_rollnumber; }
 set { _student_rollnumber = value; }
}
public string Student_Name
{
 get { return _student_name; }
 set { _student_name = value; }
 }