繁体   English   中英

如何定义属性

[英]How to define properties

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

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

而一些开发人员使用这个:

public int SomeVar
        {
            get;
            set;
        }

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

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

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

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

这取决于...

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

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

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

public int SomeVar
    {
        get;
        private set;
    }

方法1

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

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


方法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; }
}

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

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; }
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM