Você pode me explicar o que where T : class, new()
significa a seguinte linha de código?
void Add<T>(T item) where T : class, new();
c#
generics
type-constraints
Rawhi
fonte
fonte
Respostas:
Essa é uma restrição no parâmetro genérico
T
. Ele deve ser umclass
(tipo de referência) e deve ter um construtor padrão sem parâmetro público.Isso significa que
T
não pode ser umint
,float
,double
,DateTime
ou qualquer outrostruct
(tipo de valor).Pode ser um
string
ou qualquer outro tipo de referência personalizado, desde que tenha um construtor padrão ou sem parâmetros.fonte
new()
precisamente especifica "deve ter um construtor sem parâmetros público"Essas são restrições de tipo genérico. No seu caso, existem dois deles:
Significa que o tipo
T
deve ser um tipo de referência (não um tipo de valor).Significa que o tipo
T
deve ter um construtor sem parâmetros. Ter essa restrição permitirá que você faça algo comoT field = new T();
no seu código que você não seria capaz de fazer de outra maneira.Você então combina os dois usando uma vírgula para obter:
fonte
onde T: struct
O argumento type deve ser um tipo de valor. Qualquer tipo de valor, exceto Nullable, pode ser especificado. Consulte Usando tipos nulos (Guia de programação em C #) para obter mais informações.
onde T: classe
O argumento type deve ser um tipo de referência, incluindo qualquer classe, interface, delegado ou tipo de matriz. (Ver nota abaixo.)
onde T: new () O argumento type deve ter um construtor público sem parâmetros. Quando usada em conjunto com outras restrições, a nova restrição () deve ser especificada por último.
onde T: [nome da classe base]
O argumento type deve ser ou derivar da classe base especificada.
onde T: [nome da interface]
O argumento type deve ser ou implementar a interface especificada. Múltiplas restrições de interface podem ser especificadas. A interface de restrição também pode ser genérica.
onde T: U
O argumento de tipo fornecido para T deve ser ou derivar do argumento fornecido para U. Isso é chamado de restrição de tipo simples.
fonte
class
&new
são 2 restrições no parâmetro de tipo genéricoT
.Respectivamente, eles garantem:
class
new
Sua combinação significa que o tipo
T
deve ser um Tipo de Referência (não pode ser um Tipo de Valor ) e deve ter um construtor sem parâmetros.Exemplo:
fonte
new (): especificar a restrição new () significa que o tipo T deve usar um construtor sem parâmetros, para que um objeto possa ser instanciado a partir dele - consulte Construtores padrão .
classe: significa que T deve ser um tipo de referência para que não possa ser um int, float, double, DateTime ou outra estrutura (tipo de valor).
fonte
Isso significa que esse tipo
T
deve ser uma classe e ter um construtor que não aceita argumentos.Por exemplo, você deve conseguir fazer isso:
fonte
where (Referência de C #)
Portanto, deve ser,
T
deve ser uma classe e ter um construtor acessível sem parâmetros - ou padrão.fonte
O que vem depois do "Onde" é uma restrição no tipo genérico T que você declarou, portanto:
classe significa que o T deve ser uma classe e não um tipo de valor ou uma estrutura.
new () indica que a classe T deve ter um construtor padrão público sem parâmetros definido.
fonte
É chamado de 'restrição' no parâmetro genérico T. Isso significa que T deve ser um tipo de referência (uma classe) e que deve ter um construtor público padrão.
fonte
Isso faz parte do mecanismo Genéricos, onde a palavra-chave where adiciona restrições a quais tipos devem ser implementados para serem usados como parâmetros de tipo.
fonte
ao usar a classe em restrições, significa que você só pode usar o tipo de referência; outra coisa a acrescentar é quando usar a restrição new () ; deve ser a última coisa que você escreve nos termos das restrições.
fonte