Kada koristiti statične klase u C #

Ovdje MSDN treba reći u odjeljku Kada koristiti statične klase :

 static class CompanyInfo { public static string GetCompanyName() { return "CompanyName"; } public static string GetCompanyAddress() { return "CompanyAddress"; } //... } 

Koristite statičku klasu kao jedinstvenu organizaciju metoda koje nisu povezane s određenim objektima. Osim toga, statična klasa se može implementirati lakše i brže jer ne morate stvarati objekt za pozivanje njegovih metoda. Korisno je organizirati metode unutar klase na smislen način, kao što su metode klase Math u prostoru imena sustava.

Meni se čini da ovaj primjer ne pokriva mnogo mogućih slučajeva upotrebe statičnih klasa. Nekada sam koristio statične klase za skupove povezanih funkcija, ali to je sve. Dakle, pod kojim okolnostima bi (i ne bi trebalo) klasa biti proglašena statičkom?

530
27 окт. pbh101 postavljen je na 27. listopada. 2008-10-27 23:53 '08 u 23:53 2008-10-27 23:53
@ 11 odgovora

Napisao sam svoje misli o statičkim klasama u prethodnom odgovoru, "Stack Overflow": Je li klasa s jednom metodom najbolji pristup?

Volio sam uslužne razrede ispunjene statičkim metodama. Učinili su veliku konsolidaciju pomoćnih metoda koje bi inače ležale uokolo, stvarajući zalihost i podršku paklu. Oni su vrlo jednostavni za korištenje, nisu stvoreni, nisu uništeni, samo ne rade. Pretpostavljam da je to bio moj prvi nesvjesni pokušaj stvaranja arhitekture orijentirane na usluge - mnoge usluge bez državljanstva koje su upravo obavile svoj posao i ništa više. Međutim, kako sustav raste, zmajevi će se približiti.

polimorfizam

Recimo da imamo metodu UtilityClass.SomeMethod koja veselo zuji. Odjednom moramo malo promijeniti funkcionalnost. Većina funkcionalnosti je ista, ali moramo promijeniti nekoliko dijelova. Ako se ne radi o statičkoj metodi, možemo napraviti klasu derivacije i po potrebi promijeniti sadržaj metode. Budući da je ovo statička metoda, ne možemo. Naravno, ako trebamo dodati funkcionalnost prije ili nakon stare metode, možemo stvoriti novu klasu i nazvati je starom, ali to je jednostavno nepristojno.

Nedostaci sučelja

Statičke metode se ne mogu definirati preko sučelja iz logičkih razloga. A budući da ne možemo redefinirati statičke metode, statične klase su beskorisne kada ih moramo prenijeti na naše sučelje. To nam omogućuje da ne koristimo statične klase kao dio predloška strategije. Neke probleme možemo riješiti propuštanjem delegata umjesto sučelja .

testiranje

To u osnovi ide ruku pod ruku s gore spomenutim problemima sučelja. Budući da je naša sposobnost zamjenjivih implementacija vrlo ograničena, također imamo problema s zamjenom proizvodnog koda testnim kodom. Opet, možemo ih zamotati, ali to će zahtijevati da izmijenimo velike dijelove našeg koda kako bismo mogli prihvatiti omotače umjesto stvarnih objekata.

Stvara mrlje

Budući da se statičke metode obično koriste kao korisne metode, a korisne metode obično imaju različite ciljeve, brzo ćemo završiti s velikom klasom ispunjenom nekonherentnom funkcionalnošću - u idealnom slučaju, svaka klasa treba imati jedan cilj unutar sustava. Radije bih pet puta više razreda jer su njihovi ciljevi jasno definirani.

Puzanje parametra

Za početak, ova mala slatka i nevina statička metoda može uzeti jedan parametar. Kako funkcionalnost raste, dodaje se nekoliko novih parametara. Uskoro se dodaju dodatni parametri koji su opcionalni, tako da stvaramo preopterećenja metoda (ili jednostavno dodamo zadane vrijednosti na jezicima koji ih podržavaju). Uskoro imamo metodu koja uzima 10 parametara. Samo prva tri su stvarno potrebna, parametri 4-7 su opcionalni. Ali ako je specificiran parametar 6, potrebno je popuniti 7-9 ... Ako smo kreirali klasu isključivo u svrhu obavljanja onoga što je ova statička metoda učinila, mogli bismo je riješiti uzimajući potrebne parametre u konstruktor i dopustiti korisniku da postavi neobavezne vrijednosti putem svojstava ili metode za istovremeno postavljanje nekoliko međuovisnih vrijednosti. Osim toga, ako je metoda narasla na takvu razinu složenosti, ona će najvjerojatnije morati biti u svojoj klasi.

Potražnja potrošača za izlaganjem nastave bez razloga

Jedan od najčešćih argumenata je: zašto zahtijevati od potrošača naše klase da stvore instancu da nazovu ovu jedinstvenu metodu, iako kasnije nije korištena za instancu? Stvaranje instance klase vrlo je jeftina operacija na većini jezika, tako da brzina nije problem. Dodavanje dodatne linije koda potrošaču je niska cijena za postavljanje temelja za mnogo prikladnije rješenje u budućnosti. I na kraju, ako želite izbjeći stvaranje instanci, jednostavno stvorite jednobojni omotač svoje klase koji omogućuje jednostavnu ponovnu upotrebu, iako to čini zahtjev da vaš razred bude bez državljanstva. Ako nema apatrida, još uvijek možete stvoriti statičke metode omotača koje će sve obraditi, a dugoročno će zadržati sve prednosti. Konačno, također možete stvoriti klasu koja skriva instancu kao da je jedna: MyWrapper.Instance je svojstvo koje jednostavno vraća new MyClass();

Samo se Sithi bave apsolutima.

Naravno, postoje iznimke od moje nepristojnosti prema statičkim metodama. Pravi programi koji ne predstavljaju opasnost za nadimanje su izvrsni slučajevi za statičke metode - na primjer, System.Convert. Ako je vaš projekt jednokratni projekt, bez zahtjeva za budućim održavanjem, cjelokupna arhitektura zapravo nije jako važna - statična ili nestatična, zapravo nije bitna - brzina razvoja, međutim.

Standardi, standardi, standardi!

Korištenje metoda instance ne sprječava korištenje statičkih metoda i obratno. Do rezoniranja diferencijacije i standardizacije. Ne postoji ništa gore od gledanja poslovne razine, istezanja s različitim metodama implementacije.

636
28 окт. odgovor dao Mark S. Rasmussen 28. listopada 2008-10-28 00:01 '08 u 0:01 2008-10-28 00:01

Kada odlučujete želite li klasificirati klasu ili ne, trebate vidjeti koje informacije pokušavate predstaviti. To podrazumijeva stil programiranja odozdo prema gore , gdje se usredotočite na podatke koje predstavljate na prvom mjestu. Je li klasa nad kojom pišete objekt stvarnog svijeta, kao što je kamen ili stolica? Te su stvari fizičke i imaju fizičke atribute, kao što su boja, težina, što vam govori da možete stvoriti nekoliko objekata s različitim svojstvima. Možda ću u isto vrijeme trebati crnu stolicu i crveni stolac. Ako ikada zatrebate dvije konfiguracije u isto vrijeme, odmah ćete znati da želite stvoriti instancu objekta kao objekt, tako da svaki objekt može biti jedinstven i postojati u isto vrijeme.

S druge strane, statične funkcije imaju tendenciju da daju više djelovanja koja ne pripadaju stvarnom svijetu ili objektu koji možete lako zamisliti. Ne zaboravite da su prethodnici C # C ++ i C, gdje možete jednostavno definirati globalne funkcije koje ne postoje u klasi. To daje više mogućnosti za programiranje od vrha do dna . Statičke metode mogu se koristiti u ovim slučajevima kada nema smisla da "objekt" obavlja zadatak. Čineći vas korištenjem klasa, olakšava grupiranje povezanih funkcija koje pomažu u stvaranju prikladnijeg koda.

Većina klasa može biti statična ili ne-statična, ali kada ste u nedoumici, vratite se svojim korijenima OOP-a i pokušajte razmišljati o tome što predstavljate. To je objekt koji izvodi radnju (automobil koji može ubrzati, usporiti, okrenuti se) ili nešto apstraktnije (na primjer, prikazivanje izlaza).

Obratite se svom internom OOP-u i nikada ne možete pogriješiti!

126
01 февр. Odgovor daje Despertar 01. veljače. 2012-02-01 05:50 '12 u 5:50 2012-02-01 05:50

Za C # 3.0, metode proširenja mogu postojati samo u statičkim klasama najviše razine.

35
27 окт. Odgovor dao Cidade Mark 27. \ t 2008-10-27 23:57 '08 u 11:57 2008-10-27 23:57

Ako koristite alate za analizu koda (na primjer, FxCop ), preporučujemo da označite static metodu ako se ova metoda ne odnosi na podatke instance. Razlog je u tome što postoji korist od učinka. MSDN: CA1822 - Označite članove kao statične .

To je više pravilo nego pravilo, stvarno ...

21
28 окт. odgovor dao user25306 28. listopada. 2008-10-28 00:39 '08 u 0:39 2008-10-28 00:39

Obično koristim statične klase za tvornice. Na primjer, ovo je klasa registracije u jednom od mojih projekata:

 public static class Log { private static readonly ILoggerFactory _loggerFactory = IoC.Resolve<ILoggerFactory>(); public static ILogger For<T>(T instance) { return For(typeof(T)); } public static ILogger For(Type type) { return _loggerFactory.GetLoggerFor(type); } } 

Možda ste čak primijetili da se IoC zove sa statičkim dodatkom. U većini slučajeva, za mene, ako možete pozvati statičke metode u klasi, sve što možete učiniti je označiti klasu kao statičku za jasnoću.

12
28 окт. odgovor daje Rob 28. listopada. 2008-10-28 00:11 '08 at 12:11 am 2008-10-28 00:11

Počeo sam koristiti statične klase kada želim koristiti funkcije, a ne klase, kao jedinicu za ponovnu upotrebu. Nekada sam bio sve o zlu statičkih klasa. Međutim, učenje F # navelo me da ih vidim u novom svjetlu.

Što mislim? Pa, recimo, kada razvijamo neki super DRY kod, dobivam hrpu razreda jedne metode. Mogu jednostavno dovesti te metode u statičku klasu, a zatim ih primijeniti na ovisnosti pomoću delegata. Također se dobro slaže s mojom Autofac ovisnom injekcijom (DI) spremnikom.

Naravno, izravna ovisnost o statičkoj metodi i dalje je obično zla (postoje neke nerazumne upotrebe).

9
01 июля '11 в 12:34 2011-07-01 12:34 Odgovor daje bentayloruk 1. srpnja '11 u 12:34 2011-07-01 12:34

Koristim statične klase kao sredstvo definiranja "dodatne funkcionalnosti" koju određeni tip objekta može koristiti u određenom kontekstu. Obično se ispostavi da su to korisne klase.

Osim toga, mislim da "Koristite statičku klasu kao jedinicu organizacije za metode koje nisu povezane s određenim objektima." dovoljno dobro opisati njihovu namjenu.

8
28 окт. odgovori dani Trap Oct 28. 2008-10-28 00:05 '08 u 0:05 2008-10-28 00:05

Statične su klase vrlo korisne i odvijaju se, na primjer, u knjižnicama.

Najbolji primjer koji mogu pružiti je klasa .Net Math, statički klasni prostor imena sustava, koji sadrži biblioteku matematičkih funkcija.

Kao i sve ostalo, koristite pravi alat za posao, i ako se ništa ne može zloupotrijebiti.

Prazno odbacivanje statičnih klasa kao pogrešno, a ne njihovo korištenje ili reći da "može postojati samo jedno" ili ne, jednako je pogrešno kao i njihovo korištenje.

C # .Net sadrži niz statičkih klasa koje se koriste na isti način kao i Math klasa.

Stoga su, s obzirom na ispravnu provedbu, iznimno korisni.

Imamo statičnu klasu TimeZone, koja sadrži brojne funkcije vremenske zone vezane uz poslovanje, nema potrebe stvarati nekoliko instanci klase na isti način kao i Math klasa, sadrži skup dostupnih funkcija (metoda) TimeZone statične klase.

8
05 янв. odgovor je dan 05. 2013-01-05 02:47 '13 u 2:47 2013-01-05 02:47

Ovo je još jedno staro, ali jako vruće pitanje, kako je OOP izbačen. Naravno, postoji mnogo razloga za korištenje (ili ne) statične klase, a većina njih je pokrivena mnogim odgovorima.

Jednostavno ću tome dodati 2 centa, govoreći da kreiram statičnu klasu kada je ova klasa nešto jedinstveno u sustavu, i stvarno je besmisleno imati bilo kakve primjerke u programu. velike klase. Nikad ne deklariram takve male klase kao u MSDN-u kao "statične" i, naravno, ne razrede koji će biti članovi drugih klasa.

Također bih želio naglasiti da su statičke metode i statička klasa dvije različite stvari. Glavni nedostaci spomenuti u prihvaćenom odgovoru su statičke metode. Statičke klase imaju istu fleksibilnost kao i redovne klase (u smislu svojstava i parametara), a sve metode koje se u njima koriste moraju biti relevantne za svrhu postojanja klase.

Dobar primjer, po mom mišljenju, kandidat za statičku klasu je klasa "FileProcessing", koja će sadržavati sve metode i svojstva relevantna za različite objekte za izvođenje složenih FileProcessing operacija. Teško je imati smisla imati više od jedne instance te klase i biti statična, što je čini dostupnom svemu što je u vašem programu.

7
17 окт. Odgovor dao ThunderGr 17. listopada 2014-10-17 10:46 '14 u 10:46 2014-10-17 10:46

Koristim samo statične klase za pomoćne metode, ali s pojavom C # 3.0 radije bih koristio metode proširenja za njih.

Rijetko koristim statičke klasne metode iz istih razloga zbog kojih rijetko koristim pojedinačni dizajn.

2
28 окт. odgovor dao jonnii 28. listopada 2008-10-28 00:00 '08 u 0:00 2008-10-28 00:00

Na temelju MSDN-a :

  • Ne možete stvoriti instancu za statične klase.
  • Ako klasa deklarirana kao statična, varijabla člana mora biti statična za tu klasu.
  • Zapečaćeno [Nije moguće naslijediti]
  • Nije moguće sadržavati konstruktor instance
  • Upravljanje memorijom

Primjer: Matematički izračuni (matematičke vrijednosti) se ne mijenjaju [STANDARDNO OBRAČUN ZA ODREĐENE VRIJEDNOSTI]

2
12 дек. Odgovor je dao Vicky 12. prosinca. 2014-12-12 09:57 '14 u 9:57 2014-12-12 09:57

Pogledajte ostala pitanja o oznakama ili postavi pitanje