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 13 1465
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
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)
{
......
}
}
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).
"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.
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.
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!
"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 ;)
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.
"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 ;)
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.
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
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
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. This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
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 (???)....
|
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...
|
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...
|
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...
|
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...
|
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,...
|
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.
...
|
by: jerry.teshirogi |
last post by:
I have the following class and main:
//////////////////////////////////////////////////////////
#include <iostream.h>
class myVector
{
public:
double x, y, z:
|
by: lllomh |
last post by:
Define the method first
this.state = {
buttonBackgroundColor: 'green',
isBlinking: false, // A new status is added to identify whether the button is blinking or not
}
autoStart=()=>{
|
by: DJRhino |
last post by:
Was curious if anyone else was having this same issue or not....
I was just Up/Down graded to windows 11 and now my access combo boxes are not acting right. With win 10 I could start typing...
|
by: tracyyun |
last post by:
Hello everyone,
I have a question and would like some advice on network connectivity. I have one computer connected to my router via WiFi, but I have two other computers that I want to be able to...
|
by: giovanniandrean |
last post by:
The energy model is structured as follows and uses excel sheets to give input data:
1-Utility.py contains all the functions needed to calculate the variables and other minor things (mentions...
|
by: NeoPa |
last post by:
Introduction
For this article I'll be using a very simple database which has Form (clsForm) & Report (clsReport) classes that simply handle making the calling Form invisible until the Form, or all...
|
by: isladogs |
last post by:
The next Access Europe meeting will be on Wednesday 1 Nov 2023 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM)
Please note that the UK and Europe revert to winter time on...
|
by: nia12 |
last post by:
Hi there,
I am very new to Access so apologies if any of this is obvious/not clear.
I am creating a data collection tool for health care employees to complete. It consists of a number of...
|
by: NeoPa |
last post by:
Introduction
For this article I'll be focusing on the Report (clsReport) class. This simply handles making the calling Form invisible until all of the Reports opened by it have been closed, when it...
|
by: GKJR |
last post by:
Does anyone have a recommendation to build a standalone application to replace an Access database? I have my bookkeeping software I developed in Access that I would like to make available to other...
| |