Tenho ouvido essas duas palavras usadas em tutoriais da Microsoft para VB.NET. Qual é a diferença entre essas duas palavras quando usadas em referência a variáveis?
As variáveis em C # estão em 1 de 2 grupos. Tipos de valor ou tipos de referência . Os tipos gostam int
e DateTime
são tipos de valor . Em contraste, qualquer classe que você cria é um tipo de referência . As strings C # também são um tipo de referência . A maioria das coisas no .NET framework são tipos de referência .
Existe o nome da variável e seu valor . Duas partes .
O nome da variável é o que você declara ser. O valor é o que você atribui a ele.
Todas as variáveis sempre recebem um valor inicial no ponto em que a variável é declarada . Assim, todas as variáveis são inicializadas .
Para tipos de valor , como int
o compilador, fornecerá a eles um valor válido se você não fizer isso explicitamente. int
é inicializado com zero por padrão, DateTime
e inicializado com DateTime.MinValue
como padrão.
Variáveis de tipo de referência inicializam para o objeto que você fornece. O compilador não atribuirá um objeto (ou seja, um valor válido) se você não o fizer. Nesse caso, o valor é null
- nada. Portanto, dizemos que a referência é inicializada como nula.
Os humanos nascem. Os objetos são instanciados. Um bebê é uma instância de um Humano, um objeto é uma instância de alguma Classe.
O ato de criar uma instância de uma classe é chamado de instanciação (Ta-Da!)
MyClass myClassyReference = new MyClass();
Acima, é errado dizer "... criando uma instância de um objeto ..."
editar - inspirado na discussão de comentários
Três coisas distintas estão acontecendo (acima) usando uma terminologia distinta e essa terminologia não é intercambiável:
MyClass myClassyReference
new MyClass()
=
.Reafirmando os fatos:
Uma variável de tipo de referência também é chamada simplesmente de "uma referência". Uma "variável de tipo de valor" não é uma referência.
Isto: "objetoA é uma instância de um objeto" está profundamente errado. Se objectA era "uma instância de objectB", então deve ser que objectA começa a vida com o tipo de objectB - seja lá o que for - e estado atual - seja lá o que for. Que tal criar os objetos D, E e F à medida que o objeto B muda? Não, não! É o caso conceitual e técnico do "objetoA é uma instância de uma Classe". "Instanciação" e "instância de" têm um significado preciso - um objeto obtém seu tipo, definições e valores de uma classe.
MyClass myClassyReference = null
Geralmente não dizemos "a variável é atribuída a nula" e nunca dizemos "a variável está referenciando nula", Não. Em vez disso, dizemos "a variável é nula"; ou "a variável não está referenciando nada" ou "a referência é nula"
Aplicação prática:
Eu aponto meu dedo em seu código e digo "esta instância tem uma propriedade inválida. Talvez seja por isso que o loop falha. Você tem que validar os parâmetros durante a instanciação." (isto é, argumentos do construtor).
Eu vejo isso no seu código,
MyClass myClassyReference;
myClassyReference.DoSomething();
"Você declarou a variável, mas nunca a atribuiu. Ela é nula, portanto, não faz referência a nada. É por isso que a chamada do método lança uma exceção."
fim da edição
Um tipo de referência nome e o valor da variável existe independentemente. E quero dizer independente.
Um objeto instanciado pode ou não ter uma referência a ele.
Um objeto instanciado pode ter muitas referências a ele.
Uma referência declarada pode ou não apontar para um objeto.
Uma variável é inicializada com um valor. Um objeto é instanciado quando a memória é alocada para ele e seu construtor foi executado.
Por exemplo, aqui está uma variável:
Esta variável não foi inicializada . Depois de atribuir um valor à
obj
variável, a variável será inicializada. Aqui estão alguns exemplos de inicialização:A instanciação é uma coisa muito diferente, mas está relacionada, pois a instanciação geralmente é seguida pela inicialização:
Na linha de código anterior, a
obj
variável é inicializada com a referência ao novoObject
que foi instanciado . Dizemos que o novoObject
foi instanciado porque criamos uma nova instância dele.Agora eu acredito que o VB.NET torna isso muito mais confuso do que o C # porque não está claro se uma atribuição está ocorrendo no código acima. Em C #, é muito mais claro que há uma instanciação de uma instância e uma inicialização de uma variável:
fonte
Para inicializar algo é configurá-lo para o seu valor inicial. Para instanciar uma coisa é criar uma instância dele.
Freqüentemente, isso é mais ou menos a mesma coisa. Este:
instancia um
SqlConnection
objeto e inicializa oconn
variável definindo-a para essa instância.Como o construtor de um objeto também define as propriedades do objeto com seus valores padrão, geralmente é correto dizer que instanciar um objeto o inicializa. (Enganoso, se o objeto expõe um método que você precisa chamar explicitamente para inicializá-lo depois de ser instanciado, como às vezes é o caso).
fonte
* Instanciação significa criar uma instância para uma classe ou objeto. Inicialização significa * iniciar o mesmo objeto ou classe para qualquer finalidade. **
fonte
Instanciado significa que uma instância do objeto foi criada. Iniciado significa que o mesmo objeto fez alguma inicialização.
fonte
Ao instanciar uma classe ou objeto, você está criando uma nova instância dele ou alocando memória para "manter" uma. Inicializar esse objeto seriam as instruções que são executadas durante a instanciação.
fonte
Instanciação é quando você cria uma instância de uma classe. Essa instância é então um objeto e você pode definir suas propriedades ou chamar métodos nele (dizer-lhe para fazer coisas).
A iniciação é quando você estabelece um conjunto de condições iniciais para algo. Esse algo pode ser um objeto, onde você o instrui a se iniciar, ou apenas uma variável à qual atribui um valor.
Um objeto pode inicializar algumas outras coisas ou mesmo instanciar outros objetos como parte de sua iniciação.
A diferença é que a instanciação é a criação de algo que pode fazer coisas; iniciação é algo que pode ser feito.
fonte
Consulte os documentos Java: https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html
" Ponto originOne = novo Ponto (23, 94);
fonte
Podemos ver dessa maneira. Para uma linha de código abaixo:
A linha acima pode ser lida da seguinte maneira:
O assunto de referência ou contexto é importante. Ao falar em termos de variável , usamos a palavra inicializar . Quando falamos em termos de classe / tipo , usamos a palavra instanciar .
fonte
A instanciação se refere à alocação de memória para criar uma instância de uma classe, enquanto a inicialização se refere a nomear essa instância atribuindo o nome da variável a essa instância.
Por exemplo:
SqlConnection conn = new SqlConnection();
Aqui
new
está uma palavra-chave que aloca memória para uma instância econn
é um nome de variável atribuído a essa instância.fonte
Outros explicaram a diferença, então não vou entrar em detalhes. Mas há casos em que a instanciação não inicializa corretamente um objeto. Ao instanciar um objeto, você também o inicializa com alguns dados. A classe / tipo terá a lógica de inicialização, enquanto a lógica de instanciação normalmente é realizada por
new
palavra - chave (basicamente alocação de memória, cópia de referência etc.). Mas a instanciação não precisa necessariamente resultar em um estado válido para objetos, que é quando podemos dizer que o objeto não foi inicializado . Aqui está um exemplo prático onde um objeto pode ser instanciado, mas não inicializado (desculpe, por exemplo, em C #).GetUninitializedObject
não chama o construtor para instanciar o objeto lá (mas alguma mágica interna).Também se poderia argumentar que os tipos de valor não são instanciados, mas apenas inicializados, pois não precisa de uma nova alocação quando você faz,
new..
mas isso depende da definição de instanciação.fonte