Niedawno kolega z pracy powiedział mi, żebym nie używał string.Empty
przy ustawianiu zmiennej łańcuchowej, ale używał null
jej, ponieważ zanieczyszcza stos?
Mówi, że nie rób
string myString=string.Empty;
ale zrób string mystring=null;
Czy to naprawdę ma znaczenie? Wiem, że ciąg jest obiektem, więc ma sens.
Wiem, że to głupie pytanie, ale co o tym sądzisz?
string.Empty
,""
inull
wszystkie są wartościami stałymi, ale wszystkie są na tyle „proste”, że nie rozumiem, dlaczego przypisujesz je do zmiennej. Jeśli chcesz przechwycićout
zmienną, dlaczego po prostu nie użyćstring myString;
?String.Empty
; jeśli nie wiesz, czy ktoś ma drugie imię, którego używasznull
). Następnie, gdy masz już odpowiednie znaczenie, napisz kod w sposób, który jest wyraźnie poprawny i łatwy w utrzymaniu.Odpowiedzi:
null
iEmpty
są bardzo różne i nie sugeruję przypadkowego przełączania się między nimi. Ale nie ma żadnego dodatkowego „kosztu”, ponieważEmpty
jest to jedno stałe odniesienie (możesz go użyć dowolną liczbę razy).Na stosie nie ma „zanieczyszczeń” spowodowanych przez ldsfld - ta obawa jest… szalona. Załadowanie a
null
jest prawdopodobnie nieznacznie tańsze, ale może spowodować wyjątki zerowych odwołań, jeśli nie jesteś ostrożny podczas sprawdzania wartości.Osobiście nie używam żadnego ... Jeśli chcę mieć pusty ciąg, używam
""
- proste i oczywiste. Internowanie oznacza również, że nie ma narzutu na użycie.Na poziomie IL różnica między "" a Empty jest po prostu ldstr vs ldsfld - ale oba podają to samo pojedyncze wewnętrzne odwołanie do łańcucha. Co więcej, w nowszych wersjach .NET JIT przechwytuje je bezpośrednio, uzyskując odwołanie do pustego ciągu bez faktycznego wyszukiwania pól statycznych. Zasadniczo nie ma żadnego powodu, by się tym przejmować, z wyjątkiem czytelności. Po prostu używam „”.
źródło
""
zamiast sześciokrotnie dłuższego standardowego kodu. Kto popierał ten nonsens ?! @Jalal To, że publikacja Brada Abramsa jest poważnie przestarzała i jeśli kompilator nadal nie optymalizuje tych dwóch kodów, aby zrobić to samo, szkoda Microsoft! Ale nie naszym zadaniem jest naprawianie ich pracy. W rzeczywistości nie musimy: W drugim łączu Lasse (w komentarzach) porównał dane wyjściowe zespołu podczas porównywania z każdym wariantem: są one identyczne.""
będzie przeszukiwać całą pulę, aby sprawdzić, czy już tam jest, czy nie, i tak jest, gdystring.Empty;
użyje tej predefiniowanej wartości, a wyszukiwanie już nie będzie istniało . klasa również ujawniła te metody:string.Intern/IsInterned
sprawdź toNie `` zanieczyszcza stosu '', nie ma żadnego technicznego powodu, ale istnieje duża różnica między ustawieniem zmiennej na odniesienie do obiektu (nawet jeśli jest to pusty ciąg) a
null
. Nie są tym samym i powinny być używane na różne sposoby.null
powinien być używany do wskazania braku danych,string.Empty
(lub""
) do wskazania obecności danych, w rzeczywistości jakiegoś pustego tekstu. Czy istnieje konkretny przypadek, w którym nie masz pewności, co jest najbardziej odpowiednie?Edycja, dodane przykłady:
Możesz użyć
string.Empty
jako domyślnego przyrostka dla nazwiska osoby (większość ludzi na przykład nie ma doktoratu)Możesz użyć
null
dla opcji konfiguracji, która nie została określona w pliku konfiguracyjnym. W tym przypadkustring.Empty
zostanie użyty, jeśli opcja config była obecna, ale żądana skonfigurowana wartość byłaby pustym ciągiem.źródło
string.Empty
lub,""
gdy chcesz użyć pustego ciągu inull
gdy chcesz wskazać, że nie ma danych. Możesz użyćstring.Empty
jako domyślnego przyrostka dla nazwiska osoby (większość ludzi nie ma na przykład doktoratu) - inull
dla opcji konfiguracyjnej, która nie została określona w pliku konfiguracyjnym. W drugim przypadkustring.Empty
zostanie użyty, jeśli opcja config była obecna, ale żądana skonfigurowana wartość była pustym ciągiem.null
określenia „no postfix”?Są różni, jak inni już odpowiedzieli.
static void Main(string[] args) { string s1 = null; string s2 = string.Empty; string s3 = ""; Console.WriteLine(s1 == s2); Console.WriteLine(s1 == s3); Console.WriteLine(s2 == s3); } results: false - since null is different from string.empty false - since null is different from "" true - since "" is same as string.empty
Problem z zarządzaniem ciągami pustymi w porównaniu z ciągami zerowymi staje się problemem, gdy trzeba zachować go w płaskim pliku lub przesłać go za pomocą komunikacji, więc uważam, że może być przydatne dla innych, którzy odwiedzają tę stronę, aby dać dobre rozwiązanie ten konkretny problem.
W celu zapisania łańcuchów do pliku lub komunikacji:
prawdopodobnie będziesz chciał przekonwertować łańcuch na bajty.
dobrą praktyką, którą polecam, jest dodanie 2 segmentów bajtów nagłówka do przekonwertowanego ciągu.
segment 1 - metainformacja, która jest przechowywana w 1 bajcie i opisuje długość następnego segmentu.
segment 2 - zawiera długość zapisywanego ciągu.
przykład:
string "abcd" - dla uproszczenia przekonwertuję go za pomocą kodera ASCII i otrzymam {65,66,67,68}.
Oblicz segment 2 da 4 - więc 4 bajty to długość przekonwertowanego ciągu.
obliczyć segment 1 daje 1 - ponieważ tylko 1 bajt został użyty do przechowywania informacji o długości przekonwertowanej informacji ciągu (czyli 4, tj. gdyby było to 260, dostałbym 2)
Nowy pasek bajtów będzie miał teraz wartość {1,4,65,66,67,68}, który można zapisać do pliku.
Zaletą w odniesieniu do tematu jest to, że gdybym miał pusty ciąg do zapisania, otrzymałbym z konwersji pustą tablicę bajtów o długości 0 i po obliczeniu segmentów otrzymam {1,0}, które może być zapisane, a później załadowane i zinterpretowane z powrotem w pusty łańcuch. Z drugiej strony, gdybym miał wartość null w swoim ciągu, miałbym tylko {0} jako moją tablicę bajtów do zapisania, a po załadowaniu można zinterpretować z powrotem do null.
Istnieje więcej korzyści, takich jak wiedza o rozmiarze do załadowania lub zgromadzenia, jeśli zerwasz wiele ciągów.
Wracając do tematu - to… cóż, w pewnym sensie zanieczyści stos, ponieważ te same opisane zasady są używane przez każdy system do rozróżniania wartości null od pustych .. więc tak, string.Empty zajmuje więcej pamięci niż null, chociaż nie zrobiłbym tego nazwij to zanieczyszczeniem ... to tylko 1 bajt więcej.
źródło
Odpowiedziano mu na śmierć, ale zero oznacza brak wartości, nie zainicjowano. string.Empty oznacza „” (pusty ciąg), tak jak podano w MSDN.
Najbezpieczniejszym sposobem sprawdzenia pustego lub zerowego ciągu jest użycie string.IsNullOrEmpty.
źródło
FWIW, znalazłem to miksowanie
""
iString.Empty
nie działa:var a = ""; alert("a " + (a == "") + ", " + (a==String.Empty)); //Yields "a true, false" var b = String.Empty; alert("b " + (b == "") + ", " + (b == String.Empty)); //Yields "b false, true"
W szczególności, jeśli użyjesz
$.trim
do pobrania wartości pustego pola wejściowego DOM, a następnie porównaj ją zString.Empty
, otrzymaszfalse
. Nie wiem, dlaczego tak jest, ale proszę bardzo. Teraz po prostu używam""
wszędzie dla spójności.źródło
.Length==0
lub używania.Compare()