Adoro o operador de coalescência nula porque facilita a atribuição de um valor padrão para tipos anuláveis.
int y = x ?? -1;
Isso é ótimo, exceto se eu precisar fazer algo simples x
. Por exemplo, se eu quiser verificar Session
, geralmente acabo tendo que escrever algo mais detalhado.
Eu gostaria de poder fazer isso:
string y = Session["key"].ToString() ?? "none";
Mas você não pode, porque a .ToString()
chamada é feita antes da verificação nula, portanto ela falha se Session["key"]
for nula. Acabo fazendo isso:
string y = Session["key"] == null ? "none" : Session["key"].ToString();
Funciona e é melhor, na minha opinião, do que a alternativa de três linhas:
string y = "none";
if (Session["key"] != null)
y = Session["key"].ToString();
Mesmo que isso funcione, ainda estou curioso para saber se existe uma maneira melhor. Parece que não importa o que eu sempre precise fazer referência Session["key"]
duas vezes; uma vez para o cheque e novamente para a tarefa. Alguma ideia?
.?
) como o Groovy .Respostas:
A respeito
fonte
.ToStringOrDefault()
é a minha maneira preferida de fazê-lo. No entanto, estou usando esta resposta dentro de método de extensão de Jon;)Se você costuma fazer isso especificamente com
ToString()
isso, pode escrever um método de extensão:Ou um método adotando um padrão, é claro:
fonte
.ToStringOrDefault()
é simples e elegente. Uma boa solução.object
são uma maldição e junk up uma base de código, e os métodos de extensão que operam sem erros emthis
valores nulos são pura maldade.Você também pode usar
as
, que geranull
se a conversão falhar:Este voltaria
"none"
mesmo se alguém recheado umint
noSession["key"]
.fonte
ToString()
em primeiro lugar.ToString()
para converter um objeto que contém uma string em uma string. Você pode fazer o mesmo comobj as string
ou(string)obj
. É uma situação bastante comum no ASP.NET.ToString()
um objeto (a saber,Session["key"]
) cujo tipo ele não mencionou. Pode ser qualquer tipo de objeto, não necessariamente uma string.Se sempre for um
string
, você pode transmitir:Isso tem a vantagem de reclamar, em vez de esconder o erro, se alguém colocar
int
algo ou algoSession["key"]
. ;)fonte
Todas as soluções sugeridas são boas e respondem à pergunta; então isso é apenas para estender um pouco. Atualmente, a maioria das respostas lida apenas com validação nula e tipos de sequência. Você pode estender o
StateBag
objeto para incluir umGetValueOrDefault
método genérico , semelhante à resposta postada por Jon Skeet.Um método simples de extensão genérica que aceita uma cadeia como chave e, em seguida, o tipo verifica o objeto da sessão. Se o objeto for nulo ou não for o mesmo tipo, o padrão será retornado, caso contrário, o valor da sessão será retornado com forte digitação.
Algo assim
fonte
HttpSessionState
.T value = source[key] as T; return value ?? defaultValue;
HttpSessionState
para a sessão. :)Nós usamos um método chamado
NullOr
.Uso
Fonte
fonte
Dot
mas achamos isso muito descritivo. DecidimosNullOr
como uma boa troca entre autoexplicação e brevidade. Se você realmente não se importava com o nome, sempre poderia chamá-lo_
. Se você achar as lambdas muito pesadas para escrever, poderá usar um trecho para isso, mas pessoalmente acho bastante fácil. Quanto a? :
, você não pode usá-lo com expressões mais complexas, teria que movê-las para um novo local;NullOr
permite evitar isso.Minha preferência, por um lado, seria usar uma conversão segura para string, caso o objeto armazenado com a chave não seja um. O uso
ToString()
pode não ter os resultados desejados.Como o @Jon Skeet diz, se você se encontra fazendo muito isso, é um método de extensão ou, melhor ainda, talvez um método de extensão em conjunto com uma classe SessionWrapper fortemente tipada. Mesmo sem o método de extensão, o wrapper fortemente tipado pode ser uma boa ideia.
Usado como
fonte
criar uma função auxiliar
fonte
A resposta de Skeet é a melhor - particularmente acho que
ToStringOrNull()
é bastante elegante e atende melhor às suas necessidades. Eu queria adicionar mais uma opção à lista de métodos de extensão:Retorne o objeto original ou o valor padrão da cadeia para null :
Use
var
para o valor retornado, pois ele retornará como o tipo de entrada original, apenas como a sequência padrão quandonull
fonte
null
defaultValue
se não for necessária (ou sejainput != null
)?input != null
retornará o objeto como ele próprio.input == null
retorna uma string fornecida como um parâmetro. portanto, é uma possível pessoa poderia chamar.OnNullAsString(null)
- mas o propósito (embora método de extensão raramente útil) foi para garantir que você quer obter o objeto de volta ou string padrão ... Nunca nulainput!=null
cenário retornará a entrada apenas sedefaultValue!=null
também reter; caso contrário, lançará umArgumentNullException
.Este é o meu pequeno tipo "operador Elvis" seguro para versões do .NET que não suportam?
O primeiro argumento é o objeto testado. O segundo é a função. E terceiro é o valor nulo. Então, para o seu caso:
Também é muito útil para tipos anuláveis. Por exemplo:
fonte