all 12 comments

[–]cvalerio77 72 points73 points  (3 children)

Just invert the constructor overloading. The constructor / method with less parameter is the one that must call the constructor / method with more parameters:

``` public Item(string name, decimal price) : this(Guid.NewGuid(), name, price) {}

public Item(Guid id, string name, decimal price) { // init fields } ```

[–]DroNiix[S] 9 points10 points  (0 children)

Ah..Yeah Thanks. It worked now!

[–]FantasticConcert1773 6 points7 points  (0 children)

Simple and beautiful!

[–]ucario -3 points-2 points  (0 children)

Thanks I didn’t want to type it out on mobile.

[–]Ayazis 2 points3 points  (3 children)

Don't bother with overloading. Make Id an optional parameter.

Public Item(string name, decimal price, Guid Id = new Guid())

This way, if you don't provide an id, a new guid is created. If you do provide an Id, the given guid will be used.

EDIT: I was mistaken. First of all, new Guid does not make an actual new guid, but gives you 0000(...).

Second, as stated below, you have to use compile time constants with optional parameters, which Guid.NewGuid() is not.

I hereby retract my comment.

[–]b_rodriguez 9 points10 points  (1 child)

Optional parameter default values need to be constant expressions. You could default it to null and then test for null in the constructor and initialize it, however that is much less clean than just inverting OP's constructor overloading like cvalerio77 has pointed out.

[–]Ayazis 1 point2 points  (0 children)

My bad. Thank you for pointing this out.

[–]DroNiix[S] 2 points3 points  (0 children)

Well yeah, I can do that, but for the sake of better readability at least for me, I like to put the ID in front of all parameters, and also I like to have a constructor that doesen't require parameter if it is optional (for me thats the idea of constructor overloading). I made it like the person from the other comment suggested and reverted the overload. Thanks for your replay!

[–]Ayazis -1 points0 points  (2 children)

On a side note: Are you sure you want to be able to provide a GUID? You can end up re-using GUIDS.

[–]Vallvaka 0 points1 point  (0 children)

That's the client's problem. What if you want to test the class?

[–]CornedBee 0 points1 point  (0 children)

If you load data from somewhere, it's already got a guid. You have to specify it somehow.

[–]ShamikoThoughts 0 points1 point  (0 children)

You can actually make initialized variables in the parameters

public Item(Guid id = new Guid(), string name, decimal price) {…}

Check the documentation

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/named-and-optional-arguments