Object "Literals"

  • Thread starter Thread starter Sue & Bill
  • Start date Start date
S

Sue & Bill

I have:

Rectangle[] rects = new Rectangle[10000];


I want to initialize the values of rects as follows:

Option A:
========
for (int i=0; i<rects.Length; i++)
{
rects.X = 0;
rects.Y = 0;
rects.Size.Width = 100;
rects.Size.Height = 20;
}

(By the way, rects.Size.Width = 100 above generates a compiler
error. I haven't figured out why.)

What is the impact on memory or performance, if any, if I use the
following instead:

Option B:
========
for (int i=0; i<rects.Length; i++)
rects=new Rectangle(new Point(0,0), new Size(100,20));

Option C:
========
for (int i=0; i<rects.Length; i++)
{
rects.Location = new Point(0,0);
rects.Size = new Size(100,20);
}


Thank you for your help.
 
A Rectangle is a value type and so when you index into the array you get back a copy. The compiler is trying to prevent you from doing something you are not intending - updating a copy of the array memeber not the array member itself. Option B is the only one that wil actually do what you want.

Regards

Richard Blewett - DevelopMentor
http://www.dotnetconsult.co.uk/weblog
http://www.dotnetconsult.co.uk

I have:

Rectangle[] rects = new Rectangle[10000];


I want to initialize the values of rects as follows:

Option A:
========
for (int i=0; i<rects.Length; i++)
{
rects.X = 0;
rects.Y = 0;
rects.Size.Width = 100;
rects.Size.Height = 20;
}

(By the way, rects.Size.Width = 100 above generates a compiler
error. I haven't figured out why.)

What is the impact on memory or performance, if any, if I use the
following instead:

Option B:
========
for (int i=0; i<rects.Length; i++)
rects=new Rectangle(new Point(0,0), new Size(100,20));

Option C:
========
for (int i=0; i<rects.Length; i++)
{
rects.Location = new Point(0,0);
rects.Size = new Size(100,20);
}


Thank you for your help.


[microsoft.public.dotnet.languages.csharp]
 
Sue & Bill said:
Rectangle[] rects = new Rectangle[10000];


I want to initialize the values of rects as follows:

Option A:
========
for (int i=0; i<rects.Length; i++)
{
rects.X = 0;
rects.Y = 0;
rects.Size.Width = 100;
rects.Size.Height = 20;
}

(By the way, rects.Size.Width = 100 above generates a compiler
error. I haven't figured out why.)


Because the implementation of Rectangle.Size is

public Size Size
{
get { return new Size(this.Width, this.Height); }
set {[snip]}
}

So you cannot assign a value to a "new Size".
You need to use the "set" part:

rects.Size = new Size(100, 20);

What is the impact on memory or performance, if any, if I use the
following instead:

Option B:
========
for (int i=0; i<rects.Length; i++)
rects=new Rectangle(new Point(0,0), new Size(100,20));

Option C:
========
for (int i=0; i<rects.Length; i++)
{
rects.Location = new Point(0,0);
rects.Size = new Size(100,20);
}


Here it is the implementation of Rectangle.ctor(Point, Size)

public Rectangle(Point location, Size size)
{
this.x = location.X;
this.y = location.Y;
this.width = size.Width;
this.height = size.Height;
}

So if you use Rectangle.ctor(int, int, int, int) you avoid the two "new" on
Size and Point.
The same on C).
 
Thanks all for the explanation of why .Size.Width cannot be assigned.
A mystery solved, much appreciated.

My main question was whether 10,000 calls of the new statement would
gobble up lots of memory. If not, is there a way to create object
"literals" to assign to an existing instance of an object?

Thanks.
 
It will not allocate any more memory it will reinitialize the existing array member as Rectangle is a value type

Regards

Richard Blewett - DevelopMentor
http://www.dotnetconsult.co.uk/weblog
http://www.dotnetconsult.co.uk

nntp://news.microsoft.com/microsoft.public.dotnet.languages.csharp/<[email protected]>

Thanks all for the explanation of why .Size.Width cannot be assigned.
A mystery solved, much appreciated.

My main question was whether 10,000 calls of the new statement would
gobble up lots of memory. If not, is there a way to create object
"literals" to assign to an existing instance of an object?

Thanks.


[microsoft.public.dotnet.languages.csharp]
 
Back
Top