首页 > 代码库 > C#---属性和字段

C#---属性和字段

C#中的变量

内存:用户存储正在运行的程序数据RAM(随机存储器)断电后里面的数据丢失

变量代表这一块内存空间,我们可以通过变量名称向内存存/取数据.有变量就不需要我们记忆复杂的内存地址了.

先向计算机申请一块内存空间,考虑往内存方的数据类型,向内存申请一块内存空间的语法:

int number;//申请开辟一块内存空间

number=1000;//把1000放到number中

Console.WriteLine(number);

Console.ReadKey();

变量可以类中,方法中声明...

字段

"字段"是直接在"类"或"结构"中声明的任何类型的变量。字段是其包含类型的"成员".(简单的说,字段就是直接出现在类或结构中的变量)

类或结构可以拥有实例字段或静态字段.或同时拥有两者。实例字段特定于类型的实例。如果您拥有类T和实例字段F,可以创建类型T的两个对象,并修改每个

对象中的F的值,这不影响另一对象中的该值.相比之下,静态字段属于类本身,在该类的所有实例中共享.从实例A所做的更改将立刻呈现在实例B和C上(如果他们访问该字段)

通常应仅为具有私有或受保护可访问性的变量使用字段.您的类向客户端代码公开的数据应通过"方法","属性","索引器"提供.通过使用这些构造间接访问内部字段,可以针对

无效的输入值提供防护.存储由公共属性公开的数据的私有字段称为"后备存储"或"支持字段".

字段通常存储这样的数据:该数据必须可供多个类方法访问,并且其存储期必须长于任何单个方法的生存期.例如,表示日历日期的类可能有3个整数字段:一个表示月份,一个表

示日期,一个表示年份.如果一个变量只在某个方法范围内使用 那么 应该在方法体自身范围内声明为局部变量。

在类块中通过指定字段的访问级别,然后指定字段的类型,在指定字段的名称来声明这些字段.例如:

public class CalendarEntry

{

  //私有字段

  private DateTime date;

  //公共字段(一般不推荐)

  public string day;

  //公共属性为date字段提供安全性

  public DateTime Date

  {

    get{return date;}

    set

    {

      //设置可能出生日期的合理边界

      if(value.Year>1900&&value.Year<=DateTime.Today.Year)  

      {

        date=value;

      }

      else

        throw new ArgumentOutOfRangeException();  

    }

  }

  //公共方法为date字段提供安全性

  //例如:birthday.SetDate("1975,6,30");  

  public void SetDate(string dateString)

  {

    DateTime dt=Convert.ToDateTime(dateString);

    //设置出生日期的合理边界

    if(dt.Year>1900&&dt.Year<=DateTime.Today.Year)

    {

      date=dt;

    }

    else

      throw new ArgumentOutOfRangeException();

  }

  public TimeSpan GetTimeSpan(string dateString)

  {

    DateTime dt=Convert.ToDateTime(dateString);

    if(dt!=null&&dt.Ticks<date.Ticks)

    {

      return date-dt;

    }

    else

      throw new ArgumentOutOfRangeException();    

  }

}

 若要访问对象中的字段,请在对象名称后面添加一个句点,然后添加该字段的名称,比如objectname.fieldname.例如:

 CalendarEntry birthday=new CalendarEntry();

 bitrhday.day="Saturday";

 声明字段时可以使用赋值运算符为字段指定一个初始值。例如,若要自动将"Monday赋给"day字段,需要声明day,如下例所示:

 public class CalendarDateWithInitialization

 {

  public string day="Monday";

}

字段的初始化紧靠调用对象实例的构造函数之前.如果构造函数为字段赋值,则该值将覆盖字段声明期间给出的任何值

说明:字段初始值设定项不能引用其他实例字段.

属性

属性是面向对象编程的基本概念,提供了对私有字段的访问封装,在C#中以get和set访问器方法实现对可读可写属性的操作,

提供了安全和灵活的数据访问封装.(这里与上面字段介绍 相呼应)

属性是这样的成员:它提供灵活的机制来读取,编写或计算某个私有字段的值.可以像使用公共数据成员一样使用属性,但实际上它们是称作"访问器"的特殊方法.这使得可以轻松访问数据,此外还有助于提高方法

的安全性和灵活性.

示例1:

public class MyProperty

{

  //定义字段

  private string name;

  private int age;

  //定义属性,实现对 name字段的封装

  public string Name

  {

    set{name=value;}

    get

    {

      if(name==null)

        return string.Empty;

      else

        return name;            

    }

  }

  //定义属性,实现对age字段的封装

  //加入对字段的范围控制

  public int Age

  {

    get{return age;}

    set

    {

      if(value>0)&&(value<150)

      {

        age=value;    

      }

      else

      {

        throw new Exception("Not a real age");

      }

    }

  }

}

public class MyTest

{

  public static void Main(string[] args)

  {

    MyProperty myProperty=new MyProperty();

    //触发set访问器

    myProperty.Name="Anytao"

    //触发get访问器

    Console.WriteLine(myProperty.Name);

  }

}

示例2:

在本示例中,TimePeriod类存储了一个时间段.在内部,类以秒为单位存储时间,但客户端使用名为Hours的属性能够以小时为单位指定时间.Hours属性的访问器执行小时和秒之间的转换.

class TimePeriod

{

  private double seconds;

  public double Hours

  {

    get{return second/3600;}

    set{second=value*3600}

  }

}

class Program

{

  static void Main()

  {

    TimePeriod t=new TimePeriod();

    //设置Hours属性自动调用set方法

    t.Hours=24;

    //得到Hours属性,自动调用get方法

    System.Console.WriteLine("Time in Hours:"+t.Hours);

  }

}

属性概述

属性使类能够以一种公开的方法获取和设置值,同时隐藏实现或验证代码.

get属性访问器用于返回属性值,而set访问器用于分配新值.这些访问器可以有不同的访问级别.有关更多信息,请参见 "限制访问器可访问性(C#编程指南)".

value关键字用于定义由set取值函数分配的值.

不实现set取值函数的属性是只读的.

对于不需要任何自定义访问器代码的简单属性,可考虑选择使用自动实现的属性.有关更多信息,请参见"自动实现的属性(C#编程指南)"

C#---属性和字段