Каково различие между Строкой и строкой в C#?

Короткие и простые: поскольку элементы, которые вы ищете, не существуют в документе (пока).


В оставшуюся часть этого ответа я буду использовать getElementById как пример, но то же самое относится к getElementsByTagName , querySelector и любому другому методу DOM, который выбирает элементы.

Возможные причины

Есть две причины, по которым элемент может не существовать:

  1. Элемент с переданным идентификатором действительно не существует в документе. Вы должны дважды проверить, что идентификатор, который вы передаете на getElementById, действительно соответствует идентификатору существующего элемента в (сгенерированном) HTML и что у вас не было с ошибкой идентификатор (идентификаторы чувствительный !). Кстати, в большинстве современных браузеров , которые реализуют методы querySelector() и querySelectorAll(), нотация стиля CSS используется для извлечения элемента его id, например: document.querySelector('#elementID'), в отличие от способа, с помощью которого элемент извлекается его id в [[16]; в первом символе # необходимо, во втором это приведет к тому, что элемент не будет извлечен.
  2. Элемент не существует в данный момент , который вы вызываете getElementById ].

Последний случай довольно распространен. Браузеры анализируют и обрабатывают HTML сверху вниз. Это означает, что любой вызов элемента DOM, который встречается до появления этого элемента DOM в HTML, не будет выполнен.

Рассмотрим следующий пример:



Появляется div после script. В настоящий момент сценарий выполняется, элемент не существует , но и getElementById вернут null.

jQuery

То же самое относится к все селекторы с jQuery. jQuery не найдет элементов, если вы ошибочно написали ваш селектор, или вы пытаетесь выбрать их , прежде чем они на самом деле существуют .

Добавленный поворот - это когда jQuery не найден потому, что вы загрузили скрипт без протокола и запускаетесь из файловой системы:


этот синтаксис используется, чтобы позволить сценарию загружаться через HTTPS на странице с протоколом https: // и для загрузки HTTP-версии на странице с протоколом http: //

У этого есть неудачный побочный эффект попытки и невозможность загрузить file://somecdn.somewhere.com...


Решения

Прежде чем позвонить getElementById (или любой метод DOM, если на то пошло), убедитесь, что существуют элементы, к которым вы хотите получить доступ, т.е. загружается DOM.

Это может быть обеспечено просто добавив ваш JavaScript после к соответствующему элементу DOM

, и в этом случае вы также можете поместить код непосредственно перед тегом закрывающего тела () (все DOM элементы будут доступны в момент выполнения скрипта). [/ g3 6]

Другие решения включают прослушивание событий load [MDN] или DOMContentLoaded [MDN] . В этих случаях не имеет значения, где в документе вы помещаете код JavaScript, вам просто нужно запомнить, чтобы весь обработчик DOM обрабатывался в обработчиках событий.

Пример:

window.onload = function() {
    // process DOM elements here
};

// or

// does not work IE 8 and below
document.addEventListener('DOMContentLoaded', function() {
    // process DOM elements here
});

Более подробную информацию об обработке событий и различиях браузера см. в статьях на странице quirksmode.org .

jQuery

Сначала убедитесь, что jQuery загружен правильно , Используйте инструменты разработчика браузера , чтобы узнать, был ли найден файл jQuery и исправлен ли URL-адрес, если он не был (например, добавьте схему http: или https: в начале, отрегулируйте путь, и т. д.)

Прослушивание событий load / DOMContentLoaded - это именно то, что делает jQuery с .ready() [docs] . Весь ваш код jQuery, который влияет на элемент DOM, должен находиться внутри этого обработчика событий.

На самом деле в учебнике j8uery явно указано:

Как почти все, что мы делаем при использовании jQuery, читает или манипулирует объектной моделью документа (DOM), мы должны убедиться, что мы начинаем добавлять события и т. д., как только DOM готов.

Для этого мы регистрируем готовое событие для документа.

$(document).ready(function() {
   // do stuff when DOM is ready
});
blockquote>

В качестве альтернативы вы также можете использовать сокращенный синтаксис:

$(function() {
    // do stuff when DOM is ready
});

Оба эквивалентны.

6235
задан 23 revs, 19 users 12% 27 June 2018 в 06:42
поделиться

21 ответ

string псевдоним в C# для System.String .
Так технически, нет никакого различия. Это похоже int по сравнению с [1 114] System.Int32 .

До инструкций, обычно рекомендуется использовать string любое время, которое Вы отсылаете к объекту.

, например,

string place = "world";

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

, например,

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

Это - стиль, который Microsoft склонна использовать в [1 111] их примеры .

кажется, что руководство в этой области, возможно, изменилось, как [1 112], StyleCop теперь осуществляет использование определенных псевдонимов C#.

5843
ответ дан 26 revs, 21 users 26% 22 November 2019 в 19:37
поделиться

Только ради полноты, вот "разгрузка мозга" сопутствующей информации...

, Поскольку другие отметили, 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 литералы и имеет псевдоним для него также.)

существует одно обстоятельство, при котором Вы имеете для использования псевдонимов: явно определяя базовый тип перечисления. Например:

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

Это - просто вопрос способа, которым спецификация определяет перечислимые объявления - часть после того, как двоеточие должно быть целочисленный тип производство, которое является одним маркером sbyte, byte, short, ushort, int, uint, long, ulong, char... в противоположность производство типа , как используется объявлениями переменной, например. Это не указывает ни на какое другое различие.

Наконец, когда дело доходит до которого можно использовать: лично я использую псевдонимы везде для реализации, но типа CLR для любых API. Это действительно не имеет значения слишком много, который Вы используете с точки зрения реализации - непротиворечивость среди Вашей команды хороша, но никто еще не собирается заботиться. С другой стороны, по-настоящему важно, чтобы, если Вы обращаетесь к типу в API, Вы сделали так на языке нейтральный путь. Метод, названный ReadInt32, однозначен, тогда как метод, названный ReadInt, требует интерпретации. Вызывающая сторона могла использовать язык, который определяет int псевдоним для [1 121], например. Разработчики платформы.NET следовали за этим шаблоном, хорошие примеры, находящиеся в BitConverter, BinaryReader и Convert классы.

3331
ответ дан 12 revs, 8 users 63% 22 November 2019 в 19:37
поделиться

String обозначает System.String, и это - тип Платформы.NET. string псевдоним на языке C# для System.String. Они оба компилируются в [1 111] System.String на (промежуточном языке) IL , таким образом, нет никакого различия. Выберите то, что Вы любите и используете это. Если бы Вы кодируете в C#, я предпочел бы string, поскольку это - псевдоним типа C# и известный программистами C#.

я могу сказать то же [приблизительно 1 112] (int, System.Int32) и т.д.

687
ответ дан 3 revs, 3 users 57% 22 November 2019 в 19:37
поделиться

Лучший ответ, который я когда-либо слышал об использовании обеспеченных псевдонимов типа в C#, появляется от Jeffrey Richter в его книжный CLR Через C#. Вот его 3 причины:

  • я видел много смущенных разработчиков, не зная, использовать ли строка или Строка в их коде. Поскольку в C# строка (ключевое слово) отображается точно на Систему. Строка (тип FCL), нет никакого различия, и любой может использоваться.
  • В C#, длинный карты к [1 111] Система. Int64, но на различном языке программирования, длинный мог отобразиться на Int16 или Int32. На самом деле C++ / CLI действительно на самом деле рассматривает долго как Int32. Кто-то читающий исходный код на одном языке мог легко неправильно истолковать намерение кода, если бы он привык программировать на различном языке программирования. На самом деле большинство языков не будет даже рассматривать длинный как ключевое слово и не скомпилирует код, который использует его.
  • FCL имеет много методов, которые имеют имена типов как часть их имен методов. Например, тип BinaryReader предлагает методы такой как [1 118] ReadBoolean, ReadInt32, ReadSingle, и так далее, и Система. Преобразуйте , тип предлагает методы такой как [1 122] ToBoolean, ToInt32, ToSingle, и так далее. Хотя законно записать следующий код, строку с чувствами плавающими, очень неестественными мне, и не очевидно, что строка корректна:
BinaryReader br = new BinaryReader(...);
float val  = br.ReadSingle(); // OK, but feels unnatural
Single val = br.ReadSingle(); // OK and feels good

, Таким образом, там у Вас есть он. Я думаю, что это все действительно положительные стороны. Я однако, не используют совет Jeffrey в моем собственном коде. Возможно, я также застреваю в своем мире C#, но я заканчиваю тем, что пытался заставить свой код быть похожим на код платформы.

484
ответ дан 4 revs, 3 users 89% 22 November 2019 в 19:37
поделиться

string зарезервированное слово, но String просто имя класса. Это означает, что string не может использоваться в качестве имени переменной отдельно.

, Если бы по некоторым причинам Вы хотели переменную, названную строка , Вы видели бы только первую из этих компиляций:

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

, Если Вы действительно хотите имя переменной, названное строка , можно использовать @ в качестве префикса:

StringBuilder @string = new StringBuilder();

Другое критическое различие: Переполнение стека выделяет их по-другому.

437
ответ дан 5 revs, 4 users 79% 22 November 2019 в 19:37
поделиться

существует одно различие - Вы не можете использовать String без using System; заранее.

375
ответ дан 3 revs, 3 users 50% 22 November 2019 в 19:37
поделиться

Это было покрыто выше; однако, Вы не можете использовать string в отражении; необходимо использовать String.

300
ответ дан 2 revs, 2 users 67% 22 November 2019 в 19:37
поделиться

System.String строковый класс.NET - в C# string, псевдоним для System.String - таким образом используемый, они - то же.

Что касается инструкций я не слишком сорвать и просто использовать, какой бы ни Вы чувствуете себя подобно - существуют более важные вещи в жизни, и код будет тем же так или иначе.

, Если Вы создаете системы, где необходимо определить размер целых чисел, Вы используете и так будьте склонны использовать Int16, Int32, UInt16, UInt32 и т.д. тогда могло бы выглядеть более естественным использовать String - и при перемещении между различными .net языками, это могло бы сделать вещи более понятными - иначе я буду использовать строку и интервал

244
ответ дан 3 revs, 3 users 73% 22 November 2019 в 19:37
поделиться

Я предпочитаю капитализированное .NET типы (а не псевдонимы) для форматирования причин. .NET типы окрашены тем же как другими типами объектов (типы значения являются надлежащими объектами, в конце концов).

Условное выражение и ключевые слова управления (как if, switch, и return) являются нижним регистром и окрашенным темно-синим (по умолчанию). И у меня не было бы разногласия используемым и формат.

Рассмотрите:

String someString; 
string anotherString; 
199
ответ дан 4 revs, 4 users 50% 22 November 2019 в 19:37
поделиться

string и String идентичны во всех отношениях (кроме верхнего регистра "S"). Так или иначе нет никаких последствий производительности.

Нижний регистр string предпочтен в большинстве проектов из-за подсветки синтаксиса

187
ответ дан 2 revs, 2 users 80% 22 November 2019 в 19:37
поделиться

C# является языком, который используется вместе с CLR.

string тип в C#.

System.String тип в CLR.

то, Когда Вы будете использовать C# вместе с CLR string, будет отображено на [1 114] System.String .

Теоретически, Вы могли реализовать C#-compiler, который генерировал Байт-код Java. Разумная реализация этого компилятора была бы, вероятно, карта string к [1 116] java.lang.String для взаимодействия с библиотекой Среды выполнения Java.

178
ответ дан 3 revs, 2 users 81% 22 November 2019 в 19:37
поделиться

Нижний регистр string является псевдонимом для System.String. Они - то же в C#.

существуют дебаты, законченные, необходимо ли использовать Системные типы (System.Int32, System.String, и т.д.) типы или C# aliases (int, string, и т.д.). Я лично полагаю, что необходимо использовать эти C# aliases, но это - просто мое персональное предпочтение.

157
ответ дан 3 revs, 3 users 60% 22 November 2019 в 19:37
поделиться

Оба - то же. Но от кодирования перспективы инструкций лучше использовать string вместо String. Это - то, что обычно используют разработчики. например, вместо того, чтобы использовать Int32 мы используем int, поскольку int псевдоним к Int32

к вашему сведению, строка ключевого слова “The является просто псевдонимом для предопределенного класса System.String.” - Спецификация языка 4.2.3 C# http://msdn2.microsoft.com/En-US/library/aa691153.aspx

136
ответ дан 2 revs, 2 users 80% 22 November 2019 в 19:37
поделиться

string просто псевдоним для System.String. Компилятор будет рассматривать их тождественно.

единственным практическим различием является подсветка синтаксиса, как Вы упоминаете, и что необходимо записать using System, если Вы используете String.

150
ответ дан 4 revs, 3 users 63% 22 November 2019 в 19:37
поделиться

Как другие говорят, они - то же. Правила StyleCop, по умолчанию, осуществят Вас для использования string в качестве лучшей практики стиля кода C#, кроме тех случаев, когда, ссылаясь System.String статические функции, такой как String.Format, String.Join, String.Concat, и т.д.

115
ответ дан 2 revs, 2 users 67% 22 November 2019 в 19:37
поделиться

Это - вопрос соглашения, действительно. string просто больше походит на стиль C/C++. Общее соглашение состоит в том, чтобы использовать любые ярлыки, которые Ваш выбранный язык обеспечил (Интервал/Интервал для Int32). Это идет для "объекта" и decimal также.

Теоретически это могло помочь портировать код в некоторый будущий 64-разрядный стандарт, в котором "интервал" мог бы означать Int64, но это не точка, и я ожидал бы, что любой мастер обновления изменит любой int ссылки на Int32 так или иначе только для сейфа.

64
ответ дан 2 revs, 2 users 67% 22 November 2019 в 19:37
поделиться

Используя Систему типы облегчают портировать между C# и VB.Net, если Вы в такую вещь.

94
ответ дан Ishmael 22 November 2019 в 19:37
поделиться

Результат изображения для строки vs String www.javatpoint.com В C # string является псевдонимом для класса String в .NET Framework. Фактически, каждый тип C # имеет эквивалент в .NET.
Другое небольшое отличие состоит в том, что если вы используете класс String, вам необходимо импортировать пространство имен System, тогда как вам не нужно импортировать пространство имен при использовании ключевого слова string

-1
ответ дан 2 revs, 2 users 71% 22 November 2019 в 19:37
поделиться

Существуют многие (например, Jeffrey Richter в его книге CLR Через C#), кто говорит, что нет никакого различия между System.String и string, и также System.Int32 и int, но мы должны различить немного глубже для реального сжатия сока из этого вопроса, таким образом, мы можем вытащить всю пищевую ценность из него (напишите лучший код).

А. Они - То же...

  1. к компилятору.
  2. разработчику. (Мы знаем № 1 и в конечном счете достигаем автопилота.)

B. Они Отличаются в Famework и в Контекстах Non-C#. Отличающийся...

  1. на ДРУГИЕ языки, которые НЕ являются C#
  2. в оптимизированном CIL (был MSIL) контекст (ассемблер VM.NET)
  3. в предназначенном платформы контексте - Платформа.NET или Моно или любая область типа CIL
  4. в книге, предназначающейся для нескольких Языков.NET (таких как VB.NET, F#, и т.д.)

Так, истинный ответ, - то, что это - только потому, что C# должен совместно владеть пространством.NET с другими языками, что этот вопрос даже существует.

C. Подводить итог...

Вы используете string и int, и другие типы C# в целевой аудитории C#-only (задайте вопрос, кто собирается прочитать этот код или пользоваться этой библиотекой). Для Вашей внутренней компании, если Вы только используете C#, затем придерживаются типов C#.

... и Вы используете System.String и System.Int32 в многоязычной целевой аудитории или целевой аудитории платформы (когда C# не является единственной аудиторией). Для Вашей внутренней организации, если Вы также используете VB.NET или F# или какой-либо другой язык.NET, или разрабатываете библиотеки для потребления клиентами, которые могут, затем необходимо использовать типы "Frameworky" в тех контекстах так, чтобы все могли понять интерфейс, от какой вселенной они. (Что такое Klingon для System.String, так или иначе?)

HTH.

0
ответ дан 22 November 2019 в 19:37
поделиться

Один из вопросов, которые многие новичок программисты C# задают: “What является различием между строкой и Строкой? ” В C#, В stringВ является псевдонимом для theВ StringВ класс в платформе.NET. На самом деле каждый тип C# имеет эквивалент в.NET. Как другой пример, В shortВ andВ intВ в C# отображают toВ Int16В andВ Int32 в.NET.

Так, В technicallyВ нет никакого различия между строкой и Строкой, но это - обычная практика для объявления переменной с помощью ключевых слов C#. I’ve, едва замеченный любой объявляющий целочисленный withВ Int32! Единственное крошечное различие - то, что, если youВ используют theВ StringВ класс, необходимо импортировать theВ SystemВ пространство имен сверху файла, тогда как don’t необходимо сделать это при использовании theВ stringВ ключевое слово. Многие разработчики предпочитают объявлять строковую переменную withВ stringВ, но использовать theВ StringВ класс при доступе к одному из его статических участников:

String.Format()
1
ответ дан 22 November 2019 в 19:37
поделиться

Хорошо технически оба из них являются тем же, но с незначительными различиями. В то время как “string” является типом данных, тогда как “String” представляет класс. “string” является псевдонимом для Системы. Строка. Во время выполнения оба компилируются в тот же код. Еще одним различием является маркер синтаксиса.

Позволяют нам теперь проверить фрагмент кода для понимания обоих из них.

    using System;  
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Text;  
    using System.Threading.Tasks;  
    namespace ConsoleApplication2  
    {  
        class Program  
        {  
            static void Main(string[] args)  
            {  
                string FirstName = ".Net";  
                String Lastname = "Snippets";  
                Console.WriteLine(FirstName + " " + Lastname);  
                Console.ReadLine();  
            }  
        }  
    }  
1
ответ дан 22 November 2019 в 19:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: