Jianqiang's Silverlight Blog
Focus on PRISM, MVVM, IoC and MMORPG games
CnBlogs
Home
New Post
Contact
Admin
Rss
Posts - 514 Articles - 15 Comments - 3549
CLR笔记:9.Property
属性分两种,无参属性,有参属性,后者又叫索引器(indexer)——VB.NET中相应为默认属性。
1.无参属性
CLR支持静态属性,实例属性,抽象属性,虚拟属性,但不能被重载。
属性在MSIL中生成以下内容:
get_XX方法,当在属性中定义了get的时候——XX为属性名
set_XX方法,当在属性中定义了set的时候——XX为属性名
一个位于原数据中的属性定义。
属性不能作为out/ref传递给方法,字段则可以。
如果属性中执行语句过多,要花很多时间,这时候优先选用方法。例如线程同步和Remoting。
多次访问属性,每次返回的值可能不同;而字段的值每次返回都不会改变。例如System.DateTime属性——MS以后会将其改为方法。
2.有参属性
定义,有参属性的get方法可以接受1个或者更多参数,set方法可以接受2个或者更多参数
——对比,无参属性get方法无参数,set方法有1个参数。
C#索引器语法,是对[ ]这个运算符的重载,示例如下:
public
class
FailSoftArray
{
int
[] a;
public
int
length;
public
FailSoftArray(
int
length)
{
a
=
new
int
[length];
this
.length
=
length;
}
public
int
this
[
int
index]
{
get
{
if
(index
>=
0
&
index
<
length)
{
return
a[index];
}
else
throw
new
ArgumentOutOfRangeException();
}
set
{
if
(index
>=
0
&
index
<
length)
{
a[index]
=
value;
}
else
throw
new
ArgumentOutOfRangeException();
}
}
}
public
class
TestIndex
{
public
TestIndex()
{
FailSoftArray fs
=
new
FailSoftArray(
5
);
for
(
int
i
=
0
; i
<
5
; i
++
)
{
fs[i]
=
i
*
10
;
}
}
}
索引器是可以重载的,不能在this[]的类型上重载,只能在参数上重载——无参属性不可以重载:
public
int
this
[
int
index]
{
set
{ }
}
public
int
this
[
double
index]
{
set
{ }
}
以下索引器重载是不对的,尽管改变了Item,在MSIL中是有不同方法名的两套方法,却具有相同的参数集;但是C#不是按名称引用索引器,而是按参数集。
[IndexerName(
"
Jeff
"
)]
public
String
this
[
bool
b]
{
set
{ }
}
[IndexerName(
"
Jax.Bao
"
)]
public
Int32
this
[
bool
b]
{
set
{ }
}
CLR不区分无参属性和有参属性,都是生成一对方法和一块元数据:
get_Item方法,当在属性中定义了get的时候
set_Item方法,当在属性中定义了set的时候
一个位于原数据中的属性定义。在MSIL中,有专门用于有参属性的元数据定义表。
对于索引器,使用get_Item和set_Item这两个默认名称。同时,通过反射查看类型是否有Item属性,来判断该类型是否提供了索引器(Generic.List)。
但是,C#编程中不会看到Item这一默认属性,在与其它语言交互时,可能需要把Item改为其他的名称,方法如下:
using
System.Runtime.CompilerServices;
public
sealed
class
BitArray
{
[IndexerName(
"
Bit
"
)]
public
bool
this
[
int
bitPos]
{
set
{ }
}
}
于是,MSIL生成get_Bit和set_Bit方法。NET中的String.String类型就是Chars而不是Item。
索引器语法this[..],是C#团队选择的表示方式,意味着C#只允许在对象的实例上定义索引器。
CLR支持静态有参属性,但是C#没有提供相关语法
补充:VB.NET"默认属性"语法
将C#的索引器示例改造成VB.NET的:将属性声明为Default,并加上参数,只是这里的this不再是关键字,而是一个自定义的属性
Public
Class FailSoftArray
Class
FailSoftArray
Public
length
As
Integer
Private
a(length)
As
Integer
Public
Sub New()
Sub
New
(
ByVal
length
As
Integer
)
Me
.length
=
length
End Sub
Default
Public
Property Name()
Property
this(
ByVal
index
As
Integer
)
Get
If
(index
>=
0
&
index
<
length)
Then
Return
a(index)
Else
Throw
New
ArgumentOutOfRangeException()
End
If
End
Get
Set
(
ByVal
value)
If
(index
>=
0
&
index
<
length)
Then
a(index)
=
value
Else
Throw
New
ArgumentOutOfRangeException()
End
If
End
Set
End Property
End Class
Public
Class TestIndex
Class
TestIndex
Public
Sub New()
Sub
New
()
Dim
fs
As
FailSoftArray
=
New
FailSoftArray(
5
)
Dim
i
As
Integer
For
i
=
1
To
5
fs(i)
=
i
*
10
Next
End Sub
End Class
3.性能
内联:就是方法下包括全部代码,不需要将部分代码放到额外的调用函数中——消除了运行时与调用相关的开销,代价是编译后方法的代码很庞大。
内联属性方法,因为其通常包括极少代码,所以编译后代码量更小,执行更快。
由于JIT调试时期不会内联属性方法,所以属性访问器在Release版本性能要快于Debug版本——字段在两个版本中执行得同样快。
4.属性访问器的可访问性
可以get是public的;而set是protected的
get/set的可访问性是在属性名前声明的
public
String Name
//
这里的public决定了get/set默认的可访问性
{
get
{
return
null
; }
protected
set
{ }
//
这里提升了set的可访问性
}
5.虽然属性实际上就是方法,但是不允许泛型属性。
绿色通道:
好文要顶
关注我
收藏该文
与我联系
posted @ 2007-09-09 11:01
Jianqiang Bao
Views(386)
Comments(0)
Edit
收藏
注册用户登录后才能发表评论,请
登录
或
注册
,
返回博客园首页
。
首页
博问
闪存
新闻
园子
招聘
知识库
最新IT新闻
:
·
Chrome将给老机带来更快的3D绘图性能
·
在线支付创业公司Stripe获红杉资本等1800万美元的投资,公司估值达1亿美元
·
创新工场孵化公司磊友科技今天正式推出首款大型手机HTML5网页游戏《黎明帝国》
·
霍金的伟大与不幸
·
Linux为什么成功?因为它的失败是免费的!
»
更多新闻...
最新知识库文章
:
·
高级编程语言的发展历程
·
如何学习一门新的编程语言?
·
学习不同编程语言的重要性
·
为什么我喜欢富于表达性的编程语言
·
计算机专业的女生为什么要学编程
»
更多知识库文章...
China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务
公告
Name:Jianqiang Bao
Position:Beijing, China
Company:Microsoft
My Writings
《Expert .NET 2.0 IL Assembler》
《博客园精华集——WEB标准之道》
昵称:
Jianqiang Bao
园龄:
5年11个月
粉丝:
180
关注:
0
Search
Post Categories
.NET CLR(39)
(rss)
.NET MSIL(68)
(rss)
ASP.NET 2.0(16)
(rss)
Data Structures(12)
(rss)
Design Patterns(33)
(rss)
Open SourceCode(5)
(rss)
Others(92)
(rss)
Prism(25)
(rss)
SharpDevelop 0.92(11)
(rss)
Silverlight MMORPG(17)
(rss)
SQLServer研究(5)
(rss)
WCF(2)
(rss)
WF(8)
(rss)
WPF(109)
(rss)
包包版网络棋牌大厅(25)
(rss)
博客园精花集(28)
(rss)
Post Archives
2011/10 (2)
2011/8 (1)
2011/3 (1)
2011/2 (6)
2011/1 (1)
2010/6 (2)
2010/5 (1)
2010/4 (2)
2010/3 (5)
2010/2 (17)
2009/12 (6)
2009/11 (27)
2009/10 (24)
2009/9 (3)
2009/8 (6)
2009/7 (15)
2009/6 (5)
2009/5 (8)
2009/4 (2)
2009/3 (14)
2009/2 (5)
2009/1 (20)
2008/12 (10)
2008/11 (7)
2008/10 (10)
2008/9 (15)
2008/8 (14)
2008/7 (28)
2008/6 (10)
2008/5 (15)
2008/4 (58)
2008/3 (26)
2008/2 (8)
2008/1 (1)
2007/10 (31)
2007/9 (30)
2007/8 (9)
2007/7 (7)
2007/5 (3)
2007/4 (36)
2007/3 (20)
2006/11 (4)
Recent Comments