Pytanie w sprawie vb.net, .net, string – Manipulacja ciągiem za pomocą & lub + w VB.NET

24

Widziałem kilku programistów& i+ do manipulacji ciągiem.

Jak na przykład:

dim firstvar as string
dim secondvar as string
dim thirdvar as string

thirdvar = firstvar & secondvar

Albo to jest:

thirdvar = firstvar + secondvar

Czy to ma znaczenie? Jeśli tak, to dlaczego?

Twoja odpowiedź

6   odpowiedzi
3

zawsze będzie łączyć ciągi znaków bez względu na typy argumentów, podczas gdy + nie będzie. Ponieważ nie ma żadnej wady w używaniu & over + w inny sposób, w sytuacjach, w których wyraźnie pożądane jest łączenie łańcuchów, jest to preferowane. Sprawia również, że intencje kodu są nieco jaśniejsze.

52

+ i& operatorzy sąnie identyczne w VB.NET.

Używając& operator wskazuje zamiar połączenia łańcuchów, podczas gdy+ operator wskazuje zamiar dodania liczb. Używając& operator przekształci obie strony operacji w łańcuchy. Gdy masz mieszane typy (jedna strona wyrażenia jest ciągiem, a druga liczbą), użycie operatora określi wynik.

1 + "2" = 3 'This will cause a compiler error if Option Strict is on'
1 & "2" = "12"
1 & 2 = "12"
"text" + 2 'Throws an InvalidCastException since "text" cannot be converted to a Double'

Tak więc moją wytyczną (poza unikaniem takich rodzajów mieszania) jest użycie& podczas łączenia łańcuchów, aby upewnić się, że twoje intencje są jasne dla kompilatora, i unikaj niemożliwych do znalezienia błędów związanych z użyciem+ operator do konkatenacji.

Dziekuje za przypomnienie. Zawsze o tym zapominam (z powodów, które opisałem w mojej nowej edycji). Reed Copsey
Najlepsze praktyki MS wymagają użycia i łączenia podczas łączenia łańcuchów. Dobre rozmowy bdukes. Walter
Dobrze zrobione bdukes. Więc mimo wszystko miałem rację, mimo że tego nie wiedziałem, lol. Bob Mc
Właśnie wpadłem na problem za pomocą+ zamiast&. Zrobiłem coś takiego:<%# ResolveUrl("~/page.aspx?id=" + Eval("Id")) %>. Ponieważ ID jestInteger, VB próbuje przekonwertować lewą stronę (URL) na typ liczbowy i zgłasza wyjątek, gdy nie może. bdukes
0

to zależyciężko co łączysz.

Krótko mówiąc, użyłbym„&” dla ciągów znaków i„+” tylko dla operacji arytmetycznych

Czemu? Spojrzeć nahttps://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/addition-operator#remarks

Wszystkie te kombinacje z przełączaniemścisły-opcja jest jak rzucanie kostką dla kompilatora ... i nigdy nie jest oczywiste dla czytelnika.

Dodam teżhttps://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/operators-and-expressions/concatenation-operators#differences-between-the-two-concatenation-operators z jasnym stwierdzeniem:

Operator + ma główny cel dodania dwóch liczb.

5

czy lepiej użyć String.Format podczas łączenia łańcuchów. Zazwyczaj kod kończy się tym bardziej sensownie.

Ponadto, jeśli łączysz wiele razy, rozważ użycie StringBuilder zamiast String.

2

zypadku konkatenacji ciągów, ale nie jest uważany za poprawny i czasami powoduje niezamierzone wyniki.

Nie jest to już prawdą w VB.NET - VB6 i wcześniejsze były w ten sposób - vb.net używa operatora środowiska wykonawczego .NET + na ciągach znaków, który jest doskonale obsługiwany. & jest aliasem do tego w VB.NET. Reed Copsey
Zobacz moją odpowiedź poniżej dla niezamierzonego wyniku bdukes
Reed ma rację, moje długie doświadczenie VB6 doprowadziło mnie do nieprawidłowej odpowiedzi. Przetestowałem oba w VB.Net i oba działają poprawnie. Jednak nadal używałbym ampersand dla jasności, jak zauważył inny plakat. Bob Mc
Jakie niezamierzone wyniki? Robert Harvey
Kiedy przyniesie niezamierzone wyniki? Proszę wyjaśnić, aby uzyskać pełną odpowiedź. jvanderh
2

p;” zapewnia zgodność wsteczną w VB 6 i wcześniejszych wersjach, gdzie & był operatorem łączenia łańcuchów, a + nie działał dla tekstu.

Istnieje różnica, jeśli jeden z twoich argumentów nie jest łańcuchem, jakbdukes zauważył. Jednak w tej sytuacji zdecydowanie polecam użycie String.Format lub StringBuilder (w zależności od liczby / typów operacji) do skonstruowania ciągu wynikowego z typów mieszanych.

Ogólnie polecam używanie + z jednego powodu. Jeśli kiedykolwiek zdecydujesz się przetłumaczyć kod na inny język (np. C #), operator + dopasuje więcej do wersji przetłumaczonej. Prawdopodobnie łatwiej będzie ludziom pochodzącym z innego języka zrozumieć i przestrzegać twojego kodu.

Nie polecamString.Format() ponad wszystko, a tym bardziej dedykowany operator&, aby połączyć łańcuchy. Ja też nie polecamStringBuilder gdy liczba ciągów wejściowych jest znana z wyprzedzeniem, ponieważString.Concat (które są Czym& rozwinie się w celu wywołania połączonego) jest szybszy i& samo będzie jaśniejsze. Pavel Minaev
Oni sąnie identyczne w VB.NET, zobacz moją odpowiedź na szczegóły. bdukes
Edytowana odpowiedź w celu skompensowania. Reed Copsey
Dobry punkt - zawsze o tym zapominam (choć nigdy nie widzę, że robię 1 i „2” jako coś, co uważam za właściwe;)) Reed Copsey
@Pavel: Nie użyłbyś string.format, jeśli jeden z twoich operandów NIE JEST łańcuchem? To właśnie zasugerowałem wyraźnie. Reed Copsey

Powiązane pytania