string
vs. String
- це не дискусія про стиль
[...]
Ключове слово string
має конкретне значення в C #. Це тип, System.String
який існує в базовій збірці для виконання. Виконання по суті розуміє цей тип і надає можливості, які розробники очікують для рядків у .NET. Його присутність настільки важлива для C #, що якщо цього типу немає, компілятор вийде, перш ніж спробувати проаналізувати рядок коду. Отже, string
має чітке, однозначне значення у коді C #.
Хоча ідентифікатор String
не має конкретного значення в C #. Це ідентифікатор, який проходить через усі правила пошуку імен як Widget
, Student
і т. Д. ... Він може прив'язуватися до рядка або може прив'язуватися до типу в іншій збірці, цілі якої можуть бути зовсім іншими, ніж string
. Гірше, що його можна було б визначити таким чином, як код String s = "hello"
; продовжували складати.
class TricksterString {
void Example() {
String s = "Hello World"; // Okay but probably not what you expect.
}
}
class String {
public static implicit operator String(string s) => null;
}
Фактичний зміст String
завжди буде залежати від дозволу імені. Це означає, що це залежить від усіх вихідних файлів у проекті та всіх типів, визначених у всіх посиланих збірках. Коротше кажучи це вимагає зовсім небагато контексту , щоб знати , що це означає.
Правда, що в переважній більшості випадків String
і string
буде прив'язуватися до одного типу. Але використовуючи String
все-таки засоби, розробники залишають свою програму до інтерпретації в місцях, де є лише одна правильна відповідь. Коли String
прив'язується до неправильного типу, він може залишати розробникам налагодження годинами, подавати помилки в команду компілятора і, як правило, витрачати час, який можна було врятувати за допомогою string
.
Ще один спосіб візуалізації різниці - за допомогою цього зразка:
string s1 = 42; // Errors 100% of the time
String s2 = 42; // Might error, might not, depends on the code
Багато хто буде стверджувати, що хоча це технічно точна інформація String
, все-таки добре, оскільки надзвичайно рідко база коду визначає тип цього імені. Або що коли String
визначено, це ознака поганої бази коду.
[...]
Ви побачите, що String
визначено для ряду цілком дійсних цілей: помічники відображення, бібліотеки серіалізації, лексеми, протоколи тощо ... Для будь-якої з цих бібліотек String
протиправда string
реальні наслідки залежно від того, де використовується код.
Тому пам’ятайте, коли ви бачите String
проти string
дебатів, це стосується семантики, а не стилю. Вибір рядка надає чітке значення вашій кодовій базі. Вибір String
не є помилковим, але він залишає відкритими двері для сюрпризів у майбутньому.
Примітка. Більшість публікацій блогу я копіюю / вставляю з причини архіву. Я ігнорую деякі частини, тому рекомендую пропустити та прочитати допис у блозі, якщо можете.
string
це лексична конструкція граматики C #, тоді якSystem.String
це лише тип. Незалежно від явної різниці, що згадується в будь-якій специфікації, все ж є ця неявна різниця, яка могла б відповідати деякій двозначності. Мова сама повинна підтримуватиstring
таким чином, що реалізація не (цілком) настільки зобов'язана розглянути для певного класу в BCL.