[C#] wel of geen "new()" bij nieuw object

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi,
Kan iemand mij dit uitleggen?
Ik begrijp niet waarom ik geen new() hoef te gebruiken bij

DateTime myValue = DateTime.Now;

en wel bij:
Random myRandom = new Random();

en weer niet bij:
string myName = "Thomas";

Vast bedankt voor de opheldering!

Groeten,
Thomas

[ Voor 33% gewijzigd door Verwijderd op 11-03-2017 14:54 . Reden: hij werd geplaatst terwijl ik nog bezig was met typen ]

Beste antwoord (via Verwijderd op 11-03-2017 15:50)


  • xh3adshotx
  • Registratie: Oktober 2011
  • Laatst online: 28-02-2023
Verwijderd schreef op zaterdag 11 maart 2017 @ 15:12:
Oh ja, dat van Static laat wel een belletje rinkelen, dat je die niet hoeft te instantiëren. En Random.Next() is geen static method?
Een class kan static en instance methods hebben. Als je een class hebt zoals hieronder:

C#:
1
2
3
4
5
6
7
8
class Person {
    public int age() {
        return 10;
    }
    public static string Name() {
        return "Piet";
    }
}


Je zou de naam (name) dan kunnen opvragen zonder een instance (dus met new) aan te maken, maar de leeftijd (age) niet.

Werkt
C#:
1
2
Person person = new Person();
int age = person.age();


Werkt NIET
C#:
1
int age = Person.age();


Werkt
C#:
1
string name = Person.Name();



Code is niet getest, maar geeft wel een idee van de bedoeling. :)

Alle reacties


Acties:
  • +1 Henk 'm!

  • xh3adshotx
  • Registratie: Oktober 2011
  • Laatst online: 28-02-2023
Verwijderd schreef op zaterdag 11 maart 2017 @ 14:47:
Mijn vraag
...Ik begrijp niet waarom ik geen new() hoef te gebruiken bij

DateTime myValue = DateTime.Now;
Random myRandom = new Random();
string myName = "Thomas";

Relevante software en hardware die ik gebruik
...

Wat ik al gevonden of geprobeerd heb
...
Ik neem aan dat je deze regel bedoelt?

C#:
1
DateTime myValue = DateTime.Now;


Omdat DateTime.Now een property is.

Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 23:26

Cyphax

Moderator LNX
Oh dat zijn wel drie verschillende voorbeelden, waarbij de tweede wel new doet, dus misschien begrijp ik je vraag niet?

Maargoed, in het algemeen is het zo dat je niet altijd new moet gebruiken. Het is alleen nodig als je een nieuw object wilt instantiëren. DateTime.Now is al een DateTime dus hoef je geen nieuwe te maken met new, maar het zou kunnen: DateTime myValue = new DateTime(...) kan dus wel.
Die string in het derde voorbeeld komt een beetje neer op hetzelfde als het eerste voorbeeld. Je geeft een nieuwe string een waarde die bestaat op het moment dat je 'm daar zo neerzet. :P
Je kunt dus ook een integer zo assignen, heb je ook geen new voor nodig.

Saved by the buoyancy of citrus


Acties:
  • +1 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
xh3adshotx schreef op zaterdag 11 maart 2017 @ 14:52:
[...]


Ik neem aan dat je deze regel bedoelt?

C#:
1
DateTime myValue = DateTime.Now;


Omdat DateTime.Now een property is.
Iets preciezer: omdat het een static property is. Static properties hangen niet af van de instance, dus hoef je geen klasse met new te instantiëren om de property op te vragen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dit werkt dan weer niet:
int willekeur = Random.Next();

Sorry, ik snap nog niet waarom ik van DateTime niet persé eerst zelf een object hoef te maken en van Random wel. Want ook al is het een property, dan moet ik normaal toch ook altijd eerst een object maken om de property te kunnen uitlezen?

In alles wat ik lees (Head first C#, Microsoft C# training en Lynda.com) wordt vooral gezegd wat je moet doen, maar je leert niet dit soort basaal inzicht in waarom het zo in elkaar zit. Tips? boeken of websites?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Oh ja, dat van Static laat wel een belletje rinkelen, dat je die niet hoeft te instantiëren. En Random.Next() is geen static method?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
En hoe kom je er achter of iets wel of niet static is?

Acties:
  • Beste antwoord
  • +3 Henk 'm!

  • xh3adshotx
  • Registratie: Oktober 2011
  • Laatst online: 28-02-2023
Verwijderd schreef op zaterdag 11 maart 2017 @ 15:12:
Oh ja, dat van Static laat wel een belletje rinkelen, dat je die niet hoeft te instantiëren. En Random.Next() is geen static method?
Een class kan static en instance methods hebben. Als je een class hebt zoals hieronder:

C#:
1
2
3
4
5
6
7
8
class Person {
    public int age() {
        return 10;
    }
    public static string Name() {
        return "Piet";
    }
}


Je zou de naam (name) dan kunnen opvragen zonder een instance (dus met new) aan te maken, maar de leeftijd (age) niet.

Werkt
C#:
1
2
Person person = new Person();
int age = person.age();


Werkt NIET
C#:
1
int age = Person.age();


Werkt
C#:
1
string name = Person.Name();



Code is niet getest, maar geeft wel een idee van de bedoeling. :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dank je! Dat is helder.
Maar of het vanuit C# wel of niet static is, weet je dat uit ervaring of moet ik dat ergens kunnen vinden?

Acties:
  • 0 Henk 'm!

  • johnkeates
  • Registratie: Februari 2008
  • Laatst online: 04-07 16:30
Om dat je classes en instances hebt, en je properties en methods hebt, en om dat ze o.a. public en private kunnen zijn en ook static.

Een static public property kan je altijd lezen. En private instance property kan je nooit lezen. Een public instance property wel, maar dus alleen van een instance en niet van een class, om dat ie niet static is.

Acties:
  • 0 Henk 'm!

  • xh3adshotx
  • Registratie: Oktober 2011
  • Laatst online: 28-02-2023
Verwijderd schreef op zaterdag 11 maart 2017 @ 15:25:
Dank je! Dat is helder.
Maar of het vanuit C# wel of niet static is, weet je dat uit ervaring of moet ik dat ergens kunnen vinden?
Onder anderen op MSDN, bij DateTime zie je bijvoorbeeld onder properties een "S" van static bij "Now".

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Super! Bedankt allemaal ik ben een heel stuk wijzer geworden.

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-09 22:43
Je krijgt nu uitgelegd wat een static property/method whatever is, maar het is geen antwoord op de vraag. Het antwoord op "waarom hoef ik bij DateTime.Now geen new() te doen" is dat DateTime.Now dat voor je doet.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat snap ik niet. Als DateTime.Now een static property is, dan hoeft er toch geen instance gemaakt te worden? Waarom zou DateTime.Now dat dan toch doen?

Acties:
  • 0 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 23:59
"Now" is een static property van de DateTime class met als waarde een instantie van diezelfde DateTime class. Om de property uit te lezen, hoef je niet eerst een instantie te maken, maar het object dat je dan terugkrijgt, is het resultaat van de getter die intern wel een instantie maakt.

Acties:
  • 0 Henk 'm!

  • Mavamaarten
  • Registratie: September 2009
  • Laatst online: 18-09 17:22

Mavamaarten

Omdat het kan!

Het komt er gewoon op neer dat Now() een static methode is van DateTime. Die kan je dus aanroepen zonder een instantie aan te maken. Hoe je weet of een methode static is of niet, is een kwestie van de documentatie lezen. Daar vind je welke (static en non-static) methodes de DateTime klasse heeft.

Android developer & dürüm-liefhebber


Acties:
  • +1 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik mis een beetje de daadwerkelijke uitleg.

Bij new X zeg je "geef me een nieuwe X". Als je echter een eigenschap van een ander object aanroept (zoals DateTime.Now), vraag je niet op een nieuwe maar om een al bestaande. Merk ook op dat je het type gebruikt na new.

C#:
1
2
Hond hond = new Hond(); // geef me een nieuwe hond
Hond hondVanDeBuurman = buurman.hond; // geef me een bestaande hond, die van de buurman


De hond van de buurman hoef je dan natuurlijk niet opnieuw aan te maken - die bestaat immers al. Je wilt alleen een verwijzing naar die specifieke hond.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • jip_86
  • Registratie: Juli 2004
  • Laatst online: 23:17
Een gouden richtlijn wanneer je wel of niet een new nodig hebt is er niet echt. DateTime.Now is meer een handigheidje om de huidige tijd op te vragen.

Je zou in de trant moeten denken van, heb ik een specifieke instantie nodig dan geen new. Heb je een specifiek geval nodig dan geen new.

Acties:
  • 0 Henk 'm!

  • Juicy
  • Registratie: December 2000
  • Laatst online: 18-09 17:26
.oisyn schreef op zondag 12 maart 2017 @ 18:05:
Als je echter een eigenschap van een ander object aanroept (zoals DateTime.Now), vraag je niet op een nieuwe maar om een al bestaande.
Bij DateTime.Now wordt er impliciet door de static property een nieuwe instantie van een DateTime gemaakt (mbv een new) en wordt deze geretourneerd. Er wordt dus zeker geen bestaande geretourneerd.

-


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

@Juicy Dat ding wat je krijgt bestaat dus al. Dat hij daarvoor zojuist is gemaakt is minder relevant :)

Nou moet je sowieso al wat extra nuance aanbrengen om het feit dat DateTime een struct is en bij elke assignment dus wordt gekopieerd.

[ Voor 39% gewijzigd door .oisyn op 12-03-2017 19:49 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • +1 Henk 'm!

  • Cloud
  • Registratie: November 2001
  • Laatst online: 17-09 10:39

Cloud

FP ProMod

Ex-moderatie mobster

Verwijderd schreef op zaterdag 11 maart 2017 @ 15:25:
Dank je! Dat is helder.
Maar of het vanuit C# wel of niet static is, weet je dat uit ervaring of moet ik dat ergens kunnen vinden?
Het is static omdat je het op het type-naam uitvoert, in plaats van op een instantie van dat type.

DateTime is het type object dat je wilt (immers dat is het type van myValue in je voorbeeld) en alles wat static is zul je dus kunnen aanroepen via de type-naam in plaats van een instantie.


C#:
1
2
3
4
5
6
7
  // Hieronder vraag je een eigenschap op van het typenaam DateTime/String; dus static aanroep
  DateTime nu = DateTime.Now; 
  string myString = string.Empty;

  // Hieronder voer je een methode uit op een instantie van het type DateTime/String; dus instantie aanroep
  DateTime dagLater = nu.AddDays(1);
  string myString = myString.Trim();


Belangrijk ook om te weten is dat je nooit static methoden/properties aan kunt roepen via de instantie van een object van hetzelfde type. Dus je kunt niet het volgende typen, tenzij dezelfde methodenamen/properties ook als instantie variant bestaan:

C#:
1
2
3
  // Onderstaande regels compileren niet
  DateTime nu = nu.Now; 
  string myString = myString.Empty;


Je kunt het dus wel opzoeken op MSDN maar je kunt het ook gewoon zien aan de code die je typt, die vertelt je al wat static is en wat niet :)

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


Acties:
  • +1 Henk 'm!

Verwijderd

Topicstarter
Thanks! Heel verhelderend!
Pagina: 1