Tôi đã nghe thấy hai từ này được sử dụng trong các hướng dẫn của Microsoft cho VB.NET. Sự khác biệt giữa hai từ này khi được sử dụng để tham chiếu đến các biến là gì?
Tôi đã nghe thấy hai từ này được sử dụng trong các hướng dẫn của Microsoft cho VB.NET. Sự khác biệt giữa hai từ này khi được sử dụng để tham chiếu đến các biến là gì?
Câu trả lời:
Các biến trong C # thuộc 1 trong 2 nhóm. Loại giá trị hoặc Loại tham chiếu . Các loại như int
và DateTime
là các loại giá trị . Ngược lại, bất kỳ lớp nào bạn tạo đều là một kiểu tham chiếu . Chuỗi C # cũng là một kiểu tham chiếu . Hầu hết mọi thứ trong .NET framework đều là các kiểu tham chiếu .
Có tên biến và giá trị của nó . Hai phần .
Tên biến là tên mà bạn khai báo . Các giá trị là những gì bạn gán cho nó.
Tất cả các biến luôn được cung cấp một giá trị ban đầu tại thời điểm biến được khai báo . Như vậy tất cả các biến đều được khởi tạo .
Đối với các loại giá trị , như int
trình biên dịch sẽ cung cấp cho chúng một giá trị hợp lệ nếu bạn không làm như vậy một cách rõ ràng. int
's khởi tạo bằng không theo mặc định, DateTime
' s khởi tạo để DateTime.MinValue
theo mặc định.
Các biến kiểu tham chiếu khởi tạo cho đối tượng mà bạn cung cấp cho nó. Trình biên dịch sẽ không gán một đối tượng (tức là một giá trị hợp lệ) nếu bạn không gán . Trong trường hợp này, giá trị là null
- không có gì. Vì vậy, chúng tôi nói rằng tham chiếu được khởi tạo thành null.
Con người được sinh ra. Các đối tượng được khởi tạo. Một em bé là một thể hiện của Con người, một đối tượng là một thể hiện của Lớp nào đó.
Hành động tạo một thể hiện của một Lớp được gọi là khởi tạo (Ta-Da!)
MyClass myClassyReference = new MyClass();
Ở phần trên, sai khi nói "... tạo một thể hiện của một đối tượng ..."
chỉnh sửa - lấy cảm hứng từ thảo luận bình luận
Ba điều khác biệt đang diễn ra (ở trên) bằng cách sử dụng thuật ngữ riêng biệt và thuật ngữ đó không thể thay thế cho nhau:
MyClass myClassyReference
new MyClass()
=
.Khôi phục sự thật:
Một biến kiểu tham chiếu còn được gọi đơn giản là "một tham chiếu". "Biến kiểu giá trị" không phải là một tham chiếu.
Điều này: "objectA là một thể hiện của một đối tượng" là sai sâu sắc. Nếu objectA là "một thể hiện của objectB" thì objectA phải bắt đầu cuộc sống với kiểu của objectB - bất kể đó là gì - và trạng thái hiện tại - bất kể đó là gì. Còn việc tạo các đối tượng D, E và F khi đối tượngB thay đổi thì sao? Không, bây giờ! Đây là trường hợp kỹ thuật và khái niệm "objectA là một thể hiện của một Lớp". "Instantiation" và "instance of" có ý nghĩa chính xác - một đối tượng nhận kiểu, định nghĩa và giá trị của nó từ một Lớp.
MyClass myClassyReference = null
Nói chung, chúng tôi không nói "biến được gán cho null" và chúng tôi không bao giờ nói "biến đang tham chiếu đến null", thay vào đó chúng tôi nói "biến là null"; hoặc "biến không tham chiếu đến bất kỳ thứ gì" hoặc "tham chiếu là null"
Ứng dụng thực tế:
Tôi chọc ngón tay vào mã của bạn và nói "phiên bản này có thuộc tính không hợp lệ. Có thể đó là lý do tại sao vòng lặp không thành công. Bạn phải xác thực các thông số trong quá trình khởi tạo." (tức là các đối số của hàm tạo).
Tôi thấy điều này trong mã của bạn,
MyClass myClassyReference;
myClassyReference.DoSomething();
"Bạn đã khai báo biến nhưng chưa bao giờ gán nó. Nó null nên nó không tham chiếu đến bất cứ thứ gì. Đó là lý do tại sao lệnh gọi phương thức ném ra một ngoại lệ."
kết thúc chỉnh sửa
Một tài liệu tham khảo loại tên và giá trị biến của tồn tại một cách độc lập. Và tôi có nghĩa là độc lập.
Một đối tượng được khởi tạo có thể có hoặc không có tham chiếu đến nó.
Một đối tượng được khởi tạo có thể có nhiều tham chiếu đến nó.
Một tham chiếu được khai báo có thể trỏ tới một đối tượng hoặc không .
Một biến được khởi tạo với một giá trị. Một đối tượng được khởi tạo khi bộ nhớ được cấp phát cho nó và phương thức khởi tạo của nó đã được chạy.
Ví dụ ở đây là một biến:
Dim obj as Object
Biến này chưa được khởi tạo . Khi tôi gán giá trị cho obj
biến, biến đó sẽ được khởi tạo. Dưới đây là các ví dụ về khởi tạo:
obj = 1
obj = "foo"
Thuyết minh là một thứ rất khác nhưng có liên quan vì quá trình khởi tạo thường được theo sau bởi khởi tạo:
Dim obj As New Object()
Trong dòng mã trước, obj
biến được khởi tạo với tham chiếu đến biến mới Object
đã được khởi tạo . Chúng tôi nói rằng cái mới Object
đã được khởi tạo bởi vì chúng tôi đã tạo một phiên bản mới của nó.
Bây giờ tôi tin rằng VB.NET làm cho điều này khó hiểu hơn rất nhiều so với C # vì không rõ ràng rằng một nhiệm vụ đang diễn ra trong đoạn mã trên. Trong C #, rõ ràng hơn là có cả khởi tạo một thể hiện và khởi tạo một biến:
Object obj = new Object();
Để khởi tạo một cái gì đó là đặt nó thành giá trị ban đầu của nó. Để khởi tạo một cái gì đó là tạo một phiên bản của nó.
Thường thì đây là điều ít nhiều giống nhau. Điều này:
SqlConnection conn = new SqlConnection();
instantiates một SqlConnection
đối tượng, và khởi sự conn
biến bằng cách thiết lập nó vào trường hợp đó.
Vì phương thức khởi tạo của một đối tượng cũng đặt các thuộc tính của đối tượng thành các giá trị mặc định của chúng, nên thường đúng khi nói rằng việc khởi tạo một đối tượng sẽ khởi tạo nó. (Gây hiểu lầm, nếu đối tượng để lộ một phương thức mà bạn phải gọi một cách rõ ràng để khởi tạo nó sau khi nó được khởi tạo, đôi khi cũng như vậy).
Instantiated có nghĩa là một phiên bản của đối tượng đã được tạo. Được khởi tạo có nghĩa là cùng một đối tượng đã thực hiện một số khởi tạo.
Khi bạn khởi tạo một lớp hoặc đối tượng, bạn đang tạo một phiên bản mới của nó hoặc cấp phát bộ nhớ để "giữ" một lớp hoặc đối tượng. Khởi tạo đối tượng đó sẽ là các lệnh được thực hiện trong quá trình khởi tạo.
Thuyết minh là khi bạn tạo một thể hiện của một lớp. Thể hiện đó sau đó là một đối tượng và bạn có thể đặt các thuộc tính của nó hoặc gọi các phương thức trên nó (yêu cầu nó thực hiện mọi việc).
Khởi đầu là khi bạn thiết lập một tập hợp các điều kiện ban đầu cho một thứ gì đó. Cái gì đó có thể là một đối tượng, nơi bạn yêu cầu nó tự khởi tạo hoặc chỉ là một biến mà bạn gán giá trị.
Một đối tượng có thể khởi tạo một số thứ khác, hoặc thậm chí khởi tạo các đối tượng khác như một phần của quá trình khởi tạo của nó.
Sự khác biệt là việc tạo ra là tạo ra một thứ có thể làm được nhiều thứ; bắt đầu là công việc được thực hiện.
Xem tài liệu Java: 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."
Chúng ta có thể thấy nó theo cách này. Đối với dòng mã dưới đây:
var p = new Person();
Dòng trên có thể được đọc như sau hai cách:
Chủ đề tham chiếu hoặc ngữ cảnh quan trọng. Khi nói về biến , chúng ta sử dụng từ khởi tạo . Khi nói về lớp / loại , chúng tôi dùng chữ thuyết minh .
Khởi tạo đề cập đến việc cấp phát bộ nhớ để tạo một thể hiện của một lớp trong khi khởi tạo đề cập đến việc đặt tên cho thể hiện đó bằng cách gán tên biến cho thể hiện đó.
Ví dụ: SqlConnection conn = new SqlConnection();
Đây new
là một từ khóa cấp phát bộ nhớ cho một phiên bản và conn
là một tên biến được gán cho phiên bản đó.
Những người khác đã giải thích sự khác biệt, vì vậy tôi sẽ không đi vào chi tiết. Nhưng có những trường hợp khởi tạo không khởi tạo đúng một đối tượng. Khi bạn khởi tạo một đối tượng, bạn cũng khởi tạo nó với một số dữ liệu. Lớp / kiểu sẽ có logic khởi tạo, trong khi logic khởi tạo thường được thực hiện bởi new
từ khóa (về cơ bản là cấp phát bộ nhớ, sao chép tham chiếu, v.v.). Nhưng việc khởi tạo không nhất thiết phải dẫn đến trạng thái hợp lệ cho các đối tượng, đó là khi chúng ta có thể nói rằng đối tượng chưa được khởi tạo . Đây là một ví dụ thực tế trong đó một đối tượng có thể được khởi tạo nhưng không được khởi tạo (xin lỗi, ví dụ: trong C #).
class P { string name = "Ralf"; }
WriteLine(new P().name); // "Ralf";
WriteLine((FormatterServices.GetUninitializedObject(typeof(P)) as P).name); // null
GetUninitializedObject
không gọi hàm tạo để khởi tạo đối tượng ở đó (nhưng một số phép thuật bên trong).
Người ta cũng có thể tranh luận rằng các kiểu giá trị không được khởi tạo mà chỉ được khởi tạo vì nó không cần phân bổ mới khi bạn thực hiện new..
nhưng đó là tùy thuộc vào định nghĩa của một người về việc khởi tạo.