之前学C#时写过个测试,看看readonly的行为到底如何。结果让我挖到了VS2005/.NET Framework 2.0里C#编译器的一个bug:readonly的值类型常量的值在运行时能被改变。
今天因为需要装了VS2005 SP1,突然想起这东西,于是重新写了个来测试:
结果让人挺失望了。我原本以为这个问题是在SP1的时候解决的,看来不是……
[quote]E:\>peverify TestReadonly.exe
Microsoft (R) .NET Framework PE Verifier. Version 2.0.50727.42
Copyright (c) Microsoft Corporation. All rights reserved.
[IL]: 错误: [E:\TestReadonly.exe : TestReadonly::Main][偏移量 0x0000002C] 无法在
initonly 字段的 .ctor 之外对其进行更改。
1 Error Verifying TestReadonly.exe[/quote]
不过没关系,至少这个bug在VS2008/.NET Framework 3.5里已经不存在了。
==============================================================
hmm,不过测试这些东西还是副产品,这次装上SP1主要是为了那个ASP.NET Web应用程序的模板。可是这玩意也真是够大的,还真的是装了4G的东西上来。于是我的C盘开始吃紧了……
顺手把ASP.NET AJAX 1.0也装上了,看看这次会不会用上
今天因为需要装了VS2005 SP1,突然想起这东西,于是重新写了个来测试:
public sealed class TestReadonly
{
static readonly MutableInt32 ZERO = new MutableInt32( 0 );
public static void Main( string[ ] args ) {
ZERO.increment( ); // no effect
System.Console.WriteLine( ZERO.Value ); // 0
++ZERO; // bad. changed value of readonly constant
System.Console.WriteLine( ZERO.Value ); // 1
}
}
struct MutableInt32
{
private int m_value;
public MutableInt32( int i ) {
this.m_value = i;
}
public int Value {
get { return this.m_value; }
set { this.m_value = value; }
}
public void increment( ) {
++m_value;
}
public static MutableInt32 operator ++( MutableInt32 m ) {
m.increment( );
return m;
}
}
结果让人挺失望了。我原本以为这个问题是在SP1的时候解决的,看来不是……
[quote]E:\>peverify TestReadonly.exe
Microsoft (R) .NET Framework PE Verifier. Version 2.0.50727.42
Copyright (c) Microsoft Corporation. All rights reserved.
[IL]: 错误: [E:\TestReadonly.exe : TestReadonly::Main][偏移量 0x0000002C] 无法在
initonly 字段的 .ctor 之外对其进行更改。
1 Error Verifying TestReadonly.exe[/quote]
不过没关系,至少这个bug在VS2008/.NET Framework 3.5里已经不存在了。
==============================================================
hmm,不过测试这些东西还是副产品,这次装上SP1主要是为了那个ASP.NET Web应用程序的模板。可是这玩意也真是够大的,还真的是装了4G的东西上来。于是我的C盘开始吃紧了……
顺手把ASP.NET AJAX 1.0也装上了,看看这次会不会用上