473,323 Members | 1,560 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,323 software developers and data experts.

Overloaded constructors vs. Object initializations

Hi,

I would like to get some thoughts on Overloaded constructors vs. Object
initializations. Assuming that the class supports a default constructor, is
there any reason to include overloaded constructors when you are able to use
object initialization? I see a point, to provide the overloads, if you are
developing framework code that might support the need to run ontop of 2.x
but if you are writing a sealed application / know you are only going to
deploy on 3.x or higher, then the need doesn't seem as apparent to me.
..Andreas
Aug 14 '08 #1
13 1481
On Aug 14, 3:48*pm, Andreas <Andr...@discussions.microsoft.comwrote:
Hi,

I would like to get some thoughts on Overloaded constructors vs. Object
initializations. Assuming that the class supports a default constructor, is
there any reason to include overloaded constructors when you are able to use
object initialization?
Yes, when your object is immutable - then all your properties will be
readonly, and an object initializer cannot be used. And even for
mutable objects, there can be properties which should only be
initialized once when the object is created, and not changed
afterwards - e.g. Dictionary<,>.Comparer

Aug 14 '08 #2
I would like to get some thoughts on Overloaded constructors vs. Object
initializations. Assuming that the class supports a default constructor, is
there any reason to include overloaded constructors when you are able to use
object initialization?

Yes, when your object is immutable - then all your properties will be
readonly, and an object initializer cannot be used. And even for
mutable objects, there can be properties which should only be
initialized once when the object is created, and not changed
afterwards - e.g. Dictionary<,>.Comparer
Yes, you are right. Maybe I should have been a bit more precise by saying
"other than when you design explicitly require the use of non-default
constructor". Many times overloaded constructors have been used to make
object initialization a bit more userfriendly and to provide cleaner code,
such as

public class Person
{
public Person()
{ }

public Person(string firstName, string lastName) : this(0, firstName,
lastName)
{ }

public Person(int age, string firstName, string lastName)
{
......
}
}
Aug 14 '08 #3
On Aug 14, 5:03*pm, Andreas <Andr...@discussions.microsoft.comwrote:
Yes, you are right. Maybe I should have been a bit more precise by saying
"other than when you design explicitly require the use of non-default
constructor". Many times overloaded constructors have been used to make
object initialization a bit more userfriendly and to provide cleaner code
In that context, object initializers are clearly superior (more
readable as well, since property names are spelled out). Besides, with
a significant number of properties, you can't cover all permutations
anyway (I often see such half-hearted attempts in the BCL, where you
need, say, a combo of property #1+#3+#4, but you only get constructors
for #1+#2+#3 or #1+#2+#4).
Aug 14 '08 #4

"Pavel Minaev" <in****@gmail.comwrote in message news:f0**********************************@e39g2000 hsf.googlegroups.com...
In that context, object initializers are clearly superior (more
readable as well, since property names are spelled out). Besides, with
a significant number of properties, you can't cover all permutations
anyway (I often see such half-hearted attempts in the BCL, where you
need, say, a combo of property #1+#3+#4, but you only get constructors
for #1+#2+#3 or #1+#2+#4).

Unless of course you have support for optional parameters, then it is very easy to have a single constructor, and also makes it easy for objects to then have a concept of "dirty" or changed after initialization.
Aug 14 '08 #5
On Aug 14, 5:25*pm, "Bill McCarthy" <B...@localhost.comwrote:
"Pavel Minaev" <int...@gmail.comwrote in messagenews:f0**********************************@e 39g2000hsf.googlegroups.com...
In that context, object initializers are clearly superior (more
readable as well, since property names are spelled out). Besides, with
a significant number of properties, you can't cover all permutations
anyway (I often see such half-hearted attempts in the BCL, where you
need, say, a combo of property #1+#3+#4, but you only get constructors
for #1+#2+#3 or #1+#2+#4).

Unless of course you have support for optional parameters, then it is very easy to have a single constructor, and also makes it easy for objects to then have a concept of "dirty" or changed after initialization. *
Well, CLS doesn't support optional parameters in general (so if VB
guys want to make libraries that are usable from C# and other .NET
languages, they can forget about Optional).

Also, when you have 3+ properties to initialize, constructor calls
become rather unreadable when there is no named argument support in a
language, because you don't know which argument corresponds to which
property.

Aug 14 '08 #6
Yes, when your object is immutable - then all your properties will be
readonly, and an object initializer cannot be used. And even for
mutable objects, there can be properties which should only be
initialized once when the object is created, and not changed
afterwards - e.g. Dictionary<,>.Comparer
I guess technically you don’t really need constructors at all, they
are just there to make life simpler.

For example, in your “Dictionary<,>.Comparer” example, you could allow
a user to set the “Comparer” property using object initialization at
any time, but you will have to add some more logic to throw an error
if the user tries to set the “Comparer” property once the object is in
a state where changing the value of the property would cause
problems....... phiuuuu, that can get ugly!

So I would say that constructors exist not because they are necessary
but because they can make your code simpler and more robust.

I realize that this point is obvious and I am sure you already knew
this. I am just giving my 2 cent to the original poster.

Cheers!
Aug 14 '08 #7

"Pavel Minaev" <in****@gmail.comwrote in message
news:4c**********************************@k30g2000 hse.googlegroups.com...
>
>Unless of course you have support for optional parameters, then it is
very easy to have
a single constructor, and also makes it easy for objects to then have a
concept of "dirty" or changed after initialization.

Well, CLS doesn't support optional parameters in general (so if VB
guys want to make libraries that are usable from C# and other .NET
languages, they can forget about Optional).
CLS does not specify anything about Optional parameters. That is they are
neither compliant or non compliant. Optional parameters are not variable
length parameter lists, rather they are compiler trickery. The compiler
reads from the list and adds the indicated default values for you if you
don't include the parameter when calling the method. Today, all CLS
languages can use methods that have optional arguments, but either the code
has to specify all parameters all the compiler fill in the gaps for you.
Also, when you have 3+ properties to initialize, constructor calls
become rather unreadable when there is no named argument support in a
language, because you don't know which argument corresponds to which
property.
Right. Named arguments is an important part of support for optional
parameters.
BTW: Pavel,would you mine changing your post encoding to none or mime rather
than Printed Quotable. Hard to reply and have who said what clear ;)

Aug 14 '08 #8
On Aug 14, 7:10*pm, "Bill McCarthy" <B...@localhost.comwrote:
CLS does not specify anything about Optional parameters. *That is they are
neither compliant or non compliant. *Optional parameters are not variable
length parameter lists, rather they are compiler trickery. *The compiler
reads from the list and adds the indicated default values for you if you
don't include the parameter when calling the method. *Today, all CLS
languages can use methods that have optional arguments, but either the code
has to specify all parameters all the compiler fill in the gaps for you.
Well, optional parameters that you have to specify in the call hardly
count as "optional", don't they? ;)

What I meant is that CLS does not specify any standard protocol for
optional parameters (or indeed the existence of such facility in
general), and therefore you can't expect any other language to treat
the parameters as optional - thus defeating their purpose.
Right. Named arguments is an important part of support for optional
parameters.
I would argue that named arguments are quite useful even on their own
- a method call with many parameters is much more readable when they
are explicitly named in the call.
BTW: Pavel,would you mine changing your post encoding to none or mime rather
than Printed Quotable. * Hard to reply and have who said what clear ;)
I'm reading and posting via Google Groups, so I don't think it's
something under my control, unfortunately.
Aug 14 '08 #9

"Pavel Minaev" <in****@gmail.comwrote in message
news:5b**********************************@59g2000h sb.googlegroups.com...
On Aug 14, 7:10 pm, "Bill McCarthy" <B...@localhost.comwrote:
>CLS does not specify anything about Optional parameters. That is they are
neither compliant or non compliant. Optional parameters are not variable
length parameter lists, rather they are compiler trickery. The compiler
reads from the list and adds the indicated default values for you if you
don't include the parameter when calling the method. Today, all CLS
languages can use methods that have optional arguments, but either the
code
has to specify all parameters all the compiler fill in the gaps for you.

Well, optional parameters that you have to specify in the call hardly
count as "optional", don't they? ;)
Sure, but that doesn't stop people susing them, much like doing VSTO stuff
in C# today

>
What I meant is that CLS does not specify any standard protocol for
optional parameters (or indeed the existence of such facility in
general), and therefore you can't expect any other language to treat
the parameters as optional - thus defeating their purpose.


CLS doesn't, but CLI does, specifically partition II section 15.4 and
15.4.1.4. Really, it's a bit like adding support for UInt32 as an
intrinsic CIL, except that is actually prohibited by CLS. ;)
>Right. Named arguments is an important part of support for optional
parameters.

I would argue that named arguments are quite useful even on their own
- a method call with many parameters is much more readable when they
are explicitly named in the call.

Yep (with moderation <g>)
>BTW: Pavel,would you mine changing your post encoding to none or mime
rather
than Printed Quotable. Hard to reply and have who said what clear ;)

I'm reading and posting via Google Groups, so I don't think it's
something under my control, unfortunately.

Ah okay. Maybe I need a better newsreader then ;)

Aug 14 '08 #10
On Aug 14, 8:35*pm, "Bill McCarthy" <B...@localhost.comwrote:
Well, optional parameters that you have to specify in the call hardly
count as "optional", don't they? ;)

Sure, but that doesn't stop people susing them, much like doing VSTO stuff
in C# today
Ouch... that brings back some very unpleasant memories, of 10+ ref
arguments for each call (none of which actually needed the "ref")...
What I meant is that CLS does not specify any standard protocol for
optional parameters (or indeed the existence of such facility in
general), and therefore you can't expect any other language to treat
the parameters as optional - thus defeating their purpose.

CLS doesn't, but CLI does, specifically partition II section 15.4 and
15.4.1.4. * *Really, it's a bit like adding support for UInt32 as an
intrinsic CIL, except that is actually prohibited by CLS. *;)
Thanks for the pointer, I didn't know CLI actually covered that. I
stand corrected.
Aug 14 '08 #11
Pavel Minaev wrote:
On Aug 14, 7:10 pm, "Bill McCarthy" <B...@localhost.comwrote:
>CLS does not specify anything about Optional parameters. That is they are
neither compliant or non compliant. Optional parameters are not variable
length parameter lists, rather they are compiler trickery. The compiler
reads from the list and adds the indicated default values for you if you
don't include the parameter when calling the method. Today, all CLS
languages can use methods that have optional arguments, but either the code
has to specify all parameters all the compiler fill in the gaps for you.

Well, optional parameters that you have to specify in the call hardly
count as "optional", don't they? ;)

What I meant is that CLS does not specify any standard protocol for
optional parameters (or indeed the existence of such facility in
general), and therefore you can't expect any other language to treat
the parameters as optional - thus defeating their purpose.
I think you are talking about optional arguments in the executed
code while Bill is talking about optional arguments in the source
code that are handled by the compiler.

Two different things. They solve the same problem. But in the context
of language interop, they are completely different.

Arne
Aug 15 '08 #12
Pavel Minaev wrote:
On Aug 14, 5:25 pm, "Bill McCarthy" <B...@localhost.comwrote:
>"Pavel Minaev" <int...@gmail.comwrote in messagenews:f0**********************************@e 39g2000hsf.googlegroups.com...
>>In that context, object initializers are clearly superior (more
readable as well, since property names are spelled out). Besides, with
a significant number of properties, you can't cover all permutations
anyway (I often see such half-hearted attempts in the BCL, where you
need, say, a combo of property #1+#3+#4, but you only get constructors
for #1+#2+#3 or #1+#2+#4).
Unless of course you have support for optional parameters, then it is very easy to have a single constructor, and also makes it easy for objects to then have a concept of "dirty" or changed after initialization.

Well, CLS doesn't support optional parameters in general (so if VB
guys want to make libraries that are usable from C# and other .NET
languages, they can forget about Optional).

Also, when you have 3+ properties to initialize, constructor calls
become rather unreadable when there is no named argument support in a
language, because you don't know which argument corresponds to which
property.
There could be some clues in what the arguments are.

Arne
Aug 15 '08 #13
On Aug 15, 4:42*am, Arne Vajhøj <a...@vajhoej.dkwrote:
I think you are talking about optional arguments in the executed
code while Bill is talking about optional arguments in the source
code that are handled by the compiler.
No, we both were talking about the latter. I did not realise that the
facility to mark parameters as optional was actually specified at the
CLI level.
Aug 15 '08 #14

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

1
by: andrea_gavana | last post by:
Hello NG, I am trying to port a useful class from wxWidgets (C++) to a pure Python/wxPython implementation. In the C++ source code, a unique class is initialized with 2 different methods (???)....
42
by: Edward Diener | last post by:
Coming from the C++ world I can not understand the reason why copy constructors are not used in the .NET framework. A copy constructor creates an object from a copy of another object of the same...
1
by: masood.iqbal | last post by:
I have a few questions regarding overloaded typecast operators and copy constructors that I would like an answer for. Thanks in advance. Masood (1) In some examples that I have seen...
3
by: hazz | last post by:
The following classes follow from the base class ' A ' down to the derived class ' D ' at the bottom of the inheritance chain. I am calling the class at the bottom, "public class D" from a client...
3
by: Vera | last post by:
I built a class in VB.NET that has an overloaded constructor. It can either accept nothing, a string or an object Public Sub New( MyBase.New( End Su Public Sub New(ByVal strName As String...
7
by: cmay | last post by:
Can someone quick shed some light on this issue I am having? I wanted to create 2 constructors for my object, one that takes an ID value and one that takes a datarow. If ID value is provided,...
12
by: st_ev_fe | last post by:
I've noticed that when constructing a subclass, the base class get's it's contructors called. Is there some way to avoid this? The base class has one variable, which gets initialised to 0. ...
3
by: jerry.teshirogi | last post by:
I have the following class and main: ////////////////////////////////////////////////////////// #include <iostream.h> class myVector { public: double x, y, z:
0
by: DolphinDB | last post by:
Tired of spending countless mintues downsampling your data? Look no further! In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...
0
by: jfyes | last post by:
As a hardware engineer, after seeing that CEIWEI recently released a new tool for Modbus RTU Over TCP/UDP filtering and monitoring, I actively went to its official website to take a look. It turned...
0
by: ArrayDB | last post by:
The error message I've encountered is; ERROR:root:Error generating model response: exception: access violation writing 0x0000000000005140, which seems to be indicative of an access violation...
1
by: CloudSolutions | last post by:
Introduction: For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
1
by: Defcon1945 | last post by:
I'm trying to learn Python using Pycharm but import shutil doesn't work
1
by: Shællîpôpï 09 | last post by:
If u are using a keypad phone, how do u turn on JavaScript, to access features like WhatsApp, Facebook, Instagram....
0
by: af34tf | last post by:
Hi Guys, I have a domain whose name is BytesLimited.com, and I want to sell it. Does anyone know about platforms that allow me to list my domain in auction for free. Thank you
0
by: Faith0G | last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 3 Apr 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome former...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.