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?
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?
Respostas:
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:
Dim obj as Object
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:
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 obj
variável é inicializada com a referência ao novo Object
que foi instanciado . Dizemos que o novo Object
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:
Object obj = new Object();
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 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).
Instanciado significa que uma instância do objeto foi criada. Iniciado significa que o mesmo objeto fez alguma inicialização.
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.
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.
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."
Podemos ver dessa maneira. Para uma linha de código abaixo:
var p = new Person();
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 .
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 e conn
é um nome de variável atribuído a essa instância.
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 #).
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.