一周学会 C# (属性二)
C# 才鸟( QQ:249178521 )
5. set 语句
· **_ set _ ** ** 语句 ** ** **
w ** 是通过 ** **_ value _ ** **_ 标识符来进行赋值的 _ ** ** **
w ** 可以包含任何语句(甚至没有语句) ** ** **
** struct Time **
** { **
** ... **
** public int Hour **
** { **
** ... **
** set { **
** if (value < 0 || value > 24) **
** throw new ArgumentException("value"); **
** hour = value; **
** } **
** } **
** private int hour, minute, second; **
** } **
** Time lunch = new Time(); **
** ... **
** lunch.Hour = 12; **
当写一个属性的时候,属性的 set 语句自动运行。
在上面的例子中, Time 结构类有一个整型属性 Hour ,所以赋给这个属性的值必须是一个整型值。例如:
lunch.Hour = 12;
把一个整型值 12 赋给了 lunch 的 Hour 属性,这个语句会自动调用属性的 set 语句。 set 语句是通过 value 标识符来获得属性的赋值的。例如,如果 12 被赋给了 Hour 属性,那么 vaue 的值就是 12 。注意的是 value 不是一个关键字。 value 只是在 set 语句中才是一个标识符。你可以在 set 语句外的任何语句声明 value 为一变量的名字。例如:
public int Hour
{
get { int value; ... }// 正确
set { int value; ... }// 错误
}
6. 只读属性
l ** 只读属性只有 ** ** get ** ** 语句 ** ** **
Ø ** 任何写操作都会导致错误 ** ** **
Ø ** 就像一个只读字段 ** ** **
** struct Time **
** { **
** ... **
** public int Hour **
** { **
** get **
** { **
** return hour; **
** } **
** } **
** private int hour, minute, second; **
** } **
** Time lunch = new Time(); **
** ... **
** lunch.Hour = 12; // ** ** 错误 **
** ... **
** lunch.Hour += 2;// ** ** 错误 **
一个属性可以不必同时声明 get 语句和 set 语句。你可以只声明一个 get 语句。在这种情况下,属性是只读的,任何写的操作都会导致错误。例如,下面的语句就会导致一个错误:
lunch.Hour = 12;
因为 Hour 是只读属性。
但要注意的是,属性必须至少包括一个 get 或 set 语句,一个属性不能是空的:
public int Hour { }// 错误
7. 只写属性
l ** 只写属性只能有 ** **_ set _ ** ** ** ** 语句 ** ** **
Ø ** 任何读操作都是错误的 ** ** **
** struct Time **
** { **
** ... **
** public int Hour **
** { **
** set { **
** if (value < 0 || value > 24) **
** throw new OutOfRangeException("Hour"); **
** hour = value; **
** } **
** } **
** private int hour, minute, second; **
** } **
** Time lunch = new Time(); **
** ... **
** Console.WriteLine(lunch.Hour); // ** ** 错误 **
** ... **
** lunch.Hour += 12;// ** ** 错误 **
一个属性可以不必同时声明 get 语句和 set 语句。你可以只声明一个 set 语句。在这种情况下,属性是只写的,任何读的操作都会导致错误。例如,下面的语句就会导致一个错误:
Console.WriteLine(lunch.Hour);
因为 Hour 是只写属性。
而下面的例子则看上去好像是对的:
lunch.Hour += 2;
这句语句的实际运作是这样的:
lunch.Hour = lunch.Hour + 2;
它执行了读的操作,因此是错误的。因此,像 += 这种复合型的赋值操作符既不能用于只读属性,也不能用于只写属性。