C#中的属性,字段,变量
来源:互联网 发布:javascript 有api吗 编辑:程序博客网 时间:2024/05/18 11:50
工作这么长时间,一直对 属性,字段,变量的定义不清晰.今天就详细整理一下.
在C#中,在类中定义的变量叫字段,在方法中定义的变量就叫变量了。
一句话:字段、属性都是变量,只是为了区分和数据安全设置的。
字段的使用场景:与类或者对象关系密切,建议使用private修饰。
属性的使用场景:对字段进行封装,提供get/set关键字,进行访问。
变量的使用场景:与类或者对象关系不密切,常常在方法或者语句块中使用。
字段和属性是相对于类而言的,而变量相对于方法或者语句块而言,可以再任何地方使用。
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#中的属性,字段,变量
- C#中的属性,字段,变量
- C#中的变量、字段、域、属性、属性过程
- C#中的变量、字段、域、属性、属性过程
- C# 字段、属性、成员变量
- c#中的属性和字段
- C#中的字段与属性
- C#中的字段与属性
- c#中的字段 属性 索引器
- C#中的属性和字段的区别
- C# .NET中的字段与属性_1
- 每次复习理解更深刻:C#属性、字段、变量
- C#类中属性与字段(成员变量)区别
- C#属性、字段和成员变量的关系区别
- C#属性、字段和成员变量的关系区别
- 数据库中的字段类型对应C#的变量类型
- 数据库中的字段类型对应C#的变量类型
- 数据库中的字段类型对应C#的变量类型
- Css-Family-Tree,家谱系统
- 一个完全免费的游戏发布网真的诞生了
- 一、DC/OS 安装前期准备
- gridview加checkbox怎么实现单选图片如下
- Word Ladder
- C#中的属性,字段,变量
- 安卓内置浏览器不能在html5网页上下载APP软件
- NSMutableURLRequest 异步回调的问题
- 加速度传感器中任意静止时刻任意角度下x,y,z方向上的加速度算法
- android listview item中的按钮点击事件如何添加,请教大神
- POJ 3545 Ants(最佳二分图匹配)
- android 如何检测连接的wlan wifi需要portal认证
- Underscore.js常用方法
- IOS Json格式正确的,但是解析不出来。求高手指教