> I'm at a bit of a loss to understand why it would be ok to 
> *not* box that integer. WriteLine is expecting an object. It 

There is no doubt that when Writeline in called it expects an object,
the question is whether this boxing takes place when the argument is
passed to Writeline or prepared in advance. Furthermore, it seems unwise
that in the following code would perform boxing 10,000 (0x2710) times.

 for(int i=0; i<10000; i++) WriteLine("{0}",1);


Hope the listing would be formatted ok:

// compiled with Microsoft Visual C# 2005 Compiler v. 8.00.50727.42

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       39 (0x27)
  .maxstack  2
  .locals init ([0] int32 i,
           [1] bool CS$4$0000)
  IL_0000:  nop
  IL_0001:  ldc.i4.0
  IL_0002:  stloc.0
  IL_0003:  br.s       IL_001a
  IL_0005:  ldstr      "{0}"
// loop start
  IL_000a:  ldc.i4.1
  IL_000b:  box        [mscorlib]System.Int32
// box  
  IL_0010:  call       void [mscorlib]System.Console::WriteLine(string,
                                                                object)
  IL_0015:  nop
  IL_0016:  ldloc.0
  IL_0017:  ldc.i4.1
  IL_0018:  add
  IL_0019:  stloc.0
  IL_001a:  ldloc.0
  IL_001b:  ldc.i4     0x2710
  IL_0020:  clt
  IL_0022:  stloc.1
  IL_0023:  ldloc.1
  IL_0024:  brtrue.s   IL_0005
// jump to loop start
  IL_0026:  ret
} // end of method Program::Main



> could in theory call GetType on the passed object therefore 
> requiring it to definitely be a reference type - unless you 
> think we should special case the known primitives (there is 
> some code in place special casing situations like boxing Nullable<T>).
> Then we come back to Fabian's point - assuming you have a 
> shared boxed int, how long do you expect to keep this shared 
> int around? If not forever (which is possible if you think 
> about the behaviour of interned strings) then you have just 
> created a bunch of gen2 garbage that the GC will have to work 
> very hard to collect.

It is a fine point you raise - what is the essential difference between
a string literal and an "int literal"? Sure it must be boxed (once) by
JIT/CSC precompilation. And of course there is no need for all that GC
work, since the number of "literals" in the program, be it string
literals or "int literals" is known in compile time. 
 

Igal
 

===================================
This list is hosted by DevelopMentorĀ®  http://www.develop.com

View archives and manage your subscription(s) at http://discuss.develop.com

Reply via email to