Vra

Ek het gebyt is'n paar keer deur die state in VB.NET (nie seker of hierdie effek bestaan in C#), wat blyk te wees self-verwysings, maar wanneer hulle uitgevoer het, het hulle nie eintlik iets doen, want hulle vereis'n teiken en een is nie voorsien.Byvoorbeeld:

Dim MyString as string = "String to test"

' Neither of these lines do anything '
MyString.Replace(" ", "-")
MyString.Substring(0,5)

' This will return the original string, because neither statement did anything '
Messagebox.Show(MyString)

In beide gevalle, dit lyk nie te pla .NETTO dat die verklaring moet'n teiken te wys die resultaat te, en ek gee nie om dit een.Is daar'n rede dat die IDE/samesteller nie waarsku my van hierdie effek, of dat'n uitsondering "StatementDoesntDoAnything" is nie gegooi?Sedert die kode is wat gevorm word in so'n manier dat dit sal nooit verander nie, dit is duidelik mis-getik.

Was dit nuttig?

Oplossing

Dit kan moeilik wees om te vertel wat ignoreer die terugkeer waarde is nie bedoel as 'n paar funksies doen 'n paar newe-effek en terug te keer 'n waarde.

Funksies wat "net" terugkeer waardes sou hê as sodanig word gemerk om die samesteller hulle kyk, en dat dit net nie 'n prioriteit is of beoordeel om genoeg opbrengs op belegging (natuurlik het, anders sou hulle gedoen het dit:.)

Ander wenke

Ja, dit sal wonderlik wees as metodes wat geen newe-effekte het met 'n soort van [NoSideEffectsAttribute ()] sodat gereedskap soos opstellers jy kan waarsku kon word gemerk, maar op die oomblik nie so iets is bekend aan my.

Maar jy kan probeer FxCop, dit kan baie subtiel programmering foute raak te sien op NET gemeentes.

Daar is baie gevalle waar metodes terugkeer waardes wat opsioneel word hanteer deur die programmeerder. Daar is geen manier vir die samesteller om te weet dat hierdie spesifieke metode doen niks. Dit mag dalk 'n newe-effek en die feit dat jy kies om niks te doen met die terugkeer waarde van die metode het het 'n doelbewuste besluit van jou kant wees.

As die samesteller kies om jou te waarsku van elke geval wat dit gebeur het, dan sal jy ook baie valse waarskuwings kry.

Dit is dikwels moeilik vir die samesteller om te bepaal of die funksies "iets te doen". Tensy die samesteller nie streng Inter-Prosedurele Ontleding (IPA), dit kan nie bepaal of die funksie oproep het 'n newe-effek.

IPA is 'n stadige proses wat aansienlik verhoog die opstellers geheue vereistes so by verstek meeste opstellers doen dit nie uit te voer.

Dit is geërf gedrag van C, C ++, en is orioginally so gedoen dat jy kan kies of om die terugkeer waarde gebruik van 'n funksie / metode ... Wanneer jy skryf 'n funksie / metode wat 'n klomp van die dinge doen en dan terug 'n bietjie waarde, wanneer jy dit noem, jy het die opsie om te skryf

variableName = functionName([parameterlist]);  

As jy wil hê dat die returnb waarde gebruik in iets, of net

functionName([parameterlist]);  

As jy dit nie doen nie.

Vir funksie metodes wat geen newe-effekte (soos dié wat jy noem) as jy opgemerk, beteken dit nie heeltemal sin maak nie, maar om dit te verander na nuwe tale sal in stryd is met die lang geskiedenis van baie baie ander tale wat voldoen hardloop het om hierdie standaard ...

Ek is nie seker wat nog 'n navraag vir dwing of nie die terugkeer waarde in 'n veranderlike te sit sal 'n goeie idee om verskeie redes wees

1) Veronderstel jy 'n navraag te voeg wanneer die terugkeer waarde is optinal (vandaar impliseer dit gewoonlik verpligte) sou baie kode op te hou die opstel of uitgereik ton van waarskuwing veroorsaak

2) Gestel jy die omgekeerde doen, en voeg 'n navraag wanneer die terugkeer waarde is gedwing, sommige mense sal net gebruik skynveranderlikes om hulle te slaan en te hou om dit te gebruik die manier ther gewoond is.

3) Ek dink nie baie mense sou eintlik die tyd neem om na te dink of die terugkeer waarde is opsioneel of nie. In sommige gevalle, ek het om te erken dit is gegee, maar nie altyd nie.

Oorweeg die metode Dictionary<TKey, TValue>.TryGetValue(TKey key, out TValue value): dit kontroleer of dit as die sleutel is in die woordeboek, en as dit is, dit sit die waarde in die parameter out. Die terugkeer waarde is 'n bool wat aandui of die operasie suksesvol was. Soms sorg jy; soms doen jy nie. Ek dink dit is 'n mooi aanvaarde benadering vir metodes soos hierdie; indien die samesteller jy gedwing word om die opbrengs waarde toeken aan 'n veranderlike, sal mense baie-kode moet soos volg:

int someValue = 0;
bool discard = IntDictionary.TryGetValue("key", out someValue);

// I don't even care if discard is true or false;
// someValue will be 0 if it wasn't in IntDictionary
  

Ek het gebyt 'n paar keer deur

spring na gevolgtrekkings, nie deur

  

stellings in VB.NET ... dat ... nie eintlik enigiets doen

maar wat eintlik baie goed gedokumenteer.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top