首页 > 开发 > 综合 > 正文

C#教程第十课:属性

2024-07-21 02:25:27
字体:
来源:转载
供稿:网友

本节课将介绍c#的属性,其目的包括:
1.理解什么是属性

2.如何实现属性

3.创建一个只读属性

4.创建一个只写属性

属性是c#中独具特色的新功能。通过属性来读写类中的域,这具有一定的保护功能。在其它语言中,这是通过实现特定的getter和setter方法来实现的。c#的属性具有保护功能,可以让你就象访问域一样访问属性。要了解属性的用法,我们先来看看如何用传统的方法对域进行封装。

1.清单 10-1. 传统的访问类的域的例子:accessors.cs

using system;
public class propertyholder
{
private int someproperty = 0;
public int getsomeproperty()
{
return someproperty;
}
public void setsomeproperty(int propvalue)
{
someproperty = propvalue;
}
}

public class propertytester
{
public static int main(string[] args)
{
propertyholder prophold = new propertyholder();
prophold.setsomeproperty(5);
console.writeline("property value: {0}", prophold.getsomeproperty());
return 0;
}
}

说明

1.清单 10-1 演示了用传统方法访问类的域的例子。

propertyholder类有个我们感兴趣的域someproperty, propertyholder类带有两个方法:getsomeproperty和setsomeproperty。getsomeproperty方法返回someproperty域的值。setsomeproperty方法设置域someproperty的值。

2.类propertytester使用类propertyholder中的方法来获取someproperty域的值。

main方法中新创建了一个propertyholder对象,之后通过使用setsomeproperty方法,调用prophold对象的setsomeproperty方法,设置其值为5。之后,调用console.writeline方法输出属性值。对prophold对象的getsomeproperty的调用,是用来获取属性值的。它输出"property value: 5"到控制台。

3.这种传统的访问域的信息的方法是很好的,因为它支持面向对象的封装的概念。

如果在对域someproperty的实现中,域的类型从int 类型变为byte类型,上述的方法仍然适用。现在,如果采用属性的话,其实现会做得更为平滑。

2.清单 10-2. 使用属性访问类的域:properties.cs

using system;
public class propertyholder
{
private int someproperty = 0;
public int someproperty
{
get
{
return someproperty;
}
set
{
someproperty = value;
}
}
}

public class propertytester
{
public static int main(string[] args)
{
propertyholder prophold = new propertyholder();
prophold.someproperty = 5;
console.writeline("property value: {0}", prophold.someproperty);
return 0;
}
}

说明

1.清单 10-2 演示了如何创建和使用属性。

propertyholder类中有个"someproperty" 属性的实现。注意:属性名的首字母必须大写,这是属性名"someproperty"和域名"someproperty"的唯一区别。属性有两种访问操作:get和set。get访问操作返回的是someproperty域的值。set访问操作是设置someproperty域的值,其值为"value"的内容。set访问符号后面的"value"是c#中的保留字。通常,在其他场合下使用"value"关键字会出错。。

2.propertytester 类使用propertyholder类中的someproperty属性。

在main方法的第一行中, 创建了propertyholder对象prophold。之后,把prophold对象的 someproperty 域的值设置为5,很简单,就象对域赋值一样,给属性赋值。

3.console.writeline方法输出 prophold对象的someproperty域的值。

这是通过使用prophold对象的someproperty属性来完成的。很简单,就象对域赋值一样,赋值给属性。属性可以设置为只读的,这可以通过在属性的实现中只设一个get访问符号来实现。

3.清单 10-3. 只读属性: readonlyproperty.cs

using system;
public class propertyholder
{
private int someproperty = 0;
public propertyholder(int propval)
{
someproperty = propval;
}
public int someproperty
{
get
{
return someproperty;
}
}
}

public class propertytester
{
public static int main(string[] args)
{
propertyholder prophold = new propertyholder(5);
console.writeline("property value: {0}", prophold.someproperty);
return 0;
}
}

说明

1.清单10-3 演示了如何实现只读属性。

propertyholder类中,someproperty 属性只有一个get访问操作,没有用到set访问操作。propertyholder类中还有个接受整型参数的构造函数。

2.在propertytester类的main方法中,创建了新名为prophold的propertyholder类的对象。

prophold对象在实例化时,调用了带参数的propertyholder构造函数。在本例中,参数值为5,这对prophold 对象的someproperty域的值进行了初始化。

3.因为propertyholder 类的someproperty属性是只读的,所以没有其他的方法来设置someproperty域的值。

如果你插入了"prophold.someproperty = 7"语句到程序清单中,该程序编译将不会通过,因为someproperty是只读属性。在console.writeline 方法中使用someproperty属性时,程序执行正常。这是因为该方法调用了someproperty属性的get访问操作,这是个只读操作。

4.清单 10-4. 只写属性: writeonlyproperty.cs

using system;
public class propertyholder
{
private int someproperty = 0;
public int someproperty
{
set
{
someproperty = value;
console.writeline("someproperty is equal to {0}", someproperty);
}
}
}

public class propertytester
{
public static int main(string[] args)
{
propertyholder prophold = new propertyholder();
prophold.someproperty = 5;
return 0;
}
}

说明

1.清单 10-4 演示了如何创建和使用只写属性。

这一次,在propertyholder类中的someproperty属性中,去掉了get访问操作,而加上了set访问操作。其功能是输出someproperty域的值。

2.在propertytester 类中的main方法中,用缺省的构造函数对propertytester类进行初始化。

之后,使用prophold 对象的someproperty属性,设置该域的值为5。这就调用了prophold 对象的set访问操作, 把someproperty 域的值设置为5,最后,把"someproperty is equal to 5"的信息输出到控制台。

小结
现在,你已经了解了什么是属性,以及属性的使用方法,你也了解了使用属性和使用传统的类的方法之间的区别。属性可以是只读的,也可以是只写的,每种场合下的使用方法,你都有所了解。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表