关于字段和属性

来源:互联网 发布:剑桥模型的弹塑性矩阵 编辑:程序博客网 时间:2024/05/01 20:27

        刚又疯了在flex里面定义了几个属性,写好set get方法 结果在调用的时候各种语法不对,当时就郁闷了,经过上网查了一下,问了一下前辈,才知道 在Flex和c#里面是有字段和属性之分的。看完资料现在还是有点蒙的感觉,当时几本了解还是看懂了一点,区别开属性与字段 是为了更好的实现数据安全,比如当我们想给一个类的属性赋值 或者其他类用到了,就需要将这个字段设置为public,然而这样可以对字段进行任意的读写操作,非常不利于数据安全。于是就加上了属性,简单说属性实现了字段的封装,属性有getset 方法来控制字段,该字段的属性只有set方法没有get方法,就只可以对该方法进行赋值操作,没有读操作,反之亦然。就是对对字段的操作通过属性来控制。下面是网上找到的什么时候适合用字段 属性以及举得例子、供大家参考。


1. 字段:

class Card

   private string Name;
}

2. 属性:

属性中包含两个模块:setgetset模块负责属性的写入工作,get模块负责属性的读取工作。在两个模块中都可以做一些其他操作,如在set中验证赋的值是否符合要求并决定是否进行赋值。

class Card
{
    private string name;
 
   public string Name
 
   {
  
      get { return this.name;}
  
      set { this.name=value;}
 
    }

例:

class Product   //商品类

    {

        //私有字段

        private string _Pname;    //商品名称

        private bool _IsNoEmperty;//是否有库存

        private float _Price;     //商品单价

        private int _PCount;      //商品数量

        //属性:

        //可读写

        public string Pname

        {

            set { _Pname = value; }

            get { return _Pname; }

        }

        //只读

        public bool IsNoEmperty

        {

            get { return _IsNoEmperty; }

        }

        //可检测赋值是否正确

        public float Price

        {

            set

            {

                if (value >= 0)

                    _Price = value;

                else

                    throw new Exception("Price的赋值范围");

            }

            get

            {

                return _Price;

            }

        }

        //赋值时更改其他状态

        public int PCount

        {

            set

            {

                _PCount = value;

                _IsNoEmperty = true;   //改变了_IsNoEmperty字段的值

            }

            get { return _PCount; }

        }

        public void Print()

        {

            Console.WriteLine("产品信息如下:");

            Console.WriteLine("产品名称:{0}",_Pname);

            Console.WriteLine("产品价格:{0}", _Price);

            Console.WriteLine("库存数量:{0}", _PCount);

Console.ReadLine();

        }

        static void Main(string[] args)

        {

            Product P1=new Product();

            P1.Pname="黑人牙膏(克)";

            P1.Price=5;

            P1.PCount=20;

            P1.Print();

        }

 

例:
//
有个网站,每当有新用户注册的时候,我们需要记录这些用户的信息   
class User   
{   
    //
姓名,性别   
    public string name;   
    public string sex;   
}   
//
声明一个类去使用User   
class Property   
{   
    static void Main()   
    {   
        //
实例化一个User对象   
        User zs = new User();   
        //
对其赋值   
        zs.name = "
张三";   
        zs.sex = "
";   
        Console.WriteLine("
姓名:" + zs.name + " 性别:" + zs.sex);   
    }   
}

通过编译执行,这段代码正常运行,但是仔细分析,就会发现:所有字段都是公有的,不利于字段的保护,只要实例化了这个类,都可以修改其中的值。如果性别输入了男女之外的字符,系统是不会识别的。比如把zs.sex = "";改成zs.sex = "";。运行代码结果肯定张三的性别成牛了...这个时候就不合逻辑了。修改为:
class User   
{   
    public string name;   
    public string sex;   
    //SetSex
方法   
    public void SetSex(string values)   
    {   
        if (values == "
" || values == "
")   
        {   
            sex = values;   
        }   
        else 
        {   
            Console.WriteLine("
性别只能为
”");   
        }   
    }   
}   
class Property   
{   
    static void Main()   
    {   
        User zs = new User();   
        zs.name = "
张三
";   
        //
直接调用SetSex赋值
   
        zs.SetSex("
");   
        Console.WriteLine("
姓名:" + zs.name + " 性别:
" + zs.sex);   
    }   
}

SetSex这个方法乍一看还可以,但是不要忘记namesex字段还是public属性,我们依然可以直接去调用它,或者说去修改它,一样可以把sex设为。给类的字段设置为public意味着破坏了类的封装,这样呢会存在潜在的危险。所以呢要设为private,这个时候就分别声明方法去读取和设置这2个字段,修改如下:

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;   
    }   
}   
class Property   
{   
    static void Main()   
    {   
        User zs = new User();   
        zs.SetName("
张三
");   
        zs.SetSex("
");   
        Console.WriteLine("
姓名:" + zs.GetName() + " 性别:
" + zs.GetSex());   
    }   
}

现在这个类的设计就比较合理了,我们看namesex它们是private字段,也就是说在类的外部是不能访问的,这样呢就保证了它的安全性。当用户想给性别字段添加非法字段的时候,SetSex方法内会对这个添加的值进行判断,如果不为男或女,值就不会被添加。通过方法虽然解决了上面的问题,但是每创建一个对象,输入字段值时就必须调用上面方法。如果不知道,就无法调用。为了提高数据安全性,并且有效解决上面的问题,C#推出了属性。可以创建属性,将字段和属性封装在一起。通过属性可以像访问字段一样访问数据成员,实现数据的封装,避免使用非法数据赋值,保证数据完整性,同时类内部发生修改时,避免整个程序的修改。