Qual é o objetivo de um ponto de interrogação após um tipo (por exemplo: int? MyVariable)?


433

Normalmente, o principal uso do ponto de interrogação é para o condicional x ? "yes" : "no",.

Mas vi outro uso para ele, mas não consigo encontrar uma explicação sobre esse uso do ?operador, por exemplo.

public int? myProperty
{
   get;
   set;
}

Respostas:


438

Isso significa que o tipo de valor em questão é um tipo anulável

Tipos anuláveis ​​são instâncias da estrutura System.Nullable. Um tipo anulável pode representar o intervalo correto de valores para seu tipo de valor subjacente, além de um valor nulo adicional. Por exemplo, um Nullable<Int32>, pronunciado "Anulável de Int32", pode ser atribuído a qualquer valor de -2147483648 a 2147483647, ou o valor nulo. A Nullable<bool>pode ser atribuído aos valores true, false ou null. A capacidade de atribuir nulo a tipos numéricos e booleanos é especialmente útil quando você está lidando com bancos de dados e outros tipos de dados que contêm elementos aos quais não pode ser atribuído um valor. Por exemplo, um campo booleano em um banco de dados pode armazenar os valores verdadeiro ou falso, ou pode ser indefinido.

class NullableExample
{
  static void Main()
  {
      int? num = null;

      // Is the HasValue property true?
      if (num.HasValue)
      {
          System.Console.WriteLine("num = " + num.Value);
      }
      else
      {
          System.Console.WriteLine("num = Null");
      }

      // y is set to zero
      int y = num.GetValueOrDefault();

      // num.Value throws an InvalidOperationException if num.HasValue is false
      try
      {
          y = num.Value;
      }
      catch (System.InvalidOperationException e)
      {
          System.Console.WriteLine(e.Message);
      }
  }
}

3
Usado para struct. Não pense que é realmente útil para as aulas.
MonsieurDart

8
@MonsieurDart - é por isso que a resposta diz "tipo de valor"
Sean

3
@AntoineDahan - os tipos de valores não têm tipos anuláveis, pois são por definição não anuláveis. Eu acho que você está pensando em Java, onde há um inttipo e uma Integerclasse correspondente , por exemplo.
21416 Sean

2
recente (2015) documentação mais para o tipo anulável aqui
dinossauro


119

É uma abreviação de Nullable<int>. Nullable<T>é usado para permitir que um tipo de valor seja definido como null. Tipos de valor geralmente não podem ser nulos .


3
mais uma por usar o termo taquigrafia, bem direto!
Hari

3
A segunda frase me confunde. O que você quer dizer com "não pode"? No nível do compilador ou no contexto do aplicativo.
Problema junicer

5
@problemofficer por definição, value typesnão pode ser nulo. Se você declarar um int ou um bool (que são tipos de valor) sem atribuir um valor especificamente, eles ainda terão valores (0 e false, respectivamente), ou seja. eles não seriam nulos. reference typesPor outro lado, não atribuído , como objeto ou MyClass, será nulo. Você pode ler sobre a diferença entre tipos de valor e tipos de referência.
Klaus Byskov Pedersen

Obrigado pela explicação. Eu entendo agora.
problemofficer

62

No

x ? "yes" : "no"

o ? declara uma sentença if . Aqui: x representa a condição booleana; A parte antes de : é a sentença then e a parte depois é a sentença else .

Por exemplo,

int?

o ? declara um tipo anulável e significa que o tipo anterior a ele pode ter um valor nulo.


9
Não vejo nenhuma relação entre o '?' declarando um tipo capaz de nulo e uma expressão ternária. Votando sua resposta, senhor.
Gus Crawford

36
Não concordo com o comentário acima de Gus. A pergunta mostra que existe uma possível confusão com a expressão ternária. Esta resposta soluciona esse problema.
Mario Levesque

Onde você usaria esse tipo de comparação nula? Dentro de um retorno, parece não ser permitido. return value ? value : "isNull";me diz que string valuenão é convertível em bool.
C4d

Devo dizer que esta é uma resposta muito complicado, especialmente quando comparado com os outros sobre esta questão .. -1
FastTrack

Essa deve ser a resposta aceita. Uma vez que é claro e preciso. +1
JP Dolocanog

49

Tipos Anuláveis

Tipos anuláveis ​​são instâncias da estrutura System.Nullable. Um tipo anulável pode representar o intervalo normal de valores para seu tipo de valor subjacente, além de um valor nulo adicional . Por exemplo, um [ Nullable<Int32>], pronunciado "Anulável de Int32", pode ser atribuído a qualquer valor de -2147483648 a 2147483647 ou pode ser atribuído ao valor nulo. A [ Nullable<bool>] pode ser atribuído aos valores verdadeiro ou falso ou nulo. A capacidade de atribuir nulo a tipos numéricos e booleanos é particularmente útil ao lidar com bancos de dados e outros tipos de dados que contêm elementos que podem não ter um valor atribuído. Por exemplo, um campo booleano em um banco de dados pode armazenar os valores verdadeiro ou falso, ou pode ser indefinido.



6

uso prático:

public string someFunctionThatMayBeCalledWithNullAndReturnsString(int? value)
{
  if (value == null)
  {
    return "bad value";
  }

  return someFunctionThatHandlesIntAndReturnsString(value);
}

1
Enquanto o PO ainda estiver ativo, cinco anos após a pergunta, a resposta pode não ser mais relevante.
Strawberry

10
para mim, faz 3 horas :-)
AJBauer 22/11/2015

3

Para adicionar as respostas acima, aqui está um exemplo de código

struct Test
{
    int something;
}
struct NullableTest
{
    int something;
}
class Example
{
    public void Demo()
    {
        Test t = new Test();
        t = null;

        NullableTest? t2 = new NullableTest();
        t2 = null;
    }
}

Isso daria um erro de compilação:

Erro 12 Não é possível converter nulo em 'Teste' porque é um tipo de valor não anulável

Observe que não há erro de compilação para NullableTest. (observe o? na declaração de t2)


2

int?é uma abreviação de Nullable<int>. As duas formas são intercambiáveis.

Nullable<T>é um operador que você pode usar com um tipo de valor Tpara fazê-lo aceitar null.

No caso de você não sabe: valor tipos são tipos que aceita valores como int, bool, charetc ...

Eles não podem aceitar referências a valores: eles gerariam um erro em tempo de compilação se você atribuir a eles um null, em oposição aos tipos de referência , que obviamente podem aceitá-lo.

Por que você precisaria disso? Às vezes, suas variáveis ​​de tipo de valor podem receber referências nulas retornadas por algo que não funcionou muito bem, como uma variável ausente ou indefinida retornada de um banco de dados.

Eu sugiro que você leia a documentação da Microsoft, pois cobre muito bem o assunto.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.