轉自:http://www.cnblogs.com/smile2008/articles/1217567.html
class Test
{
private static string _name;
private static string _id;
static void Main()
{
_name=Console.ReadLine(); //接受用户输入
_id=Console.ReadLine();
}
}
虽然以上代码可以正常工作,但公开类的数据成员通常认为是一个不好的编程做法。因为用户为字段_id输入的值在赋值之前没有经过必要的验证,所以用户可以输入任何值而不受限制。
这是我们不想看到的,所以C#提供‘属性’来对类中字段提供保护。
[访问修饰符] 数据类型 属性名 //读,写属性
{
get{};
set{};
}
class Test
{
private int _age=20; //还记得命名规范,成员变量前加前缀 _ 吗?。注意如果初始值未赋值将输出默认值0
public int Age //属性名应该为帕斯卡命名法,表示它返回的实体
{
get //读/属性
{
return _age;
}
set //写/属性
{
if (value < 18) //value为传进去的值
{
Console.WriteLine("年纪太小");
}
else
{
_age = value;
}
}
}
static void Main()
{
Test obj = new Test();
Console.WriteLine(obj.Age); //直接读取Age 返回_age.返回初始值。注意如果初始值未赋值将输出默认值0
obj.Age = 12; //往Age内写值,小于18输出:年纪太小。
obj.Age = 25; //往Age内写值,大于18,赋值成功。
Console.WriteLine(obj.Age); //赋值成功后,覆盖初始值,输出新值。
}
}
控制台输出:
20
年纪太小
25
[访问修饰符] 数据类型 属性名 //只读属性
{
get{};
}
class Test
{
private int _age; //注意如果初始值未赋值将输出默认值0 _age=10 控制台输出 10
public int Age
{
get //读/属性
{
return _age;
}
}
static void Main()
{
Test obj = new Test();
Console.WriteLine(obj.Age); //直接读取Age 返回_age.返回初始值。注意如果初始值未赋值将输出默认值0
}
}
控制台输出:
0
[访问修饰符] 数据类型 属性名 //无意义的只写属性
{
set{}; //写属性
}
只写属性是没有任何意义的。.NET类库设计指南明确地指出:“不要使用只写属性”。
但是我们遇到类字段过多怎么办呢?自己手写,比较耗时。编译器提供了一种快捷封装字段的功能。
选中要封装的字段名,反键-重构-封装字段-确定即可。
在SharpDevelop中選中類字段,單擊右鍵,彈出的菜單中有一個建立屬性,程序會自動幫你建好.
索引器
索引器允许按照数组的方式检索对象的数组元素。正如属性可以使用户像访问字段一样访问对象的数据,索引器可以使用户像访问数组一样访问类成员。这就是索引的用处。
必须注意的是,仅有一个元素时没必要使用索引器进行检索,使用索引一般都是针对类的数组元素。
[访问修饰符] 数据类型 this [数据类型 标识符]
{
get{};
set{};
}
class Car //定义一个汽车
{
string[] wheels = new string[4]; //定义车有四个轮子
public Car() //构造函数内赋值
{
wheels[0] = "左前轮";
wheels[1] = "右前轮";
wheels[2] = "左后轮";
wheels[3] = "右后轮";
}
// Car类的索引器 string为返回值的数据类型,this在这里作用索引器的名称,而且必须用this
// int为接受值的数据类型,index为标识符
public string this[int index]
{
get
{
return wheels[index];
}
set
{
wheels[index] = value;
}
}
}
class test //定义一个测试类
{
public static void Main(String[] args)
{
Car car1 = new Car(); //实例化Car类
Console.WriteLine("car1的第一个轮子是:{0}", car1[0]); //wheels[0] = "左前轮";
Console.WriteLine("car1的第三个轮子是:{0}", car1[2]); //wheels[2] = "左后轮";
car1[1] = "新的右前轮"; //更新初始值
car1[3] = "新的右后轮";
Console.WriteLine("car1的第二个轮子是:{0}", car1[1]); //输出新值
Console.WriteLine("car1的第四个轮子是:{0}", car1[3]);
}
}
控制台输出:
car1的第一个轮子是:左前轮
car1的第三个轮子是:左后轮
car1的第二个轮子是:新的右前轮
car1的第四个轮子是:新的右后轮