VB.NET에 대한 Microsoft 자습서에서 사용되는이 두 단어를 들었습니다. 변수와 관련하여 사용될 때이 두 단어의 차이점은 무엇입니까?
VB.NET에 대한 Microsoft 자습서에서 사용되는이 두 단어를 들었습니다. 변수와 관련하여 사용될 때이 두 단어의 차이점은 무엇입니까?
답변:
C #의 변수 는 두 그룹 중 하나에 있습니다. 값 유형 또는 참조 유형. int
및 같은 유형 DateTime
은 값 유형입니다. 반대로 생성하는 모든 클래스는 참조 유형입니다. C # 문자열도 참조 유형입니다. .NET 프레임 워크의 대부분은 참조 유형입니다.
변수 이름이 있고 value 입니다. 두 부분 .
변수의 이름 은 사용자가 선언 한 것입니다. 값은 당신이 무엇을 할당하는 그것.
모든 변수는 변수가 선언 되는 시점에서 항상 초기 값이 주어집니다 . 따라서 모든 변수가 초기화 됩니다.
들어 값 유형처럼 int
그렇게 명시 적으로하지 않으면 컴파일러 그들에게 올바른 가치를 제공 할 것입니다. int
의는 초기화 기본적으로 제로로, DateTime
의는 초기화 에 DateTime.MinValue
기본적으로.
참조 유형 변수 는 사용자가 제공 한 객체로 초기화 됩니다. 그렇지 않으면 컴파일러는 객체 (즉, 유효한 값)를 할당 하지 않습니다. 이 경우 값은 null
-없음입니다. 그래서 우리는 참조가 null 로 초기화 되었다고 말합니다 .
인간이 태어났습니다. 개체가 인스턴스화됩니다. 아기는이다 예를 인간의 객체는이다 예를 몇 가지 클래스의.
클래스 의 인스턴스 를 만드는 행위를 인스턴스화 (Ta-Da!)라고합니다.
MyClass myClassyReference = new MyClass();
위에서 "... 객체 의 인스턴스를 생성하는 중 ..."이라고 말하는 것은 잘못된 것입니다 .
편집-댓글 토론에서 영감을 얻음
별개의 용어를 사용하여 위의 세 가지 별개의 작업이 진행되고 있으며 해당 용어는 서로 바꿔서 사용할 수 없습니다.
MyClass myClassyReference
new MyClass()
=
.사실을 다시 말함 :
참조 유형 변수는 단순히 "참조"라고도합니다. "값 유형 변수"는 참조가 아닙니다.
이것은 "objectA는 객체의 인스턴스입니다"는 완전히 잘못되었습니다. objectA가 "objectB의 인스턴스"였다면 objectA는 objectB의 유형 (어떤 것이 든 현재 상태)으로 생명을 시작해야합니다. objectB가 변경되면 개체 D, E 및 F를 만드는 것은 어떻습니까? 아니, 아니! "objectA는 클래스의 인스턴스"라는 개념적이고 기술적 인 경우입니다. "Instantiation"및 "instance of"는 정확한 의미를 갖습니다. 객체는 클래스에서 유형, 정의 및 값을 가져옵니다.
MyClass myClassyReference = null
일반적으로 우리는 "변수가 null에 할당 됨"이라고 말하지 않고 "변수가 null을 참조합니다"라고 말하지 않습니다. 대신 "변수가 null입니다"라고 말합니다. 또는 "변수가 아무것도 참조하지 않습니다."또는 "참조가 null입니다."
실용적인 응용 프로그램:
나는 당신의 코드에 손가락을 대고 "이 인스턴스에는 유효하지 않은 속성이 있습니다. 이것이 루프가 실패하는 이유입니다. 인스턴스화하는 동안 매개 변수를 검증해야합니다."라고 말합니다. (즉, 생성자 인수).
나는 당신의 코드에서 이것을 본다.
MyClass myClassyReference;
myClassyReference.DoSomething();
"변수를 선언했지만 할당하지 않았습니다. null이므로 아무 것도 참조하지 않습니다. 이것이 메서드 호출에서 예외가 발생하는 이유입니다."
편집 종료
기준 입력 변수의 이름과 값은 독립적으로 존재한다. 그리고 나는 독립을 의미합니다.
인스턴스 객체에 대한 참조도있을 수도 있고 없을 수도 있습니다.
인스턴스 객체는 많은 참조가있을 수 있습니다.
A는 선언 참조 수도 있고되지 않을 수도 를 가리키는 객체.
변수는 값으로 초기화된다. 객체는 메모리가 그것을 위해 할당되고 그것의 생성자가 실행되었을 때 인스턴스화됩니다.
예를 들어 다음은 변수입니다.
Dim obj as Object
이 변수는 초기화 되지 않았습니다 . obj
변수에 값을 할당 하면 변수가 초기화됩니다. 다음은 초기화의 예입니다.
obj = 1
obj = "foo"
인스턴스화는 매우 다른 것이지만 인스턴스화는 일반적으로 초기화가 뒤 따르기 때문에 관련이 있습니다.
Dim obj As New Object()
앞의 코드 라인에서, obj
변수되고 초기화 새에 참조로 Object
한 것 인스턴스화 . 우리 Object
는 새 인스턴스를 만들었 기 때문에 새 인스턴스가 생성되었다고 말합니다.
이제 저는 VB.NET이 위의 코드에서 할당이 발생하고 있다는 것이 명확하지 않기 때문에 C #보다 훨씬 더 혼란스러워한다고 생각합니다. C #에서는 인스턴스의 인스턴스화와 변수의 초기화가 모두 있다는 것이 훨씬 더 분명합니다.
Object obj = new Object();
무언가 를 초기화하는 것은 초기 값으로 설정하는 것입니다. 무언가 를 인스턴스화 하는 것은 인스턴스를 만드는 것입니다.
종종 이것은 다소 같은 것입니다. 이:
SqlConnection conn = new SqlConnection();
인스턴스화SqlConnection
개체를 초기화conn
인스턴스로 설정 변수.
객체의 생성자는 객체의 속성도 기본값으로 설정하기 때문에 객체를 인스턴스화하면 초기화된다고 말하는 것이 올바른 경우가 많습니다. (오해의 소지가 있습니다. 개체가 인스턴스화 한 후 초기화하기 위해 명시 적으로 호출해야하는 메서드를 노출하는 경우도 있습니다.)
클래스 나 객체를 인스턴스화 할 때 새 인스턴스를 만들거나 하나를 "보유"하기 위해 메모리를 할당합니다. 해당 개체를 초기화하는 것은 인스턴스화 중에 수행되는 명령입니다.
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."
다른 사람들이 차이점을 설명 했으므로 자세히 설명하지 않겠습니다. 그러나 인스턴스화가 개체를 제대로 초기화하지 못하는 경우가 있습니다. 개체를 인스턴스화 할 때 일부 데이터로도 초기화합니다. 클래스 / 유형에는 초기화 논리가있는 반면 인스턴스화 논리는 일반적으로 new
키워드 (기본적으로 메모리 할당, 참조 복사 등)에 의해 수행됩니다 . 그러나 인스턴스화는 객체가 uninitialzed 라고 말할 수있는 객체에 대해 반드시 유효한 상태가 될 필요는 없습니다 . 다음은 개체를 인스턴스화 할 수 있지만 초기화 할 수없는 실제 예제입니다 (예 : C #에서 미안함).
class P { string name = "Ralf"; }
WriteLine(new P().name); // "Ralf";
WriteLine((FormatterServices.GetUninitializedObject(typeof(P)) as P).name); // null
GetUninitializedObject
생성자를 호출하여 개체를 인스턴스화하지 않습니다 (그러나 내부 마법).
또한 값 유형이 인스턴스화되지 않고 초기화 될 때 새 할당이 필요하지 않기 때문에 초기화 new..
만한다고 주장 할 수 있지만 이는 인스턴스화 정의에 달려 있습니다.