"Örneklenmiş" ve "başlatılmış" arasındaki fark nedir?


Yanıtlar:


142

Karşılıklı Değer Referans Türleri

C # değişkenleri 2 grubun 1'inde. Değer türleri veya Başvuru türleri. Türleri gibi intve DateTimeolduğu değer türleri. Bunun aksine, oluşturduğunuz herhangi bir sınıf bir referans türüdür. C # dizeleri de bir başvuru türüdür. .NET çerçevesindeki çoğu şey başvuru türleridir.

Bir Değişkenin Parçaları

Değişken adı ve değeri var . İki parça .

Değişkenin adı , sizin açıkladığınız şeydir. Değeri ne olduğunu atamak kendisine.

Değişkenler Başlatıldı

Tüm değişkenlere , değişkenin bildirildiği noktada her zaman bir başlangıç değeri verilir . Böylece tüm değişkenler başlatılır .

İçin değer türleri gibi intbunu açıkça yapmazsanız derleyici onları geçerli bir değer verecektir. int'ın başlatmak varsayılan olarak sıfıra, DateTime' ın başlatmak için DateTime.MinValuevarsayılan olarak.

Referans tipi değişkenler başlatmak bunu vermek nesneye. Derleyici olmaz atamak Aksi takdirde bir nesne (yani geçerli bir değer). Bu durumda değer null- hiçbir şeydir. Dolayısıyla referansın sıfır olarak başlatıldığını söylüyoruz .

Nesnelerin Örneği

İnsanlar doğar. Nesneler somutlaştırılır. Bir bebek bir İnsanın bir örneğidir , bir nesne bir Sınıfın bir örneğidir .

Bir Sınıfın bir örneğini yaratma eylemine somutlaştırma (Ta-Da!)

Öyleyse beyan et , başlat ve örnekle böyle bir araya gel

MyClass myClassyReference = new MyClass();

Yukarıdaki olarak, "bir örneğini oluşturarak ... söylemek yanlış nesne ..."


düzenleme - yorum tartışmalarından esinlenilmiştir

Farklı terminoloji kullanan (yukarıda) üç farklı şey devam ediyor ve bu terminoloji birbirinin yerine kullanılamaz:

  1. Bir referans değişkeni bildirildi - MyClass myClassyReference
  2. Bir nesne somutlaştırılır (... belirli bir sınıftan / sınıftan , ima edilen) -new MyClass()
  3. Nesne değişkene atanır. =.

Gerçekleri tekrarlamak:

  1. Bir referans tipi değişken ayrıca basitçe "referans" olarak adlandırılır. "Değer türü değişken" bir referans değildir.

  2. Bu: "objectA, bir nesnenin örneğidir" son derece yanlıştır. NesneA, "nesne B'nin bir örneği" ise, o zaman nesneA, hayata nesne B'nin türü ile başlar - bu ne olursa olsun - ve mevcut durum - her ne ise. ObjectB değiştikçe D, E ve F nesnelerini oluşturmaya ne dersiniz? Hayır, hayır! Kavramsal ve teknik durum, "nesneA, bir Sınıfın bir örneğidir". "Örnekleme" ve "örneği" kesin bir anlama sahiptir - bir nesne, türünü, tanımlarını ve değerlerini bir Sınıftan alır.

  3. MyClass myClassyReference = null Genelde "değişken null'a atandı" demiyoruz ve asla "değişken null'a başvuruyor" demiyoruz, Hayır, bunun yerine "değişken null" diyoruz; veya "değişken hiçbir şeye başvurmuyor" veya "başvuru boş"

Pratik uygulama:

  • Parmağımı kodunuza dokunduruyorum ve "bu örneğin geçersiz bir özelliği var. Döngü bu yüzden başarısız olabilir. Örnekleme sırasında parametreleri doğrulamanız gerekir." (yani yapıcı argümanları).

  • Bunu kodunuzda görüyorum

    MyClass myClassyReference;
    myClassyReference.DoSomething();
    

    "Değişkeni bildirdiniz, ancak onu asla atamadınız. Boş olduğundan hiçbir şeye başvurmuyor. Bu nedenle yöntem çağrısı bir istisna atıyor."

düzenlemeyi bitir


Varolmanın Dayanılmaz Hafifliği

Bir başvuru türü değişkeninin adı ve değeri bağımsız olarak mevcuttur. Ve bağımsız demek istiyorum.

Bir örneği nesne ya da bir referans olabilir veya olmayabilir.

Bir örneği nesne kendisine birçok referans olabilir.

Bir beyan referans olabilir veya olmayabilir işaret bir nesne.


Mükemmel açıklama!
M.Fawad Surosh

"... bir nesnenin örneğini yaratmak ..." demek yanlışsa, ne söylemelisiniz? "... bir nesneyi örneklemek ve ona bir referans atamak ..."?
Aaron Dake

Ya da: "... bir nesneyi somutlaştırmak ve bir değişkeni onun referansına göre başlatmak"? Bu, her iki kelimeyi de içerir ve her ne kadar uzun bir şekilde de olsa, hepsini heceliyor gibi görünüyor. Ne düşünüyorsun?
Aaron Dake

... ne söylemelisin? Deyin ki: "... bir nesnenin" değil, "sınıfın bir örneğini yaratmak". Ve "bir değişkeni bir referansına örneklemek" iki yönden yanlıştır ve 2 yönden yanlıştır: (1) sadece Nesneler somutlaştırılır. (2) Bir nesneyi 'işaret eden' bir değişken, bir referans değişkendir veya kısaca, değişken referanstır. Farklı bir şekilde söyleyeceğim: Bir "referans türü" değişkeni bir referanstır. Bir nesneye işaret eder veya onu gösterir.
radarbob

40

Bir değişken , bir değerle başlatılır. Bir nesne için bellek ayrıldığında ve yapıcısı çalıştırıldığında bir nesne başlatılır.

Örneğin burada bir değişken var:

Dim obj as Object

Bu değişken başlatılmadı . objDeğişkene bir değer atadığımda, değişken başlatılacak. İşte başlatma örnekleri:

obj = 1
obj = "foo"

Örnekleme çok farklı bir şeydir ama ilişkilidir çünkü somutlaştırmanın ardından genellikle başlatma gelir:

Dim obj As New Object()

Önceki kod paralel olarak, objdeğişken bir başlatılır yeni referansla Objectolduğu örneği . ObjectYeninin somutlaştırıldığını söylüyoruz çünkü onun yeni bir örneğini yarattık.

Şimdi, VB.NET'in bunu C # 'dan çok daha kafa karıştırıcı hale getirdiğine inanıyorum çünkü yukarıdaki kodda bir atamanın yer alıp almadığı net değil. C # 'da, hem bir örneğin somutlaştırılması hem de bir değişkenin başlatılması olduğu çok daha açıktır:

Object obj = new Object();

@Andrew nesnesi obj = 1; ilklendirme ve nesne obj = new object () / örnekleme ve başlatma, bahsettiğiniz şey budur. Şimdi size iki şey sormak istiyorum. 1. bu nedir? nesne obj; ? 2. nesneyi kullandığımda bellek ayrılmış mı; ?? veya bu kod nesnesiyle başlattığımda, obj = 1; ?
kashif

"Nesne obj" nin bildirim olduğunu söyleyebilirim ve hayır, bellek henüz tahsis edilmedi. Veya en azından yalnızca "boş" değerini tutmaya yetecek kadar bellek. Değişken için gerçek bellek, başlatıldıktan sonra değere göre tahsis edilecektir.
Aaron Dake

14

Bir şeyi başlatmak , onu başlangıç ​​değerine ayarlamaktır. Bir şeyi somutlaştırmak , onun bir örneğini yaratmaktır.

Çoğu zaman bu aşağı yukarı aynı şeydir. Bu:

SqlConnection conn = new SqlConnection();

başlatır bir SqlConnectionnesneyi ve başlatırconn o örneğe ayarlayarak değişkeni.

Bir nesnenin yapıcısı aynı zamanda nesnenin özelliklerini de varsayılan değerlerine ayarladığından, bir nesneyi başlatmanın onu başlattığını söylemek genellikle doğrudur. (Yanıltıcı, eğer nesne, bazen olduğu gibi, başlatıldıktan sonra onu başlatmak için açıkça çağırmanız gereken bir yöntemi ortaya çıkarırsa.)


4

* Örnekleme, bir sınıf veya nesne için bir örnek oluşturmak anlamına gelir. Başlatma, * herhangi bir amaç için aynı nesneyi veya sınıfı başlatmak anlamına gelir. **


3

Örneklenmiş, nesnenin bir örneğinin yaratıldığı anlamına gelir. Başlatılmış, aynı nesnenin bir miktar başlatma yaptığı anlamına gelir.


2

Bir sınıf veya nesneyi başlattığınızda, bunun yeni bir örneğini oluşturursunuz veya birini "tutmak" için bellek ayırırsınız. Bu nesnenin başlatılması, örnekleme sırasında gerçekleştirilen talimatlar olacaktır.


2

Örnekleme, bir sınıfın bir örneğini oluşturduğunuz zamandır. Bu örnek daha sonra bir nesnedir ve özelliklerini ayarlayabilir veya üzerinde yöntemler çağırabilirsiniz (ona bir şeyler yapmasını söyleyin).

Başlatma, bir şey için bir dizi başlangıç ​​koşulu oluşturduğunuz zamandır. Bir şeyin kendisini başlatmasını söylediğiniz bir nesne veya yalnızca bir değer atadığınız bir değişken olabilir.

Bir nesne başka şeyleri başlatabilir, hatta başlangıcının bir parçası olarak diğer nesneleri başlatabilir.

Aradaki fark, somutlaştırmanın bir şeyler yapabilen bir şeyin yaratılmasıdır; başlatma, yapılan şeydir.


1

Java belgelerine bakın: https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html

" Point originOne = new Point (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."

1

Bu şekilde görebiliriz. Aşağıdaki kod satırı için:

var p = new Person();

Yukarıdaki satır aşağıdaki iki şekilde okunabilir:

  1. P değişkeni bir kişi sınıfı olarak başlatıldı
  2. Kişi sınıfı, p değişkeninde somutlaştırıldı

Referans konusu veya bağlam önemlidir. Değişken açısından konuşurken, initialize kelimesini kullanıyoruz . Sınıf / tür açısından konuşurken, örnekleme kelimesini kullanırız .


0

Örnekleme, bir sınıfın bir örneğini oluşturmak için bellek tahsisine atıfta bulunurken, başlatma, değişken adını bu örneğe atayarak o örneği adlandırmayı ifade eder.

Örneğin: SqlConnection conn = new SqlConnection();

Burada newbir örnek için bellek ayıran bir anahtar sözcük ve connbu örnek için atanan bir değişken adıdır.


0

Başkaları farkı açıkladı, bu yüzden ayrıntıya girmeyeceğim. Ancak somutlaştırmanın bir nesneyi doğru şekilde başlatmadığı durumlar vardır. Bir nesneyi örneklediğinizde, onu bazı verilerle de başlatırsınız. Sınıf / tür, başlatma mantığına sahip olurken, örnekleme mantığı tipik olarak newanahtar kelime tarafından gerçekleştirilir (temel olarak bellek ayırma, referans kopyalama vb.). Ancak somutlaştırmanın, nesneler için geçerli bir duruma neden olması gerekmez, bu, nesnenin başlatılmamış olduğunu söyleyebiliriz . İşte bir nesnenin somutlaştırılabildiği ancak ilklendirilemediği pratik bir örnek (üzgünüm, örneğin C #).

class P { string name = "Ralf"; }

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

GetUninitializedObject yapıcıyı orada nesneyi somutlaştırması için çağırmaz (ancak biraz iç sihir).

Ayrıca, değer türlerinin somutlaştırılmadığı, ancak bunu yaptığınızda yeni ayırmaya ihtiyaç duymadığı için başlatıldığını, new..ancak bu kişinin somutlaştırma tanımına bağlı olduğunu iddia edebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.