一周学会 C# (属性三)
C# 才鸟( QQ:249178521 )
8. 静态属性
l ** 静态属性是和类联系在一起的 ** ** **
Ø ** 只能通过类名使用 ** ** **
** sealed class Error **
** { **
** ... **
** public static TextWriter Log **
** { **
** get { return log; } **
** } **
** ... **
** private static Stream sink **
** = new FileStream("error.log", FileMode.Append); **
** private static TextWriter log **
** = new StreamWriter(sink); **
** } **
** Error.Log.WriteLine("time out"); **
字段可以是静态的,所以属性也可以是静态的。声明静态属性的语法很简单,只要在属性名前加入 static 关键字。静态函数中的机制和限制同样适用于静态属性。静态属性可以同一般的属性一样声明为只读或只写。
静态属性没有隐含的 this 参数。例如,上面的例子中, Log 这个静态属性之所以能访问 log 这个字段,是因为 log 是一个静态字段。如果 log 是一个实例字段,那么 Log 这个静态属性就不能访问它。例如:
public sealed class Error
{
public static TextWriter Log
{
get { return log; }
}
private Stream sink = ...;
private TextWriter log = ...;
}
9. 属性 vs. 字段
l ** 属性和字段的比较: ** ** **
Ø ** 属性不能使用 ** **_ ref/out _ ** ** ** ** 型参数 ** ** **
Ø ** 属性使用前必须赋值 ** ** **
** // ** ** 属性 **
** struct Time **
** { **
** ... **
** public int Hour **
** { **
** set { ... } **
** } **
** private int hour; **
** } **
** Time lunch; **
** Method(out lunch.Hour); // ** ** 错误 **
** lunch.Hour = 12;// ** ** 错误 ** ** **
** // ** ** 字段 **
** struct Time **
** { **
** ... **
** public int Hour; **
** ... **
** } **
** Time lunch; **
** Method(out lunch.Hour); // ** ** 正确 **
** lunch.Hour = 12; **
属性使用前必须赋值,例如:
Time lunch;
lunch.Hour = 12;// 错误, lunch 没有初始化
10. 属性 vs. 函数
l ** 相似点 ** ** **
Ø ** 都包含执行代码 ** ** **
Ø ** 都可以有访问修饰符 ** ** **
Ø ** 都可以有 ** **_ virtual, abstract, override _ ** **_ 修饰符 _ ** ** **
Ø ** 都可以用在接口中 ** ** **
l ** 不同点 ** ** **
Ø ** 属性只能拥有 ** ** get/set ** ** 语句 ** ** **
Ø ** 属性不可以是 ** **_ void _ ** ** 型 ** ** **
Ø ** 属性不能使用参数 ** ** **
Ø ** 属性不能使用 ** ** [ ] ** ** 参数 ** ** **
Ø ** 属性不能使用括号 ** ** **