Różnica między „ciągiem” a „ciągiem” w .NET i który jest najlepszy?

15

W .NET Framework, przynajmniej w języku C #, mamy dwie „wersje” typu ciągu:

  • "strunowy"
  • "Strunowy"

Wydaje się, że są one wymienne, ale czy naprawdę? Jeśli nie można ich zamieniać, czy ogólnie lepiej jest używać jednego zamiast drugiego i pod jakimi warunkami?

Cyberherbalist
źródło
1
Podobne do tego pytania: stackoverflow.com/q/6000517/6504
Agent_9191
2
Stylistycznie używam wersji z małymi literami, gdy mam na myśli typ, oraz wersji z dużymi literami, gdy wywołuję metodę statyczną System.String.
Joel Mueller
4
Identyczny z stackoverflow.com/questions/7074/… .
zzzzBov
2
stringnie istnieje w .net, istnieje tylko w języku C #.
CodesInChaos
1
Chociaż może to być nieco bardziej odpowiednie w przypadku przepełnienia stosu, nie sądzę, że jest to całkowicie nie na temat dla programistów, a ponieważ przepełnienie stosu ma już co najmniej jeden duplikat, migracja tego nie miałaby sensu. Więc przestań oflagować / zamknij głosowanie, aby przeprowadzić migrację, jeśli uważasz, że powinno to zostać zamknięte, to fajne, ale powinno być zamknięte, a nie migrowane.
yannis

Odpowiedzi:

30

Cóż, zgodnie z MSDN

string jest aliasem dla String w .NET Framework.

Gdzie w rzeczywistości jest „String” System.String.

Powiedziałbym, że są one wymienne i nie ma różnicy, kiedy i gdzie powinieneś użyć jednego lub drugiego.

Lepiej byłoby jednak zachować spójność z tym, którego użyłeś.

ChrisF
źródło
z jakiegoś powodu miałem w głowie, że String był klasowym opakowaniem wokół łańcucha o wartości wpisanej w wartość, co prowadzi do idei boksowania ... Czy mam rację?
Aaron Anodide,
1
@Gabriel No, String(a zatem stringwedług aliasu) są typami referencyjnymi.
Kris Harper
@Gabriel: czy Java nie robi tego z takimi rzeczami jak bajt kontra bajt?
whatsisname
Czy to samo dotyczy również Double vs double i innych typów danych?
Gavin Coates
1
@AaronAnodide Uważam, że jest to konwencja Java, prawdopodobnie o niej słyszałeś.
KChaloux
20

Jak wskazano, są one tym samym i stringsą tylko pseudonimem String.

Do tego, co warto, używam stringdo deklarowania typów - zmiennych, właściwości, zwracanych wartości i parametrów. Jest to zgodne z wykorzystaniem innych rodzajów systemów - int, bool, varetc (choć Int32i Booleansą również poprawne).

Używam, Stringgdy używam metod statycznych w klasie String, takich jak String.Split()lub String.IsNullOrEmpty(). Wydaje mi się, że ma to większy sens, ponieważ metody należą do klasy i jest to zgodne ze sposobem, w jaki używam innych metod statycznych.

Kirk Broadhurst
źródło
Korzystamy z tej konwencji również w pracy i podoba mi się. Mój mózg automatycznie nawiązuje połączenie.
SBI
4

Sugerowałbym użycie małych liter string. Wielkie litery Stringużyją pierwszej klasy o nazwie String, którą znajdzie w zaimportowanych przestrzeniach nazw ... czyli ogólnie System.String. Zamiast tego można użyć własnej klasy String.

Bryan Boettcher
źródło
3
Jeśli masz dwa różne typy importowane o tej samej nazwie i używasz tej nazwy bez kwalifikacji przestrzeni nazw, pojawi się błąd.
svick
Można oszukać Stringdo pracy, nigdy nie można oszukać string.
Bryan Boettcher,
Mimo to nie sądzę, żeby to był wystarczający powód do korzystania string.
svick
5
Jak „ktoś może się złamać” kontra „nikt nigdy się nie złamie”, a wszystko inne jest identyczne, co nie jest wystarczająco dobrym powodem?
Bryan Boettcher,
4

string jest słowem kluczowym C #, które jest po prostu aliasem dla System.String

... ale ponieważ jest to słowo kluczowe, edytor kolorowania składni / IDE wyświetli go w kolorze słowa kluczowego, tak samo jak int, double, jeśli, inaczej, itp. Stylistycznie możesz preferować użycie słowa kluczowego zamiast System.Stringtypu (lub zaraz Stringpo nim zrobiłaśusing System; ).

Jest to punkt nisza chociaż, chociaż bool, char, int, doublei stringsą wszystkie aliasy kluczowych dla typów systemów, stringjest nieparzysta jeden out, ponieważ jest to rodzaj odniesienia, a pozostałe są typy wartości.

JBRWilkinson
źródło
4
objectjest także aliasem słowa kluczowego dla typu referencyjnego
nikie 12.04
O tak, zapomniałem o tym wszystkim - dziękuję za przypomnienie.
JBRWilkinson
2

stringjest tylko pseudonimem String, ponieważ ostatecznie są takie same.

Można używać jak wolisz, chociaż zazwyczaj używają string, kiedy mam zamiar używać go tak jak prymitywny typ danych (podobnie jak int, floatlub bool) i Stringkiedy mam zamiar używać go jako obiektu / klasy. Na przykład:

string foo = "   ";
if (String.isNullOrWhitespace(foo)) 
{
    // ...
}

W powyższym przypadku planuję po fooprostu przechowywać tekst (efektywnie jako prymityw), więc używam string; jednak kiedy dzwonię String.isNullOrWhitespace(string), używam String. Robię to, ponieważ generalnie pierwsza litera nazw klas jest pisana wielkimi literami ( String), podczas gdy pierwsza litera prymitywów (takich jak int) nie jest.

BBB
źródło
-2

Łańcuch jest używany w przestrzeni nazw System.String, łańcuch jest używany w specyfikacji kompilatora C #, ponadto System.String jest wartością typu referencyjnego. Preferujemy zajmowanie się obiektami System, ciąg znaków wyłącznie w celach literalnych. System i system działają tak samo.

string TC = new System.String('/', 5);

Łańcuch służy również do porównywania, równości i innych celów.

Anjan Kant
źródło
4
wydaje się, że nie oferuje to nic istotnego w porównaniu do poprzednich 6 odpowiedzi
komara