Питання Яка різниця між рядком та рядком в C #?


Приклад (зверніть увагу на справу):

string s = "Hello world!";
String s = "Hello world!";

Що таке? керівні принципи для користування кожним? І що це таке відмінності?


5362


походження


@ O.R.Mapper, але факт залишається таким string це лексичний побудова C # граматика в той час як System.String це просто тип. Незалежно від будь-якого явний Різниця, згадана в будь-якому специфікації, все ще існує ця неявна різниця, яку можна було б задовольнити з деякою невизначеністю. Сама мова повинен підтримка string таким чином, що реалізація не є (досить) такою обов'язковою для розгляду для певного класу в BCL. - Kirk Woll
@KirkWoll: відповідно до специфікації мови сама мова повинен розглянемо string бути точно таким же, як і тип BCL System.String, більш нічого. Це не двозначно взагалі. Звичайно, ви можете реалізувати свій власний компілятор, використовуючи граматику C #, і використовувати всі знайдені токени для чогось довільного, не пов'язаного з тим, що визначено в специфікації мови C #. Проте вихідна мова буде виключно C #, вона не може розглядатися як C #. - O. R. Mapper
Ви можете використовувати string без використання директиви для системи. Ви не можете це зробити String. - Wilsu
Для когось, що йде від Алгола і Фортрана, це обговорення показує, що з чим-то не так string. Треба скоротити System.String, але, як псевдонім, це здається дуже схожим, але не зовсім однаково. Проте, після декількох років роботи C #, я б сказав, що безпечно просто користуватися string і string.Format() і не турбуйтеся System.String. - Roland
Якщо цього питання запитали в 2017 році, він отримав би 4000 нижніх частот, 2000 посилань на сторінку класу MSDN String і закрив як не продуктивний. - IRGeekSauce


Відповіді:


string є псевдонімом в C # для System.String.
Так що технічно немає ніякої різниці. Це як int  проти  System.Int32.

Що стосується рекомендацій, це загалом рекомендується використовувати string будь-який час, коли ви маєте на увазі об'єкт.

наприклад,

string place = "world";

Аналогічно, я думаю, що це загалом рекомендується використовувати String якщо вам потрібно конкретно посилатися на клас.

наприклад,

string greet = String.Format("Hello {0}!", place);

Це стиль, який Microsoft прагне використовувати їх приклади.

Видається, що керівництво в цій області, можливо, змінилося, як StyleCop тепер забезпечує використання спеціальних псевдонімів C #.


5097



Якщо ви вирішите використовувати StyleCop і слідуйте за цим, це буде сказати, що використовувати типи, специфічні для мови. Так що для C # у вас буде рядок (замість String), int (замість Int32), плаваю (замість одиночного) - stylecop.soyuz5.com/SA1121.html - Dominic Zukiewicz
Я завжди використовую псевдоніми, тому що я вважаю, що в один прекрасний день це може стати в нагоді, тому що вони виконують роль абстракції, тому їх зміни можуть бути змінені без необхідності знати. - Rob
Visual Studio 2015 говорить про те, що String.Format слід змінити на string.Format, тому я думаю, що Microsoft йде таким чином. Я також завжди використовував String для статичних методів. - Sami Kuhmonen
Оскільки я прочитав ці повідомлення, я помітив, що деякі коментарі просто неправильні. @ DRAirey1 У часі, ви побачите, що старий спосіб залишається найкращим, якщо ви сумніваєтеся в цьому, я смію спробувати написати код C # без використання Visual Studio. Це практично неможливо, і ситуація, яка час від часу виникає в роботі веб-розробки. @ Влада Вам не потрібно імпортувати що-небудь, щоб використовувати String. @ Абхі Ваш коментар є безглуздим і однаково справедливим для string.Format(). @KlitosG Ні, це не так. Всі вони працюють однаково. - krowe2
Не могли б ви додати зауваження, що насправді є різниця? Наприклад: nameof(string) не збиратиметься в той час як nameof(String)воля - Jeroen Vannevel


Тільки для повноти, ось мозковий звалище пов'язаної інформації ...

Як зазначають інші, string є псевдонімом для System.String. Вони компілюються з тим самим кодом, тому під час виконання немає ніякої різниці. Це лише одна з псевдонімів у C #. Повний список:

object:  System.Object
string:  System.String
bool:    System.Boolean
byte:    System.Byte
sbyte:   System.SByte
short:   System.Int16
ushort:  System.UInt16
int:     System.Int32
uint:    System.UInt32
long:    System.Int64
ulong:   System.UInt64
float:   System.Single
double:  System.Double
decimal: System.Decimal
char:    System.Char

Окремо від string і object, псевдоніми є всі, щоб оцінити типи. decimal це тип значення, але не примітивний тип у CLR. Єдиний примітивний тип, який не має псевдоніму System.IntPtr.

У специфікації псевдоніми типового типу відомі як "прості типи". Літерала можна використовувати для постійних значень кожного простого типу; жоден інший тип цінності не має літерних форм. (Порівняйте це з VB, що дозволяє DateTime літерами, і для нього це псевдонім).

Є одна обставина, в якій ти мати використовувати псевдоніми: коли явно вказано основний тип enum. Наприклад:

public enum Foo : UInt32 {} // Invalid
public enum Bar : uint   {} // Valid

Це лише питання способу, який специфікація визначає декларації enum - частина після товстої кишки повинна бути інтегральний тип виробництво, яке є одним жетоном Росії sbyte, byte, short, ushort, int, uint, long, ulong, char... на відміну від a тип продукція, що використовується, наприклад, для змінних декларацій. Це не вказує на будь-яку іншу різницю.

Нарешті, коли мова заходить про те, що використовувати: особисто я використовую псевдоніми скрізь для реалізації, але тип CLR для будь-яких API. Це дійсно неважливо, надто багато, яке ви використовуєте з точки зору впровадження - узгодженість між вашою командою добре, але ніхто інший не буде піклуватися. З іншого боку, це дійсно важливо, якщо ви посилаєтеся на тип в API, ви робите це нейтральним чином. Метод називається ReadInt32 однозначно, тоді як метод називається ReadInt вимагає тлумачення. Зателефонувач може використовувати мову, яка визначає int псевдонім для Int16, наприклад. Конструктори платформ .NET дотримуються цієї моделі, на прикладі яких є хороші приклади BitConverter, BinaryReader і Convert заняття


3037



Цікава ситуація у спадщині з enum. Чи можете ви вказати на документацію, чому псевдонім слід використовувати для переліку? Або це відома помилка? - JaredPar
Це в розділі 14.1 специфікації (я не можу тут цитувати, так як це занадто довго). Це не явно говорить, що ви повинні використовувати псевдонім, але псевдоніми є різновид розглядаються як свої власні типи. Все це трохи дивно. - Jon Skeet
@PiPeep, що більш вражаюче, ніж велика кількість upvotes, - це вражаюча низька кількість downvotes (враховуючи, що у перших 5 публікаціях загалом більше 2000 upvotes, і все це лише 1 downvote серед усіх). Особливо, коли ви впливаєте на те, що в будь-якій спільноті завжди є "ненависниками", я дійсно вважаю, що це просто неймовірно. - corsiKa
Одна цікава різниця між string і String чи це string' is a keyword in c#, so you can not use it as a variable name.For Ex: string string = "hi";//compiler error, but String String = "hi"; "прийнятний, як String це ідентифікатор, а не ключове слово. - Sanjeev Rai
@ SangjeevRai: Так. Ви можете використовувати @string створити ідентифікатор, який закінчується як string хоча Це свого роду механізм уникнення. - Jon Skeet


String виступає за System.String і це тип .NET Framework. string є псевдонімом в мові C # для System.String. Обидві з них складені до System.String в Іл(Середня мова), так що різниці немає. Виберіть те, що вам подобається, і використовуйте його. Якщо ви кодуєте в C #, я б вважав за краще string оскільки це псевдоніми типу C # і добре відомі програмістам C #.

Я можу сказати те ж саме про (int, System.Int32) тощо.


608



`Якщо ви кодуєте в C #, я б вважав за краще рядок, оскільки це псевдонім типу C # і добре відомий програмістам C # - коли б C # не знав .NET Framework. +1, як я думаю, взагалі це найкраща відповідь, але те, що я згадую, здається дивним. - MyDaftQuestions
Я особисто вважаю за краще використовувати "Int32", оскільки він відразу показує діапазон значення. Уявіть собі, якщо вони оновили тип "int" на пізніших більш бітних системах. 'int' в c очевидно розглядається як "цілий тип, який цільовий процесор найбільш ефективно працює з", і визначається як "принаймні 16 біт". Я віддаю перевагу передбачувану послідовність там, дякую вам дуже багато. - Nyerguds
@MyDaftQuestions Я згоден. Якщо що-небудь було б сенс послідовно використовуйте типи .net тому що вони мови неосвічені і тип очевидний, незалежно від будь-якої мови (чи знаю всі ідентичності F # або VB?). - Peter A. Schneider


Найкраща відповідь, яку я коли-небудь чула про використання псевдоніму типу наданого типу в C #, походить від Джеффрі Ріхтера в його книзі CLR Via C #. Ось його 3 причини:

  • Я бачив безліч розробників, не знаючи, чи використовувати рядок або Строка в їх коді. Оскільки в C # рядок (ключове слово) точно відображає System.String (тип FCL), різниця не існує і не може бути використана.
  • У C # довго карти до System.Int64, але на іншій мові програмування довго міг картувати до Int16 або Int32. По суті, C ++ / CLI насправді ставиться до довгого як Int32. Хтось, хто читає вихідний код однією мовою, може легко неправильно тлумачити наміри коду, якщо він або вона використовувалися для програмування на іншій мові програмування. Фактично, більшість мов навіть не ставитимуться довго як ключове слово, і не збиратиме код, який його використовує.
  • FCL має безліч методів, які мають назви типу як частину їх імен методу. Наприклад, BinaryReader тип пропонує такі методи, як ReadBoolean, ReadInt32, ReadSingle, і так далі, і System.Convert тип пропонує такі методи, як ToBoolean, ToInt32, ToSingle, і так далі. Незважаючи на те, що правильно писати наступний код, лінія з поплавцем відчуває себе дуже неприродною для мене, і це не очевидно, що лінія правильна:
BinaryReader br = new BinaryReader(...);
float val  = br.ReadSingle(); // OK, but feels unnatural
Single val = br.ReadSingle(); // OK and feels good

Так що у вас є це. Я думаю, що це всі дійсно хороші моменти. Тим не менше, я не використовую пораду Джефрі в своєму власному коді. Може бути, я занадто застряг в моєму C # світі, але в кінцевому підсумку я намагаюся зробити мій код виглядати як кодова рамка.


411



Друга точка звучить насправді як причина ні використовувати string, int тощо. - MauganRa
@MauganRa І передбачається, що автор книги перераховує ті причини, чому він не використовує псевдоніми - tomi.lee.jones
"Якщо хтось читає вихідний код C #, він повинен тлумачити довгий час відповідно до специфікації мови, а не іншими мовами." Це повністю пропускає точку зору. Це не що інше має намір щоб неправильно тлумачити код, для мозку просто простіше підійти до неправильного висновку, коли тип має інше значення, ніж той, що програміст бачить щодня в іншому контексті. Всі ми робимо помилки; Використання явно названих типів робить ці помилки менш ймовірними. - Darryl
+ Ці причини підсумовують мої почуття з цього приводу. Коли я вперше почав кодування в C # (виходячи з фону Java / C ++ / C), я думав, що псевдоніми були потворними. Я все ще відчуваю цей шлях, на жаль, більша частина світу, здається, не згодні зі мною, або їм все одно, і тому використовуйте нижні регістри. - gusgorman
@ Jinzai питання полягає в C #, в якому longвизначається як підписане 64-бітне ціле число незалежно від платформи або компілятора. Так що в деяких випадках, принаймні, так, це робить залежить від мови. - phoog


string це зарезервоване слово, але String це просто назва класу. Це означає що string не може використовуватися як ім'я змінної самостійно.

Якщо з якоїсь причини ви хочете змінену назву рядок, ви побачите лише перший з цих компіляцій:

StringBuilder String = new StringBuilder();  // compiles
StringBuilder string = new StringBuilder();  // doesn't compile 

Якщо ви дійсно хочете назву змінної назви рядок ви можете використовувати @ як префікс:

StringBuilder @string = new StringBuilder();

Ще одна критична різниця: переповнення стек виділяє їх по-різному.


380



Майте на увазі, що виклик місцевого @string це дійсно досить безглуздо, оскільки назви місцевих жителів присутні лише у ПРБ. Може так і назвати це _string або щось. Це має сенс для речей, які мають імена, доступні через відображення, де назва імені @string член буде "string". - Roman Starkov
Також майте на увазі, використовуючи зарезервоване слово, оскільки ім'я змінної є грубо неелегантним. - Elton
"Переповнення стеків виділяє їх по-різному". Більше немає причин :) - Ole Albers
OP не хоче використовувати String або string як ім'я змінної. Вони попросили пояснити різницю між цими Типи. Ваша відповідь лише служить для додавання більшої плутанини IMO - Matt Wilko


Є одна різниця - Ви не можете користуватися String без using System; заздалегідь


327



За замовчуванням більшість людей додають це будь-яким способом у верхній частині файлу. VS робить це за замовчуванням у більшості випадків не всіх! - IbrarMumtaz
За замовчуванням я лише додаю using висловлювання, які я потребую, і явно вилучити все те, що ні. Інструменти для енергозбереження> "[x] Видалити та відформатувати використання в режимі збереження" - JMD
@JMD Я змінив файл шаблону .cs, так що він навіть не має будь-яких заяв на використання на вершині! Я також змінив шаблон класу на internal sealed. - ErikE


Це було розглянуто вище; однак, ви не можете використовувати string в рефлексії; ви повинні використовувати String.


269





System.String це клас string .NET - в C # string є псевдонімом для System.String - так у використанні вони однакові.

Що стосується керівних принципів, я б не надто затоплений і просто використовуйте те, що вам подобається - у житті є ще більш важливі речі, і код у будь-якому випадку буде таким самим.

Якщо ви опинитеся в системах побудови, де потрібно вказати розмір цілих чисел, які ви використовуєте, і тому вони мають тенденцію використовувати Int16, Int32, UInt16, UInt32 то це може виглядати більш природно використовувати String- і при переміщенні між різними мовами .net це може зробити речі більш зрозумілими - інакше я б використовувати string і int.


204



+1 для того, щоб заявити, що в житті є ще більш важливі речі, я відчуваю, що це ще один стек-перехід мільйонів людей, які можуть вирішити питання про тривіальний має місце: en.wikipedia.org/wiki/Parkinson_law_of_triviality - Sebastian
Просто виберіть один і бути послідовним. Якщо ви працюєте десь із домашнім стилем, використовуйте його. - Alan B
на жаль, стиль є особистим уподобанням, і може бути занадто дорогим, щоб забезпечити виконання великою кодову базу в декількох команд без спеціального власника коду. завжди важливіші питання, а не рядки проти рядків. що повертає нас до "більш важливих речей у житті" - aiodintsov