C двойной знак вопроса

Наткнулся на эту строку кода:

Что означают два вопросительных знака, это какой-то троичный оператор? Трудно найти в Google.

16 ответов

Это нулевой оператор слияния, и он очень похож на троичный (немедленный, если) оператор. Смотрите также ?? Оператор — MSDN .

который далее расширяется до:

В английском это означает «Если то, что слева, не равно нулю, используйте это, в противном случае используйте то, что справа».

Обратите внимание, что вы можете использовать любое количество из них в последовательности. Следующее утверждение назначит первому ненулевому номеру Answer# Answer (если все ответы нулевые, то Answer нулевой):

Также стоит упомянуть, хотя приведенное выше расширение концептуально эквивалентно, результат каждого выражения оценивается только один раз. Это важно, если, например, выражение является вызовом метода с побочными эффектами. (Благодарим @Joey за указание на это.)

Просто потому, что никто еще не сказал волшебные слова: это нулевой оператор объединения. Это определено в разделе 7.12 спецификации языка C # 3.0 .

Это очень удобно, особенно из-за того, как оно работает, когда оно используется в выражении несколько раз. Выражение формы:

выдаст результат выражения a если оно не равно нулю, в противном случае попробуйте b , в противном случае попробуйте c , в противном случае попробуйте d . Это короткое замыкание в каждой точке.

Кроме того, если тип d не обнуляется, тип всего выражения также не обнуляется.

Это нулевой оператор объединения.

Да, почти невозможно искать, если вы не знаете, как это называется! 🙂

РЕДАКТИРОВАТЬ: И это классная особенность из другого вопроса. Вы можете связать их

Спасибо всем, вот самое краткое объяснение, которое я нашел на сайте MSDN:

?? там, чтобы обеспечить значение для обнуляемого типа, когда значение равно нулю. Таким образом, если formsAuth равен нулю, он вернет новый FormsAuthenticationWrapper ().

Два знака вопроса (??) указывают на то, что это оператор объединения.

Оператор объединения возвращает первое значение NON-NULL из цепочки. Вы можете увидеть это видео на YouTube, которое демонстрирует практически все это.

Но позвольте мне добавить больше к тому, что говорит видео.

Если вы видите английское значение объединения, оно говорит: «объединяйтесь». Например, ниже приведен простой объединяющий код, который объединяет четыре строки.

Таким образом, если str1 равен null он будет пытаться использовать str2 , если str2 равен null он будет пытаться использовать str3 и так далее, пока не найдет строку с ненулевым значением.

Проще говоря, оператор Coalescing возвращает первое значение NON-NULL из цепочки.

Если вы знакомы с Ruby, его ||= кажется сродни C # ?? мне. Вот немного Ruby:

Это короткая рука для троичного оператора.

Или для тех, кто не делает троичный

Ничего опасного в этом нет. На самом деле это красиво. Вы можете добавить значение по умолчанию, если это желательно, например:

КОД

Только для вашего удовольствия (зная, что вы все ребята из C # ;-).

Я думаю, что он возник в Smalltalk, где он существует уже много лет. Там это определяется как:

в UndefinedObject (он же класс nil):

Существуют как оценочные (?), Так и не оценивающие версии (??) этого.
Это часто встречается в методах-получателях для приватных инициализируемых переменных (экземпляров), которые оставляются равными нулю до тех пор, пока действительно не понадобятся.

Некоторые примеры получения значений с использованием коалесценции здесь неэффективны.

То, что вы действительно хотите, это:

Это предотвращает воссоздание объекта каждый раз. Вместо того, чтобы приватная переменная оставалась нулевой, а новый объект создавался при каждом запросе, это гарантирует, что приватная переменная будет назначена, если будет создан новый объект.

Как правильно указывалось в многочисленных ответах, это «оператор слияния нулей» ( ?? ), о котором можно также упомянуть его двоюродного брата «Нулевой оператор» ( ? Или ? [ ), Который является оператором, который много раз он используется в сочетании с ??

Используется для проверки на нулевое значение перед выполнением операции доступа к члену ( ?. ) Или индекса ( ? [ ). Эти операторы помогают вам написать меньше кода для обработки нулевых проверок, особенно для спуска в структуры данных.

по-старому без ? и ?? делать это

что более многословно и громоздко.

Я прочитал всю эту ветку и многие другие, но не могу найти столь же исчерпывающий ответ, как этот.

По которому я полностью понял, «зачем использовать ?? и когда использовать ?? и как использовать ??».

Основа коммуникации Windows выпущена Крейгом МакМертри ISBN 0-672-32948-4

Существует два распространенных обстоятельства, в которых хотелось бы узнать, было ли присвоено значение экземпляру типа значения. Первый — когда экземпляр представляет значение в базе данных. В таком случае хотелось бы иметь возможность изучить экземпляр, чтобы выяснить, действительно ли значение присутствует в базе данных. Другое обстоятельство, которое в большей степени относится к предмету этой книги, — это когда экземпляр представляет элемент данных, полученный из какого-то удаленного источника. Опять же, хотелось бы определить из экземпляра, было ли получено значение для этого элемента данных.

.NET Framework 2.0 включает определение универсального типа, которое обеспечивает случаи, подобные этим, в которых нужно присвоить значение NULL экземпляру типа значения и проверить, является ли значение экземпляра NULL. Это определение универсального типа — System.Nullable, которое ограничивает аргументы универсального типа, которые могут быть заменены на T, типами значений. Экземплярам типов, созданным из System.Nullable, может быть присвоено значение null; действительно, их значения по умолчанию равны нулю. Таким образом, типы, созданные из System.Nullable, могут упоминаться как типы значений, допускающие значение NULL. System.Nullable имеет свойство Value, с помощью которого можно получить значение, назначенное экземпляру созданного из него типа, если значение экземпляра не равно нулю. Поэтому можно написать:

Язык программирования C # предоставляет сокращенный синтаксис для объявления типов, созданных из System.Nullable. Этот синтаксис позволяет сокращать:

Компилятор предотвратит попытку присвоить значение типа значения, допускающего значение NULL, обычному типу значения следующим образом:

Это не позволяет сделать это, потому что тип значения NULL может иметь значение NULL, которое в действительности имеет значение, и это значение не может быть присвоено обычному типу значения. Хотя компилятор разрешил бы этот код,

Второй оператор вызовет исключение, потому что любая попытка доступа к свойству System.Nullable.Value является недопустимой операцией, если типу, созданному из System.Nullable, не было присвоено допустимое значение T, чего не было в этом случае. дело.

Один правильный способ присвоить значение типа значения NULL для обычного типа значения — это использовать свойство System.Nullable.HasValue, чтобы определить, было ли назначено допустимое значение T для типа NULL:

Другой вариант — использовать этот синтаксис:

С помощью которого обычному целому числу myInteger присваивается значение обнуляемого целого числа «myNullableInteger», если последнему присвоено допустимое целое значение; в противном случае myInteger присваивается значение -1.

Перейдите по этой строке кода:

Что означают две вопросительные знаки, это какой-то тройственный оператор? Трудно найти в Google.

Это нулевой оператор слияния, и совсем как троичный (немедленный-если) оператор. Смотрите также ?? Оператор — MSDN.

который далее расширяется до:

По-английски это означает: "Если то, что слева, не равно нулю, используйте это, иначе используйте то, что справа".

Обратите внимание, что вы можете использовать любое количество из них в последовательности. Следующее утверждение назначит первому ненулевому номеру Answer# Answer (если все ответы нулевые, то Answer нулевой):

Также стоит упомянуть, хотя приведенное выше расширение концептуально эквивалентно, результат каждого выражения оценивается только один раз. Это важно, если, например, выражение является вызовом метода с побочными эффектами. (Благодарим @Joey за указание на это.)

Просто потому, что никто еще не сказал волшебные слова: это оператор нулевой коалесценции. Он определен в разделе 7.12 спецификации С# 3.0.

Это очень удобно, особенно из-за того, как он работает, когда он используется несколько раз в выражении. Выражение вида:

даст результат выражения a , если он не равен нулю, в противном случае попробуйте b , в противном случае попробуйте c , в противном случае попробуйте d . Это короткое замыкание в каждой точке.

Кроме того, если тип d не является нулевым, тип всего выражения также не является нулевым.

Это нулевой оператор слияния.

Да, почти невозможно искать, если вы не знаете, как это называется! 🙂

РЕДАКТИРОВАТЬ: И это классная особенность из другого вопроса. Вы можете связать их

Спасибо всем, вот самое краткое объяснение, которое я нашел на сайте MSDN:

?? существует, чтобы предоставить значение для типа с нулевым значением, когда значение равно null. Итак, если formsAuth имеет значение null, он вернет новый FormsAuthenticationWrapper().

Два знака вопроса (??) указывают на то, что это оператор объединения.

Оператор объединения возвращает первое значение NON-NULL из цепочки. Вы можете увидеть это видео на YouTube, которое демонстрирует практически все это.

Но позвольте мне добавить больше к тому, что говорит видео.

Если вы видите английское значение объединения, оно говорит: "объединяйтесь". Например, ниже приведен простой объединяющий код, который объединяет четыре строки.

Таким образом, если str1 равен null он будет пытаться использовать str2 , если str2 равен null он будет пытаться использовать str3 и так далее, пока не найдет строку с ненулевым значением.

Проще говоря, оператор Coalescing возвращает первое значение NON-NULL из цепочки.

Если вы знакомы с Ruby, его ||= мне кажется сродни С# ?? . Вот некоторые Ruby:

Это короткая рука для тернарного оператора.

Или для тех, кто не делает тройной:

Ничего опасного в этом нет. На самом деле это красиво. Вы можете добавить значение по умолчанию, если это желательно, например:

CODE

Только для вашего удовольствия (зная, что вы все парни С#;).

Я думаю, что он возник в Smalltalk, где он существует уже много лет. Он определяется там как:

в UndefinedObject (aka nil class):

Есть и оценка (?) и неоценивающих версий (??) этого.
Он часто встречается в методах getter для lazy-initialized private (instance) переменных, которые остаются нулевыми до тех пор, пока они действительно не нужны.

Некоторые из примеров здесь получения значений с использованием коалесценции являются неэффективными.

Что вы действительно хотите:

Это предотвращает воссоздание объекта каждый раз. Вместо частной переменной, остающейся пустой, и создания нового объекта по каждому запросу, это обеспечивает приватную переменную, если новый объект создан.

Как правильно указывалось в многочисленных ответах, это "оператор слияния нулей" (??), о котором можно также упомянуть его двоюродного брата "Оператор с нулевым условием" (?. Или ? [), Который является оператором, который много раз он используется в сочетании с ??

Используется для проверки на нулевое значение перед выполнением операции доступа к члену (?.) Или индекса (? [). Эти операторы помогают вам написать меньше кода для обработки нулевых проверок, особенно для спуска в структуры данных.

по-старому без ? и ?? делать это

что более многословно и громоздко.

Я прочитал целую эту тему и многие другие, но я не могу найти столь же полный ответ, как это.

С помощью которого я полностью понял "зачем использовать?" и когда использовать? и как использовать.

Основы коммуникаций Windows, выпущенные Craig McMurtry ISBN 0-672-32948-4

Существуют две общие причины, в которых хотелось бы узнать, значение присваивается экземпляру типа значения. Во-первых, когда экземпляр представляет значение в базе данных. В таком случае вы хотели бы иметь возможность изучить экземпляр, чтобы выяснить, действительно ли значение присутствует в базе данных. Другое обстоятельство, которое более уместно для предмета этой книги, — это когда экземпляр представляет элемент данных, полученный из какого-то удаленного источника. Опять же, хотелось бы определить из экземпляра, было ли получено значение для этого элемента данных.

В .NET Framework 2.0 используется общее определение типа, которое предусматривает такие случаи, когда требуется назначить значение null экземпляру типа значения и проверить, является ли значение экземпляра нулевым. Это универсальное определение типа — System.Nullable, которое ограничивает аргументы общего типа, которые могут быть заменены на T на типы значений. Экземплярам типов, построенных из System.Nullable, может быть присвоено значение null; действительно, их значения по умолчанию равны нулю. Таким образом, типы, построенные из System.Nullable может упоминаться как типы значений NULL. System.Nullable имеет свойство Value, по которому значение, присвоенное экземпляру тип, построенный из него, может быть получен, если значение экземпляра не равно нулю. Поэтому можно написать:

Язык программирования С# предоставляет сокращенный синтаксис для объявления типов построенный из System.Nullable. Этот синтаксис позволяет сокращать:

Компилятор не позволит одному из способов присвоить значение типа значения NULL для обычного типа значений следующим образом:

Это не позволяет сделать это, потому что тип значения с нулевым значением может иметь значение null, которое в действительности было бы в этом случае, и это значение не может быть присвоено типу обычного значения. Хотя компилятор разрешил бы этот код,

Второй оператор вызовет исключение, поскольку любая попытка доступ к свойству System.Nullable.Value является недопустимой операцией, если тип построенный из System.Nullable, не было присвоено допустимое значение T, которое в этом случае не произошло.

Одним из правильных способов присвоения значения типа значения NULL для обычного типа значений является использование свойства System.Nullable.HasValue для определения того, было ли допустимое значение T присвоено типу значения NULL:

Другим вариантом является использование этого синтаксиса:

Посредством которой для обычного целого myInteger присваивается значение целочисленного значения с нулевым значением "myNullableInteger", если последнему присвоено действительное целочисленное значение; в противном случае myInteger присваивается значение -1. ​​

Что означает знак вопроса в C#? Например здесь

и можно ли его еще где использовать?

2 ответа 2

Условный оператор (?:) (он же тернарный оператор) возвращает одно из двух значений в зависимости от значения логического выражения. Для условного оператора используется следующий синтаксис

Параметр condition должен иметь значение true или false. Если параметр condition имеет значение true, вычисляется выражение first_expression и итог этого вычисления становится результатом.

Если параметр condition имеет значение false, вычисляется выражение second_expression и итог этого вычисления становится результатом.

В любом случае вычисляется только одно из двух выражений. Параметры first_expression и second_expression должны быть одинакового типа или должно существовать неявное преобразование из одного типа в другой.

Расчеты, которые в другом случае требовали бы уточнения конструкции if-else, можно выражать с помощью условного оператора. Например, в следующем коде сначала используется оператор if, а затем — условный оператор для того, чтоб уведомить было ли введенное пользователем число — числом пять или нет:

Оцените статью
Много толка
Добавить комментарий