C#中属性和字段(变量)的区别

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

域表示与对象或类相关联的变量,声明格式如下:
attributes field-modifiers type variable-declarators;
域的修饰符field-modifiers可以是:new、public、protected、internal、private、static、readonly。实际上,域相当于C++中的简单成员变量。在下面的代码中,类A包含了三个域:公有的X和Y,以及私有的z。
{
get{return _name;}
set{_name = value;}
}
只有变量没有成员变量,表示函数内部的临时变量
属性与成员变量类似,它们都提供数据存储,但属性的功能远比成员变量强大。属性由特殊方法访问。get 和 set 访问器允许在设置或检索属性之后验证属性值、执行其他代码或执行其他任务。
public string Name
{
set{
lock(this)
{
}
}
}
4属性可Biblioteka Baidu是抽象的,而字段不行
5属性可以接口的形式表现
6基于属性的索引
7不要直接把字段转化为属性
实力与对象:类实例化的过程就是创建一个对象,也就是说实例就是对象;
字段:类内部用来存储数据
属性:类提供给外部调用时用的可以设置或读取一个值
而get 和 set 访问器操作的便是字段
在C#中:
域:表示与对象或类相关联的变量,修饰符不论是不是public。(与字段类似)
字段:表示与对象或类相关联的变量。通常来讲修饰符是public的成员变量称为字段,而private更适合说是局部变量。(与域类似)
属性:表示域或字段的自然扩展,使得在保证封装性的基础上实现了访问私有成员的便捷性。
this.r = r;
this.g = g;
this.b = b;
}
}
如示例所示,通过readonly修饰符声明只读字段。给readonly字段的赋值只能作为声明的组成部分出现,或者在同一类中的实例构造函数或静态构造函数中出现。
属性
为了类的封装性,一般是把字段设为Private,把属性设为公有来操作字段。
get访问器相当于一个具有属性类型返回值的无参数方法。除了作为赋值的目标外,当在表达式中引用属性时,会调用该属性的get访问器以计算该属性的值。
set访问器相当于一个具有单个名为value的参数和无返回类型的方法。当一个属性作为赋值的目标,或者作为++或--运算符的操作数被引用时,就会调用set访问器,所传递的自变量将提供新值。
与字段和方法类似,对于实例属性和静态属性,C#两者都支持。静态属性是声明中具有static修饰符,而实例属性则没有。
属性的访问器可以是虚拟的。当属性声明中包含virtual,abstract,override修饰符时,它们将运用到属性访问器。
来自MSDN中的内容:
属性与字段
属性与字段都可在对象中存储和检索信息。它们的相似性使得在给定情况下很难确定哪个是更好的编程选择。
public static readonly Color Green = new Color(0, 255, 0);
public static readonly Color Blue = new Color(0, 0, 255);
private byte r, g, b;
public Color(byte r, byte g, byte b) {
{
get
{
return _month;
}
private set
{
_month = value;
}
}
public int Day
{
get
{
return _day;
}
}
}
我们给Date类定义了三个属性,分别为Year、Month、
Day。get中使用关键词return,set中使用关键词value。
Year可读可写属性。
属性(property):字段的封装,通过访问器(accessor)来进行读写操作,一般为public
一般字段的修饰符有:
静态字段:static A
只读字段:readonly A
一般属性的修饰符:
virtual
abstract
override
举例说明:
private System.Int32 _id;
C#中属性和字段(变量)的区别
相同点:
都是类的成员,属性是类的属性,而字段是类色数据成员
----------------------------------------------------
不同点:
1属性可进行数据绑定
2属性可通过set和get方法进行数据安全性检验,而字段不行
3属性可进行线程同步
1.值为自验证类型时。例如,如果将True或False以外的值赋给Boolean变量,就会发生错误或自动数据转换。
2.在数据类型所支持范围内的任何值均有效时。Single或Double类型的很多属性属于这种情况。
3.属性是String数据类型,且对于字符串的大小或值没有任何约束时
+
+
+
字段(域)
可以把字段理解为类级别的变量、常量,用以存储该类的实例的相关数据。
public System.Int32 id
{
get { return _id; }
set { _id = value; }
}
_id就是字段,id就是属性
字段,field:
public string name;
属性,property:
private string _name;
public string name
属性(property)是字段的自然扩展,两者都是具有关联类型的命名成员,而且访问字段和属性的语法是相同的。然而,属性与字段不同,不表示存储位置。相反,属性有访问器(accessor),这些访问器指定在它们的值被读取或写入时需执行的语句。
属性的声明类似于字段,不同之处在于属性的声明以定界符{}之间的get访问器和/或set访问器结束,而不是分号。同时包含get访问器和set访问器的属性称为读写属性(read-write property)。只具有get访问器的属性称为只读属性(read-only property)。只具有set访问器的属性称为只写属性(write-only property)。
综上就把字段变量mPublicString包装了起来,并不是直接的面向对象的使用者,达到控制的目的。
属性的方法中还能写各种复杂的逻辑,因为属性中set或get的代码块等同于SetPublicString和GetPublicString的方法。
主要区别:
字段(field):与类或对象相关联的变量,一般访问域为private
属性
属性将类中的数据暴露给类外。
public class Date
{
private int _year;
private int _month;
private int _day;
public int Year
{
get
{
return _year;
}
set
{
_year = value;
}
}
public int Month
变量:int double bool等声明的都是变量
常量:前面多个const
成员变量:在类中定义的变量
局部变量:在方法中定义的变量
字段变量就是对象公布出来和外界交互数据的变量。
属性是对一个或多个变量的包装。
在Java环境中,属性是通过从对象中暴露出来的Set方法和Get来实现的:
public boolean SetPublicString(string val){this.mPublicString = val;}
public string PublicString{
get{
if(this.mPublicString.Length>10){
return this.mPublicString;
}
else{
return "";
}
}
set{
this.mPublicString = value;
}
}
以上代码的意思是如果访问PublicString时就去查看mPublicString的长度,如果大于10就返回否则就返回空字符串。
public class Date
{
private int _year;
private int _month;
private int _day;
}
大多数情况下字段的访问修饰符均为private,如果修饰符为public,那么在类之外都可以访问该字段,但不建议这样做,应该通过属性或方法来访问类中的数据。
再看一个例子。
public int PageSize
{
get
{
return _pageSize;
}
set
{
if (value <= 0)
{
_pageSize = 20;
}
else
{
_pageSize = value;
}
}
}
这是一个分页类中的页大小属性,表示一页显示多少条记录。可以看到,我们在设置PageSize属性值时,如果值小于等于0,则会以默认值20代替。
当一个字段声明中不含有static修饰符时,由该声明引入的字段为实例字段(instance field)。类的每个实例都包含了该类的所有实例字段的一个单独副本。
在下面的示例中,Color类的每个实例都有r,g,b实例字段的不同副本,但是Black,White,Red,Green和Blue等静态字段只有一个副本:
public class Color
{
public static readonly Color Black = new Color(0, 0, 0);
public static readonly Color White = new Color(255, 255, 255);
public static readonly Color Red = new Color(255, 0, 0);
变量的定义
public string mPublicString;
属性的定义
public string PublicString{
get{return this.mPublicString;}
set{this.mPublicString = value;}
}
因为可以做到使用不同的代码段,所以在访问的时候可以使用更多的逻辑控制来取到或限制需要的值:
Month也是可读可写属性,但其写权限只限于类内部。
Day是只读属性。
Date date = new Date();
date._year = 2008; //错误,_year为private
date.Yonth = 2008; //正确
date.Day = 3; //错误,Day属性不可写
说明,上述这样设计一个日期类属性的读写可能是不合理的,我们这样做只是为了解释属性的具体用法。
在以下情况下使用属性过程:
1.需要控制设置或检索值的时间和方式时。
2.属性有定义完善的一组值需要进行验证时。
3.设置值导致对象的状态发生某些明显的变化(如IsVisible属性)。
4.设置属性会导致更改其他内部变量或其他属性的值时。
5.必须先执行一组步骤,然后才能设置或检索属性时。
在以下情况下使用字段:
public string GetPublicString(){return this.mPublicString;}
而在DotNet当中,总结了以上的Set和Get方法,直接将其定义成了一个暴露属性,通过对这个属性的访问方式不同(取值还是赋值)而采用不同的代码如以下所示的get代码段和set代码段
class A
{
public int x;
public string y;
private float z;
}
字段
字段是与对象或类相关联的变量。
当一个字段声明中含有static修饰符时,由该声明引入的字段为静态字段(static field)。它只标识了一个存储位置。不管创建了多少个类实例,静态字段都只会有一个副本。
List类声明了两个属性Count和Capacity,依次是只读和只写的。下面是使用这些属性的示例:
List names = new List();
names.Capacity = 100; //调用set访问器
int i = names.Count; //调用get访问器
int j = names.Capacity; //调用get访问器
索引
public class MyClass
{
public string this[int index]
{
get
{
return "X" + index.ToString();
}
}
}
使用
MyClass mc = new MyClass();
MessageBox.Show(mc[100]);
相关文档
最新文档