首页 > 代码库 > 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#---属性和字段