Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.84/88: Рейтинг темы: голосов - 88, средняя оценка - 4.84
DroidAn
7 / 7 / 0
Регистрация: 18.11.2011
Сообщений: 150
1

Тип данных "bool?" - что означает знак вопроса

02.01.2012, 12:58. Просмотров 16341. Ответов 3
Метки нет (Все метки)

Здравствуйте! Читаю книгу по c#. В ней есть пример создания класса, в котором объявляется такое свойство:

C#
1
public bool? WillAttend { get; set; }
Не могу понять, что означает знак вопроса после булевского типа?
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.01.2012, 12:58
Ответы с готовыми решениями:

Можно ли в C# стринговый знак "+" который я ввел в Textbox, как нить преобразовать что бы он принял его за знак вычисления
а вот еще вопрос может ты знаеш? можно ли в C# стринговый знак "+" который я ввел в Textbox, как...

Поиск в массиве. Ошибка "Оператор "&&" не может применяться к операндам типа "bool" и "double""
Найти номер последнего минимального элемента среди положительных четных элементов, лежащих правее...

Как считать булевы значения: "Неявное преобразование типа "string" в "bool" невозможно"
Здравствуйте. Возник такой вопрос: а как считать булевы значения? Почему такой вариант выдает мне...

Оператор "&" невозможно применить к операнду типа "int" и "bool"
Условие задачи: z = a * Math.Exp(-2 * x) * Math.Cos((Math.PI * x) / 2) + Math.Pow(a, 2) *...

Консоль: Оператор "==" не может применяться к операндам типа "bool" и "int"
Ошибкa: Оператор "==" не может применяться к операндам типа "bool" и "int" Здесь: public void...

3
ushim
172 / 173 / 54
Регистрация: 01.06.2011
Сообщений: 507
02.01.2012, 13:06 2
Лучший ответ Сообщение было отмечено как решение

Решение

это означает, что кроме стандартных типов, которые может принимать переменная bool (а это true и false) она ещё может принимать нулевое значение (null)
5
kolorotur
Эксперт .NET
11886 / 9442 / 2412
Регистрация: 17.09.2011
Сообщений: 16,150
Завершенные тесты: 1
02.01.2012, 14:33 3
Синтаксический сахар для оборачивания структуры в класс System.Nullable
2
ibmpc
79 / 77 / 10
Регистрация: 29.12.2011
Сообщений: 183
02.01.2012, 19:12 4
Знак вопроса это синтаксическое упрощение при объявлении типа переменной. В данном случае
C#
1
bool?
вместо
C#
1
Nullable<bool>
Типы переменных объявлянные таким образом называются "обнуляемые типы" или "нулевые типы".

Nullable<(Of <(T>)>) - универсальная структура
Представляет объект, базовым типом которого является тип значения, которому может быть присвоено значение null, так же как ссылочному типу.

MSDN

Заметки
Тип называется допускающим значение null, если ему может быть присвоено как непустое значение, так и значение nullNothingnullptrссылка null (Nothing в Visual Basic), означающее, что значение у типа отсутствует. Соответственно, тип, допускающий значение null, может выражать значение или его отсутствие. Например, ссылочный тип, такой как String, допускает значение null, а такой тип значения, как Int32, его не допускает. Тип значения не может допускать значение null, поскольку его емкости хватает только для представления значений, соответствующих этом типу; дополнительная емкость для выражения значения null у него отсутствует.

Структура Nullable<(Of <(T>)>) поддерживает использование только одного типа значения как допускающего значение null, поскольку ссылочные типы допускают его по определению.

Класс Nullable предоставляет дополнительную поддержку структуры Nullable<(Of <(T>)>). Класс Nullable поддерживает получение базового типа для типа, допускающего значение NULL, а также операции сравнения и проверки на равенство для таких пар типов, допускающих значение NULL, базовый тип значения которых не поддерживает универсальные операции сравнения и проверки на равенство.
Сценарий
Используйте типы, допускающие значение null, для представления вещей, которые существуют или не существуют в зависимости от обстоятельств. Например, необязательный атрибут HTML-тега может существовать в одном теге и отсутствовать в другом или столбец, допускающий значение null, может существовать в одной строке таблицы и отсутствовать в другой.

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

Базовые свойства
Двумя базовыми членами структуры Nullable<(Of <(T>)>) являются свойства HasValue и Value. Если свойство HasValue объекта Nullable<(Of <(T>)>) имеет значение true, доступ к объекту может осуществляться посредством свойства Value. Если свойство HasValue имеет значение false, значение объекта не определено и при попытке доступ к свойству Value выбрасывается исключение InvalidOperationException.

Упаковка-преобразование и распаковка-преобразование
При упаковке типа, допускающего значение null, среда CLR автоматически упаковывает базовое значение объекта Nullable<(Of <(T>)>), но не сам объект Nullable<(Of <(T>)>). Это означает, что если свойство HasValue имеет значение true, содержимое свойства Value упаковывается. При распаковке базового значения типа, допускающего значение null, среда CLR автоматически создает новую структуру Nullable<(Of <(T>)>) и инициализирует ее базовым значением.

Если свойство HasValue типа, допускающего значение null, имеет значение false, результатом операции упаковки является nullNothingnullptrссылка null (Nothing в Visual Basic). Соответственно, если упаковываемый тип, допускающий значение null, передается методу, ожидающему аргумент объектного типа, этот метод должен быть готов обработать ситуацию, когда аргумент равен nullNothingnullptrссылка null (Nothing в Visual Basic). При распаковке значения nullNothingnullptrссылка null (Nothing в Visual Basic) в тип, допускающий значение null, среда CLR создает новую структуру Nullable<(Of <(T>)>) и инициализирует ее свойство HasValue значением false.

Примеры
В следующем примере кода определяются три строки таблицы в учебной базе данных Майкрософт с именем Pubs. Таблица содержит два столбца, не допускающие значение null, и два столбца, допускающие значение null.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
// This code example demonstrates the Nullable<T> class.
// The code example defines a database table in which two columns 
// are nullable. In the application, an array of rows is created 
// and initialized. The table rows could subsequently be 
// written to a database.
 
using System;
 
class Sample 
{
// Define the "titleAuthor" table of the Microsoft "pubs" database. 
    public struct titleAuthor 
    {
    // Author ID; format ###-##-####
    public string au_id;
    // Title ID; format AA####
    public string title_id;
    // Author ORD is nullable.
    public short? au_ord;
    // Royalty Percent is nullable.
    public int? royaltyper;
    }
 
    public static void Main() 
    {
// Declare and initialize the titleAuthor array.
    titleAuthor[] ta = new titleAuthor[3];
    ta[0].au_id = "712-32-1176";
    ta[0].title_id = "PS3333";
    ta[0].au_ord = 1;
    ta[0].royaltyper = 100;
 
    ta[1].au_id = "213-46-8915";
    ta[1].title_id = "BU1032";
    ta[1].au_ord = null;
    ta[1].royaltyper = null;
 
    ta[2].au_id = "672-71-3249";
    ta[2].title_id = "TC7777";
    ta[2].au_ord = null;
    ta[2].royaltyper = 40;
 
// Display the values of the titleAuthor array elements, and 
// display a legend.
    Display("Title Authors Table", ta);
    Console.WriteLine("Legend:");
    Console.WriteLine("An Author ORD of -1 means no value is defined.");
    Console.WriteLine("A Royalty % of 0 means no value is defined.");
    }
 
// Display the values of the titleAuthor array elements.
    public static void Display(string dspTitle, 
                               titleAuthor[] dspAllTitleAuthors)
    {
    Console.WriteLine("*** {0} ***", dspTitle);
    foreach (titleAuthor dspTA in dspAllTitleAuthors)
       {
       Console.WriteLine("Author ID ... {0}", dspTA.au_id);
       Console.WriteLine("Title ID .... {0}", dspTA.title_id);
       Console.WriteLine("Author ORD .. {0}", dspTA.au_ord ?? -1);
       Console.WriteLine("Royalty % ... {0}", dspTA.royaltyper ?? 0);
       Console.WriteLine();       
       }
    }
}
 
/*
This code example produces the following results:
 
*** Title Authors Table ***
Author ID ... 712-32-1176
Title ID .... PS3333
Author ORD .. 1
Royalty % ... 100
 
Author ID ... 213-46-8915
Title ID .... BU1032
Author ORD .. -1
Royalty % ... 0
 
Author ID ... 672-71-3249
Title ID .... TC7777
Author ORD .. -1
Royalty % ... 40
 
Legend:
An Author ORD of -1 means no value is defined.
A Royalty % of 0 means no value is defined.
*/


http://msdn.microsoft.com/ru-ru/library/b3h38hb0%28v=vs.90%29.aspx
1
02.01.2012, 19:12
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.01.2012, 19:12

Конструкция "условие-знак вопроса-переменная-двоеточие-переменная"
Доброго времени суток. Возник вопрос на который оказалось проблематично подобрать критерий поиска....

Оператор "||" невозможно применить к операнду типа "bool" и "string"
Как можно использовать || в этом случае? if (slovo == &quot;ad&quot; || &quot;da&quot;) { ...

Оператор ">=" не может применяться к операндам типа "bool" и "double"
Что не так? using System; class Hello { static void Main() { const double п...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru