Sự khác biệt giữa "khởi tạo" và "khởi tạo" là gì?


105

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:


142

Giá trị loại tham chiếu trực quan

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ư intDateTimelà 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ác phần của một biến

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

Các biến được khởi tạo

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ư inttrì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.MinValuetheo 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.

Đối tượng được khởi tạo

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

Vì vậy, khai báo , khởi tạokhởi tạo cùng nhau như thế này

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:

  1. Một biến tham chiếu được khai báo - MyClass myClassyReference
  2. Một đối tượng được khởi tạo (... từ / của một lớp nhất định , ngụ ý) -new MyClass()
  3. Đối tượng được gán cho biến. =.

Khôi phục sự thật:

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

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

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


Ánh sáng không thể chịu đựng được của bản thể

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 .


Lời giải thích hoàn hảo!
M. Fawad Surosh

Nếu sai khi nói: "... tạo một thể hiện của một đối tượng ...", bạn nên nói gì? "... khởi tạo một đối tượng và gán một tham chiếu cho nó ..."?
Aaron Dake vào

Hoặc về: "... khởi tạo một đối tượng và khởi tạo một biến thành một tham chiếu của nó" thì sao? Điều đó bao gồm cả hai từ và dường như đánh vần tất cả - mặc dù, theo một cách khá dài. Bạn nghĩ sao?
Aaron Dake vào

... bạn nên nói gì? Nói: "tạo một thể hiện của một lớp", không phải "... của một đối tượng". Và "khởi tạo một biến thành một tham chiếu của nó" là nói đôi và sai theo 2 cách: (1) chỉ Đối tượng được khởi tạo. (2) Một biến 'trỏ tới' một đối tượng là một biến tham chiếu, hay nói ngắn gọn, biến là tham chiếu. Tôi sẽ nói cách khác: Biến "kiểu tham chiếu" là một tham chiếu. Nó đề cập đến - hoặc trỏ đến - một đối tượng.
radarbob

40

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 objbiế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, objbiế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();

@Andrew đối tượng obj = 1; là khởi tạo và đối tượng obj = new object () / là khởi tạo và khởi tạo đây là những gì bạn đã đề cập. Bây giờ tôi muốn hỏi bạn hai điều. 1. đây là gì? đối tượng đối tượng; ? 2. bộ nhớ đã được cấp phát khi tôi sử dụng đối tượng obj; ?? hoặc nó được định vị khi tôi khởi tạo nó bằng đối tượng mã này obj = 1; ?
kashif

Tôi sẽ nói "object obj" là khai báo, và không, bộ nhớ vẫn chưa được cấp phát. Hoặc ít nhất chỉ đủ bộ nhớ để giữ giá trị "null". Bộ nhớ thực cho biến sẽ được cấp phát dựa trên giá trị khi nó được khởi tạo.
Aaron Dake

14

Để 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ự connbiế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).


4

* Khởi tạo nghĩa là tạo một thể hiện cho một lớp hoặc đối tượng. Khởi tạo nghĩa là * khởi tạo cùng một đối tượng hoặc lớp cho bất kỳ mục đích nào. **


3

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.


2

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.


2

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.


1

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

1

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:

  1. Biến p đã được khởi tạo dưới dạng lớp người
  2. Lớp người đã được khởi tạo trong biến p

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 .


0

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 newlà một từ khóa cấp phát bộ nhớ cho một phiên bản và connlà một tên biến được gán cho phiên bản đó.


0

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 newtừ 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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.