C#属性详解及属性与函数间的对⽐
属性:get { //读属性代码 } set { //写属性代码 }
public class Person
{
private string name;
public string Name
{
get{return name;}
set{ name=value;}
}
}
属性可以忽略get或set访问器,但是不能两个都忽略.
set访问器包含⼀个隐藏的参数value,该参数包含从客户代码传送过来的值.
公共属性及其底层类型最好使⽤相同的名称,因为它们之间的联系将很清晰.
字段使⽤camelCase(xxXxx),如dateOfBirth,⽽属性使⽤PacalCase(XxXxx),如DateOfBirth.⼀些开发⼈员喜欢在字段的开头使⽤下划线,如_Name,属性也应使⽤名词来命名.
c#通过属性特性读取和写⼊字段,⽽不直接读取和写⼊,以此来提供对类中字段的保护.
属性按可以访问的类型分为三种不同的类型:
⼀.读/写属性
读/写属性是⼀个具有get()和set()访问器的属性.
语法: [访问修饰符] 数据类型属性
{
get{ };
set{ };
}
⼆.只读属性
仅具有get()访问器属性称为只读属性.
语法: [访问修饰符] 数据类型属性名
{
get{ };
}
三.只写属性
仅具有set()访问器属性称为只写属性,不推荐使⽤只写属性.
语法: [访问修饰符] 数据类型属性名
{
set{ };
}
⽰例:
using System;
namespace Example1
{
class Student
{
#region/***属性***/
/// <summary>
/
// 姓名
/// </summary>
private string name;
public string Name
{
get
{
return name;
}
set
{
if(value.length<40)
{
Console.WriteLine("学⽣姓名长度不能⼩于4个!");
return;
}
name=value;
}
}
#region
static void Main(string[ ] args)
{
Student student=new Student();
student.Name=Console.ReadLine();
}
}
}
属性(property)
-充分体现了对象的封装性:不直接操作类的数据内容,⽽是通过访问器进⾏访问,即借助于get和set对属性的值进⾏读写;另⼀⽅⾯还可以对数据的访问属性进⾏控制(当然也可以通过对普通域加readonly关键字来实现。
-设计原则:属性封装了对域的操作。把要访问的域设为private,通过属性中的get和set操作对域进⾏设置或访问。
-不能把属性作为引⽤类型或输出参数来进⾏传递。
-get⽅法没有参数;set⽅法有⼀个隐含的参数value。除了使⽤了abstract修饰符的抽象属性,每个访问器的执⾏体中只有分号“;”外,其他的所有属性的get访问器都通过return来读取属性的值,set访问器都通过value来设置属性的值。
-采⽤间接⽅式来访问对象的属性(间接调⽤get、set⽅法):对象.属性=值(调⽤set),变量=对象.属性(调⽤get)。
-在属性的访问声明中:
只有set访问器,表明该属性是只写的。
只有get访问器,表明该属性是只读的。
既有set访问器,⼜有get访问器,表明该属性是可读可写的。
private string s_filename;
public string Filename
{
get
{
return s_filename;
}//get
set
{
if(s_filename!=value)
{
s_filename = value;
}//if
writeline函数 }//set
}//Filename
}
l 属性和字段的⽐较:
Ø 属性不能使⽤ref/out 型参数
Ø 属性使⽤前必须赋值
属性使⽤前必须赋值,例如:
Time lunch;
lunch.Hour = 12;//错误,lunch没有初始化
属性vs.函数
l 相似点
Ø 都包含执⾏代码
Ø 都可以有访问修饰符
Ø 都可以有virtual, abstract, override 修饰符
Ø 都可以⽤在接⼝中
l 不同点
Ø 属性只能拥有get/set 语句
Ø 属性不可以是void 型
Ø 属性不能使⽤参数
Ø 属性不能使⽤[ ] 参数
Ø 属性不能使⽤括号
public int Hour
{
.
..
set
{
if (value < 0 || value > 24)
throw new ArgumentException("value");
hour = value;
}
类的属性称为智能字段,类的索引器称为智能数组。
由于类本⾝作数组使⽤,所以⽤
this作索引器的名称,索引器有索引参数值。例:
using System;
using System.Collections;
class MyListBox
{
protected ArrayList data = new ArrayList();
public object this[int idx] //this作索引器名称,idx是索引参数 {
get
{
if (idx > -1 && idx < data.Count)
{
return data[idx];
}
else
{
return null;
}
}
set
{
if (idx > -1 && idx < data.Count)
{
data[idx] = value;
}
else if (idx = data.Count)
{
data.Add(value);
}
else
{
//抛出⼀个异常
}
}
}
}
尽可能编写出运⾏效率更⾼,更健壮,更容易维护的C#代码。尽可能的使⽤属性(property),⽽不是数据成员(field)。private int property1
public int Property1
{
get
{
return property1 ;
}
set
{
if (value>1) //这⾥校验
property1= value ;
else
property1=1;
}
}
//实例属性,可读可写
public int StrCount
{
get
{
return m_strCount;
}
set
{
if (value>m_strCount)
{
strArray = new string[value];
for (int i=0;i<value;i++)
{
strArray[i] = String.Format("String No.{0}",i);
}
m_strCount = value;
}
}
}
private static string m_strName = "MyClass";
//⼀个静态属性,只读
public static string ClassName
{
get
{
return m_strName;
}
}
class B
{
private A _a;
public A item
{
get
{
if(_a=null)
_a=new A();
return _a;
set{_a=value;} }
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论