同事问到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.这样就方便很多。
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.这样就方便很多。
相关文章推荐
- 同事问到C#中的属性(Property)怎么理解?
- c#进阶理解property属性和属性值之惑
- C# 6.0的属性(Property)的语法与初始值
- c#中字段(field)和属性(property)的区别
- 区别C#中的两个属性(Property和Attribute)
- 深入理解JavaBean(2):属性编辑器PropertyEditor
- Python中property属性(特性)的理解
- C#中对属性和字段的理解
- 通过c# 实现自定义属性改变触发自定义事件 ,理解自定义事件及其触发过程
- 1 C#中的两个属性(Property和Attribute) 区别
- .Net/C# 实现真正的只读属性 (ReadOnly Property)
- C#怎么遍历一个对象里面的全部属性?
- c# action<> func<> 这2个委托怎么用和理解
- 从属性(property)的角度来理解.NET中的事件(event)
- JavaScript的继承机制(加我的理解)/原型链/属性查找/hasOwnProperty
- (C#)属性(property)
- 提高C#编程水平的50个要点 之一“总是用属性 (Property) 来代替可访问的数据成员(field)”
- .Net/C# 实现真正的只读属性 (ReadOnly Property)
- 区别C#中的两个属性(Property和Attribute)
- 区别C#中的两个属性(Property和Attribute)