Qual é a diferença entre “instanciado” e “inicializado”?

105

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?

eu--''''''---------''''''''''''
fonte

Respostas:

142

Valor em relação aos Tipos de Referência

As variáveis em C # estão em 1 de 2 grupos. Tipos de valor ou tipos de referência . Os tipos gostam inte DateTimesã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 .

Partes de uma variável

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.

Variáveis ​​são inicializadas

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 into compilador, fornecerá a eles um valor válido se você não fizer isso explicitamente. inté inicializado com zero por padrão, DateTimee inicializado com DateTime.MinValuecomo 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.

Objetos são instanciados

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!)

Portanto , declarar , inicializar e instanciar vêm juntos assim

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:

  1. Uma variável de referência é declarada - MyClass myClassyReference
  2. Um objeto é instanciado (... de / de uma determinada classe , implícito) -new MyClass()
  3. O objeto é atribuído à variável. =.

Reafirmando os fatos:

  1. 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.

  2. 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.

  3. 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


A Insustentável Leveza do Ser

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.

radarbob
fonte
Explicação perfeita!
M. Fawad Surosh
Se for errado dizer: "... criando uma instância de um objeto ...", o que você deve dizer? "... instanciar um objeto e atribuir uma referência a ele ..."?
Aaron Dake,
Ou que tal: "... instanciar um objeto e inicializar uma variável para uma referência dele"? Isso inclui ambas as palavras e parece explicar tudo - embora de uma forma bastante longa. O que você acha?
Aaron Dake,
... o que você deve dizer? Diga: "criando uma instância de uma classe", não '... de um objeto'. E "instanciar uma variável para uma referência dela" é uma conversa dupla e está errado de 2 maneiras: (1) apenas objetos são instanciados. (2) Uma variável 'apontando para' um objeto é uma variável de referência, ou em suma, a variável é a referência. Direi de outra forma: uma variável de "tipo de referência" é uma referência. Refere-se a - ou aponta para - um objeto.
radarbob
40

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:

Dim obj as Object

Esta variável não foi inicializada . Depois de atribuir um valor à objvariável, a variável será inicializada. Aqui estão alguns exemplos de inicialização:

obj = 1
obj = "foo"

A instanciação é uma coisa muito diferente, mas está relacionada, pois a instanciação geralmente é seguida pela inicialização:

Dim obj As New Object()

Na linha de código anterior, a objvariável é inicializada com a referência ao novo Objectque foi instanciado . Dizemos que o novo Objectfoi 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:

Object obj = new Object();
Andrew Hare
fonte
@Andrew object obj = 1; é inicialização e objeto obj = new object () / é instanciação e inicialização, isto é o que você mencionou. Agora eu quero te perguntar duas coisas. 1. o que é isso? objeto obj; ? 2. A memória foi alocada quando eu uso o objeto obj; ?? ou é alocado quando eu o inicializo por este objeto de código obj = 1; ?
kashif
Eu diria que "objeto obj" é a declaração, e não, a memória ainda não foi alocada. Ou, pelo menos, apenas memória suficiente para conter um valor "nulo". A memória real para a variável será alocada com base no valor assim que for inicializada.
Aaron Dake
14

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:

SqlConnection conn = new SqlConnection();

instancia um SqlConnectionobjeto 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).

Robert Rossney
fonte
4

* Instanciação significa criar uma instância para uma classe ou objeto. Inicialização significa * iniciar o mesmo objeto ou classe para qualquer finalidade. **

Sona
fonte
3

Instanciado significa que uma instância do objeto foi criada. Iniciado significa que o mesmo objeto fez alguma inicialização.

Gabriel McAdams
fonte
2

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.

typeoneerror
fonte
2

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.

ChrisA
fonte
1

Consulte os documentos Java: https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html

" Ponto originOne = novo Ponto (23, 94);

Declaration: The code set in bold are all variable declarations that associate a variable name with an object type.
Instantiation: The new keyword is a Java operator that creates the object.
Initialization: The new operator is followed by a call to a constructor, which initializes the new object."
Jaros
fonte
1

Podemos ver dessa maneira. Para uma linha de código abaixo:

var p = new Person();

A linha acima pode ser lida da seguinte maneira:

  1. A variável p foi inicializada como uma classe pessoal
  2. A classe Person foi instanciada na variável p

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 .

MrClan
fonte
0

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 newestá uma palavra-chave que aloca memória para uma instância e conné um nome de variável atribuído a essa instância.

Rizwan
fonte
0

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 newpalavra - 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 #).

class P { string name = "Ralf"; }

WriteLine(new P().name); // "Ralf";
WriteLine((FormatterServices.GetUninitializedObject(typeof(P)) as P).name); // null

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.

Nawfal
fonte