using System;
namespace qwe
{
class Class1
{
private int intVal;
public int Val
{
get
{
return intVal;
}
set
{
intVal = value;
}
}
}
}
[此贴子已经被作者于2005-7-15 9:19:40编辑过]
A.属性 作用:将类的某些部分隐藏起来,同时还可以限制外部对内部成员的存\取权限 另外,还可以在存\取时进行某些额外的行为,或者是进行一些特殊的处理. 事实上,属性是一种非常灵活的却又不具有参数的方法
实现手段:存取元(get{}set{}),再配合一个储存用的变量(某些情况下也可以不配合这个变量),一般是配合私有变量(private)
如果没有get存取元,而有set存取元,那么就是说,这个属性允许你进行写,却不允许你获得它的值(只写属性) 而如果有get{},没有set{},这个属性就是只允许你获得它的值,却不允许你修改它(只读属性) 如果两个都有,那就是可以修改也可以获取值了(可读写属性)
例子: class a { private string str="3216549879876548";//下面的几个属性都是靠这个私有变量完成存取的 public string Str//可以写也可以读的属性,因为它有get,也有set { get{return str;} //这个属性使用类内的str(一个私有的string成员)进行存储,在取得Str的值时,就返回str的值, //要注意,返回的类型必须与属性的类型相同,return 只能出现在get存取元中 set{str = value;}//value是一个关键字,专门用于set存取元中的, //value的类型取决于属性的类型(永远与属性的类型相同),在这个地方,value就是一个string } public string Stri//只读属性,因为它只有get { get{return str;} } public string St//只写属性,因为它只有set { set{str = value+"opq?";//可以在存取动作时进行一些额外的行为,还可以调用方法等等,非常好用! } } } class main { public static void Main() { a a1 = new a(); Console.WriteLine(a1.Str);//打出了str的值 Console.WriteLine(a1.Stri);//打出了str的值,因为Stri这个属性是允许读的,所以不会出错 a1.Str="sssss";//Str是可以写的属性,所以这句代码也不会出问题 a1.Stri = "akljdfkaf";//Stri没有set存取元,不允许写,这句代码无法编译 Console.WriteLine(a1.St);//St属性只允许写,不允许读,这句代码无法编译 a1.St="asdfasdf";//OK!St属性允许写~ } }
注意: 属性可以是各种各样类型的,随便你定义:修饰符 属性类型 属性名称{这个里面可以包含有存取元,也就是get{}和set{}} get{}里面可以有return,但是set{}里面不能有,同样,value只可存在与set中(value与属性的类型相同) 同一个方法中不可以有同名的属性! 属性可以使用virtual,abstract,override修饰符 属性可以为static
B.索引 作用:具有属性的大多数特点,另外,存取更灵活,数组的"[]"和集合的"[]"都是索引
例子: class b { string[]s=new string[]{"a","b","c","d","e","f","g","h"}; public string this[int index]//注意索引的声明方法: //修饰符 类型 this[这个里面声明存取时所用的参数,参数不限制为一个,参数的类型可以不同] { get { return s[index];//如果index超出s的范围,将会导致异常 } set { s[index]=value;//如果index超出s的范围,将会导致异常 } } } public int this[string index]//这个地方采用string作为索引参数,返回一个int { get { return s.IndexOf(index);//这个索引形同与IndexOf(); } }
class main { public static void Main() { b b1 = new b(); Console.WriteLine(b1[0]);//OK! Console.WriteLine(b1[99]);//抛出异常,因为99这个索引超出了范围 Console.WriteLine(b1["a"]);//输出0 } } 注意: 一个类可以有多个索引,但是这些索引不能有相同的索引参数 还有,属性可以为static,而索引不可以 索引可以有多个参数(至少一个),参数的类型可以不同,索引的参数不可以为out(传出参数)或者ref(传参考参数) 虽然属性和索引都是方法,但是不能声明为void