VB.NET için Microsoft eğitimlerinde kullanılan bu iki kelimeyi duyuyorum. Değişkenlere referans olarak kullanıldığında bu iki kelime arasındaki fark nedir?
VB.NET için Microsoft eğitimlerinde kullanılan bu iki kelimeyi duyuyorum. Değişkenlere referans olarak kullanıldığında bu iki kelime arasındaki fark nedir?
Yanıtlar:
C # değişkenleri 2 grubun 1'inde. Değer türleri veya Başvuru türleri. Türleri gibi int
ve DateTime
olduğ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.
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.
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 int
bunu 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.MinValue
varsayı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 .
İ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!)
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:
MyClass myClassyReference
new MyClass()
=
.Gerçekleri tekrarlamak:
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.
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.
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
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.
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ı . obj
Değ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, obj
değişken bir başlatılır yeni referansla Object
olduğu örneği . Object
Yeninin 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();
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 SqlConnection
nesneyi 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.)
Örneklenmiş, nesnenin bir örneğinin yaratıldığı anlamına gelir. Başlatılmış, aynı nesnenin bir miktar başlatma yaptığı anlamına gelir.
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.
Ö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.
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."
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:
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 .
Ö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 new
bir örnek için bellek ayıran bir anahtar sözcük ve conn
bu örnek için atanan bir değişken adıdır.
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 new
anahtar 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.