位置:首页 > 软件操作教程 > 编程开发 > C# > 问题详情

C# 定义属性

提问人:刘团圆发布时间:2020-12-07

    属性的定义方式与字段类似,但包含的内容比较多。如前所述,属性比字段复杂,因为它们在修改状态前还可以执行一些额外操作,实际上,它们可能并不修改状态。属性拥有两个类似于函数的块,一个块用于获取属性的值,另一个块用于设置属性的值。

    这两个块也称为访问器,分别用get和set关键字来定义,可以用于控制属性的访问级别。可以忽略其中的一个块来创建只读或只写属性(忽略get块创建只写属性,忽略set块创建只读属性)。当然,这仅适用于外部代码,因为类中的其他代码可以访问这些代码块能访问的数据,还可以在访问器上包含可访问修饰符,例如使get块变成公共的,使set块变成受保护的,至少要包含其中一个块,属性才是有效的(既不能读取也不能修改的属性没有任何用处)。

    属性的基本结构包括标准的可访问修饰符(public、private等),后跟类型名、属性名和get块(或set块,或者get块和set块,其中包含属性处理代码),例如:

public int MylntProp

{

    get

    {

        // Property get code.

    }

    set

    {

        // Property set code.

    }

}

定义中的第一行代码非常类似于定义字段的代码,区别在于行末没有分号,而是一个包含嵌套get和set块的代码块。

getM、须有一个属性类型的返回值,简单属性一般与私有字段相关联,以控制对这个字段的访问,此时get块可以直接返回该字段的值,例如:

// Field used by property.

private int mylnt;

// Property.

public int MylntProp 

{

    get { return mylnt; }

    set { // Property set code. }

}

类外部的代码不能直接访问这个mylnt字段,因为其访问级别是私有的。外部代码必须使用属性来访问该字段。set函数采用类似方式把一个值赋给字段。这里可使用关键字value来表示用户提供的属性值:

// Field used by property.

private int mylnt;

// Property.

public int MylntProp 

{

    get { return mylnt; } 

    set { mylnt = value; }

}

value等于类型与属性相同的一个值,所以如果属性和字段使用相同的类型,就不必考虑数据类型转换了。要为可空整数类型提供一个默认值,可以使用这个由表达式构成的成员函数模式。

private int? mylnt; 

public int? MylntProp 

{

    get { return mylnt;) 

    set { mylnt = value ?? 0; }

}

这个简单属性只是用来阻止对mylnt字段的直接访问。在对操作进行更多控制时,属性的真正作用才能发挥出来。例如,使用下面的代码实现set块:

set

{

    if (value >- 0 && value <= 10) 

        mylnt = value;

}

只有赋给属性的值在0~10之间,才会修改mylnt。此时,要做一个重要的设计选择:如果使用了无效值,该怎么办?有4种选择:

    •什么也不做(如上述代码所示)。

    •给字段赋默认值。

    •继续执行,就像没发生错误一样,但记录下该事件,以备将来分析。

    •抛出异常。

    —般情况下,后两个选择效果较好,选择哪个选项取决于如何使用类,以及给类的用户授予多少控制权。 抛出异常给用户提供的控制权相当大,可以让他们了解发生了什么情况,并做适当的响应。为此可使用System名称空间中的标准异常,例如:

set

{

    if (value >= 0 && value <= 10)

        mylnt = value;

    else

        throw (new ArgumentOutOfRangeException("MylntProp11, value,

                "MylntProp must be assigned a value between 0 and 10."}};

    该异常可在使用属性的代码中通过try...catch...finally逻辑加以处理。

    记录数据(例如记录到文本文件中或Event Log中)比较有效,例如可用在不应出错的产品代码中。它们允许开发人员检查性能,如有必要,还可以调试现有的代码。

    属性可以使用virtual、override和abstract关键字,就像方法一样,但这几个关键字不能用于字段。最后,如上所述,访问器可以有自己的可访问性,例如:

// Field used by property. 

private int mylnt;

// Property. 

public int MylntProp

{

    get { return myint; } 

    protected set { mylnt = value; }

}

    只有类或派生类中的代码才能使用set访问器。

    访问器可以使用的访问修饰符取决于属性的可访问性,访问器的可访问性不能高于它所属的属性,也就是说, 私有属性对它的访问器不能包含任何可访问修饰符,而公共属性可以对其访问器使用所有的可访问修饰符。

    C# 6引入了一个名为“基于表达式的属性”的功能.类似于第6章讨论的基于表达式的方法,这个功能可以把属性的定义减少为一行代码。例如,下面的属性对一个值进行数学计算,可以使用Lambda箭头后跟等式来定义:

// Field used by property. 

private int myDoubledint = 5;

// Property.

public int MyDoubledlntProp => (myDoubledlnt * 2);

继续查找其他问题的答案?

相关视频回答
回复(0)
返回顶部