您的位置:首页 > 编程语言 > C#

同事问到C#中的属性(Property)怎么理解?

2007-11-19 23:27 375 查看
同事问到C#中的属性(Property)怎么理解?我说“属性就是对私有字段进行读取。”事后分析,其实属性还是值得研究的,首先属性是类、结构、接口的命名成员,它提供了通过访问器读、写或者计算私有字段值的灵活机制。举个例子:通过User类来记录用户注册信息。
using System;
class User
{
public string name;
public string sex;
}
class Property
{
static void Main()
{
User zm=new User();
zm.name="无为";
zm.sex="天";
Console.WriteLine("姓名:"+zm.name+"性别:"+zm.sex);
}
}
此时如果用户输入的性别为其他的,比如“猪”,哈哈,是不是一样可以通过编译器了?解决方法是:
using System;
class User
{
public string name;
public string sex;
public void SetSex(string values)
{
if (values=="男"||values=="女")
{
sex=values;
}
else
{
Console.WriteLine("性别只能是男或者女");
}
}
}
class Property
{
static void Main()
{
User zm=new User();
zm.name="无为";
zm.SetSex("天");
Console.WriteLine("姓名:"+zm.name+"性别:"+zm.sex);
}
}
问题解决:但是值得注意的是name、sex还是public属性,依然可以修改,给name、sex设置为public,破坏了类的封装,存在潜在的危险。应该设置为private.这样就需要用到属性的知识去声明,读取这两个字段。代码如下:
using System;
class User
{
private string name;
private string sex;
public void SetName(string values)
{
name=values;
}
public string GetName()
{
return name;
}
public void SetSex(string values)
{
if (values=="男"||values=="女")
{
sex=values;
}
else
{
Console.WriteLine("性别只能为“男”或者“女”");
}
}
public string GetSex()
{
return sex;
}
public string Name
{
get
{
return name;
}
set
{
name=value;//隐含参数
}
}
public string Sex
{
get
{
return sex;
}
set
{
if (value=="男"||value=="女")
{
sex=value;
}
else
{
Console.WriteLine("性别只能为“男”或者“女”");
}
}
}
}
class Property
{
static void Main()
{
User zm=new User();
zm.SetName("无为");
zm.SetSex("男");
Console.WriteLine("姓名:"+zm.GetName()+" 性别:"+zm.GetSex()); //方法调用
zm.Name="WuWei"; //属性调用
zm.Sex="天";
Console.WriteLine("姓名:"+zm.Name+" 性别:"+zm.Sex);
}
}
从运行结果上看,把“无为”改成了“WuWei”,并且zm.Sex="天"没有对性别做修改。
注意:属性(Property)的调用跟类的字段的调用方法一样,赋值用等号。读取跟类的字段的读取方法一样。值得注意的是:private string name; public string Name;这样在C#中没有问题,但是如果在一个工程文件中存在多种语言,比如VB.NET.那么就会出现问题,个人建议把字段名称前面加一个标志符,比如:u_name、U_sex.这样就方便很多。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: