读书人

C#属性三两事

发布时间: 2012-09-19 13:43:54 作者: rapoo

C#--属性三两事
在介绍属性之前,我想问问各位有经验的大牛,属性的作用这么多,被外部访问的字段是不是都需要将它设为属性?

C#中的属性,体现了C#作为面向对象语言的封装性。它避免了外部类字段的直接访问、使得代码的安全性得到了加强。
属性与字段的区别: 属性是逻辑字段;属性是字段的扩展,源于字段; 属性并不占用实际的内存,字段占内存位置及空间。 属性可以被其它类访问,而大部分字段不能直接访问。 属性可以对接收的数据范围作限定,而字段不能。 最直接的说:属性是被“外部使用”,字段是被“内部使用”。
下面来看看,属性这种看起来麻烦的东西,到底能够带来什么样的好处:
1、可以提供get-only或者set-only版本,甚至可以给读、写以不同的访问权限(C# 2.0支持)
2、可以对赋值做校验、或者额外的处理

3、可以做线程同步

4、可以将属性置于interface中
5、可以使用虚属性、或者抽象属性



下面来看最简单的例子:class Person { private string sex;
public string Sex { get { return sex; } set { sex = value; } }
}
可以通过使用以下代码操作: Person x = new Person(); x .Sex = "boy"; Console.WriteLine( "sex = {0}", x. Sex); //sex = boy
显然,get为写操作,set为读操作,当然可以设置为只读,只写属性。当然,正常情况下,sex 的值只有boy跟girl,所以输入的其他情况均为异常情况,需避免。属性的作用之一就是可以提供这种约束:class Person { private string sex;
public string Sex { get { return sex; } set { if (value != "boy" && value != "girl" ) { Console.WriteLine( "sex 输入异常!!" ); } else { this.sex = value ; } } } }
Person x = new Person (); x . Sex = "boyORgirl"; Console .WriteLine( "sex = {0}" , x. Sex); //sex 输入异常!!
接口属性:

interface IEmployee{    string Name    {        get;        set;    }    int Counter    {        get;    }}public class Employee : IEmployee{    public static int numberOfEmployees;    private string name;    public string Name  // read-write instance property    {        get        {            return name;        }        set        {            name = value;        }    }    private int counter;    public int Counter  // read-only instance property    {        get        {            return counter;        }    }    public Employee()  // constructor    {        counter = ++counter + numberOfEmployees;    }}class TestEmployee{    static void Main()    {        System.Console.Write("Enter number of employees: ");        Employee.numberOfEmployees = int.Parse(System.Console.ReadLine());        Employee e1 = new Employee();        System.Console.Write("Enter the name of the new employee: ");        e1.Name = System.Console.ReadLine();        System.Console.WriteLine("The employee information:");        System.Console.WriteLine("Employee number: {0}", e1.Counter);        System.Console.WriteLine("Employee name: {0}", e1.Name);    }}
示例输出:

Enter number of employees: 210

Enter the name of the new employee: Hazem Abolrous

The employee information:

Employee number: 211

Employee name: Hazem Abolrous



下面讨论一下虚属性和抽象属性(个人认为的属性的最大优点):
虚属性: public class Base
{
public virtual int Count //虚属性
{
get { return 1; }
}
public int Compute()
{
return Count;
}
}

public class Derived : Base
{
public override int Count //重载虚属性
{
get { return 5; }
}
}
Test: Derived b = new Derived();
Console.WriteLine("Compute is {0}\n", b.Compute());
Console.ReadLine(); Output: Compute is 5
抽象属性的实现基本与上面相似,只要将Count 的限定符vitual改为abstract

看完了属性的作用,你是否觉得它很强大?你觉得它应该替代public字段吗?或者,在你的工作中,你是如何处理考虑这个问题的?


期待你的回答,谢谢!








--------------------------------2012年9月13日21:47:56

读书人网 >C#

热点推荐