먼저 CLR의 기본 값 유형 간의 비교를 살펴보고 먼저 코드를 살펴보세요.
int age1 = 30; int age2 = 30; Console.WriteLine("int == int: {0}", age1 == age2); Console.WriteLine("int == int: {0}", age2 == age1); Console.WriteLine("int Equals int: {0}", age1.Equals(age2)); Console.WriteLine("int Equals int: {0}", age2.Equals(age1)); Console.WriteLine("int ReferenceEquals int: {0}", object.ReferenceEquals(age1, age2)); Console.WriteLine("int ReferenceEquals int: {0}", object.ReferenceEquals(age2, age1)); Console.ReadLine();
실행 결과:
동일한 기본 값 유형(위 예제 코드에서는 둘 다 int임)의 경우 == 및 Equals()의 비교 결과는 동일합니다. ReferenceEquals()는 두 객체의 참조가 동일한지 여부를 결정하므로 값 유형의 경우 반드시 boxing 작업은 매번 임시 개체를 생성하므로 항상 false를 반환합니다. 다음으로 코드의 age2 유형을 바이트 유형으로 변경합니다. 비교 결과는 어떻게 되나요? 실행 결과를 살펴보세요.
이제 age1.Equals(age2)와 age2.Equals(age1)의 결과가 다르다는 것을 알 수 있습니다. 기본 값 유형 비교에서 ==는 "값"의 내용을 비교합니다. 두 개체의 "값"이 동일하면 두 개체는 "=="이지만 Equals()는 조금 더 많은 작업을 수행합니다. 즉, Equal()에는 실제로 "암시적 변환" 프로세스가 있습니다. 이는 위 코드의 age1.Equals(age2)가 int.Equals(int)와 동일하며 바이트 데이터가 암시적으로 Int 유형 데이터로 변환될 수 있음을 의미합니다. 이므로 age1.Equals(age2)의 결과는 true이고 age2.Equals(age1)은 byte.Equals(byte)와 동일하지만 int 유형 데이터는 손실 가능성이 있으므로 암시적으로 byte 유형으로 변환할 수 없습니다. 데이터 정밀도. 실제로 age2.Equals(age1)의 Equals()는 다음 코드와 유사해야 합니다.
public override bool Equals(object obj) { if (!(obj is Byte)) { return false; } return m_value == ((Byte)obj).m_value; }
명시적 변환인 경우 age2.Equals((byte)age1)의 결과는 다음과 같습니다. 이때는 사실일 것이다.
문자열 유형 간의 비교에 대해 이야기해 보겠습니다. 문자열은 "불변"이기 때문에 특별한 참조 유형입니다. 먼저 코드를 살펴보겠습니다.
string name1 = "Jack"; string name2 = "Jack"; object o1 = name1; object o2 = name2; Console.WriteLine("name1 == name2: {0}", name1 == name2); Console.WriteLine("name1 Equals name2: {0}", name1.Equals(name2)); Console.WriteLine("o1 == o2: {0}", o1 == o2); Console.WriteLine("o1 Equals o2: {0}", o1.Equals(o2)); Console.WriteLine("o1 == name2: {0}", o1 == name2); Console.WriteLine("o1 Equals name2: {0}", o1.Equals(name2)); Console.WriteLine("name1 ReferenceEquals name2: {0}", object.ReferenceEquals(name1, name2)); Console.WriteLine("o1 ReferenceEquals o2: {0}", object.ReferenceEquals(o1, o2)); Console.ReadLine();
위 코드 실행 결과:
이제 하나씩 설명하겠습니다. 하나씩. 어떤 사람들은 name1과 name2가 모두 "Jack"을 저장하므로 name1과 name2는 실제로 동일한 객체이므로 name1==name2와 name1.Equals(name2)의 비교 결과가 동일하다고 말할 것입니다. .NET Reflector 도구를 통해 문자열의 소스 코드를 보면 다음 코드 조각을 볼 수 있습니다.
연산자 ==는 실제로 Equals()를 반환합니다. 그래서 왜 name1==name2와 name1.Equals(name2)의 비교 결과가 같은지에 대한 설명은 "name1과 name2는 실제로는 같은 객체입니다"보다 이 설명이 더 직관적이라고 생각합니다.
우리는 문자열 유형의 특수성으로 인해 CLR이 문자열 객체를 통해 여러 개의 동일한 문자열 내용을 공유할 수 있다는 것을 알고 있습니다. 따라서 위의 name1과 name2는 동일한 위치를 가리키고 다음의 o1 == o2 , o1 == name2, object.ReferenceEquals(name1, name2)의 비교 결과는 모두 true이므로 이 명령문도 확인됩니다(실제로 object.ReferenceEquals(name1, o2)도 true입니다). 그런데 name1과 name2의 할당이 이렇게 된다면 어떻게 될까요?
string name1 = new string(new char[] { 'J', 'a', 'c', 'k' }); string name2 = new string(new char[] { 'J', 'a', 'c', 'k' });
실행 결과 보기:
name1==name2와 name1.Equals(name2)의 비교 결과는 이해하기 쉽습니다. , 위에서 언급한 대로 예, == 연산자는 실제로 Equals()(참조 유형의 경우 Equals()가 관리되는 힙에 저장된 내용을 비교함)를 반환하므로 두 결과는 동일합니다. 그러나 객체 객체 o1과 o2를 비교할 때 o1 == o2와 o1.Equals(o2)의 결과는 다릅니다. == 객체 객체는 유형 객체 포인터를 비교합니다. o1과 o2는 두 객체이며 해당 유형 객체 포인터는 서로 달라야 합니다. Equals()는 관리되는 힙에 저장된 o1과 o2의 내용을 비교하므로 o1.Equals(o2)는 다음과 같습니다. 진실. 이는 또한 다음 o1 == name2가 false이고 o1.Equals(name2)가 true임을 보여줍니다.
먼저 object.ReferenceEquals 내부의 코드를 살펴보겠습니다.
이제 object.ReferenceEquals(name1, name2) 및 object.ReferenceEquals(o1)에 대한 내용입니다. , o2 ) 결과는 모두 거짓입니다. 실제로는 두 개체 간의 == 문제입니다.
마지막으로 사용자 정의 참조 유형 비교에 대해 이야기하겠습니다.
class MyName { private string _id; public string Id { get { return _id; } set { _id = value; } } public MyName(string id) { this.Id = id; } }
위의 name1 및 name2 선언을 다음과 같이 변경합니다.
MyName name1 = new MyName("12"); MyName name2 = new MyName("12");
다른 사항은 변경되지 않고 그대로 유지되며 실행 결과는 다음과 같습니다.
name1과 name2는 완전히 다른 객체입니다. 비교 결과가 모두 거짓이라는 것을 이해하기 쉽습니다.
C#의 ==, Equals() 및 ReferenceEquals를 한 번에 이해하기 관련 기사 ()의 차이점은 PHP 중국어 홈페이지를 주목해주세요!

C#과 .NET의 관계는 분리 할 수 없지만 같은 것은 아닙니다. C#은 프로그래밍 언어이며 .NET은 개발 플랫폼입니다. C#은 코드를 작성하고 .NET의 중간 언어 (IL)로 컴파일하고 .NET 런타임 (CLR)에 의해 실행되는 데 사용됩니다.

C#.NET은 여러 응용 프로그램 개발을 지원하는 강력한 도구 및 라이브러리를 제공하기 때문에 여전히 중요합니다. 1) C#은 .NET 프레임 워크를 결합하여 개발 효율적이고 편리하게 만듭니다. 2) C#의 타입 안전 및 쓰레기 수집 메커니즘은 장점을 향상시킵니다. 3) .NET은 크로스 플랫폼 실행 환경과 풍부한 API를 제공하여 개발 유연성을 향상시킵니다.

C#.NETISVERSATILEFORBOTHWEBBANDDESKTOPDEVENTROMMENT.1) FORWEB, useASP.NETFORRICHINTERFACES.3) FORDESKTOP.3) USEXAMARINFORCROSS-PLATFORMDEEVENTRIMMENT, LINABILEDEV, MACODEDEV, and MACODEDOWS, 및 MACODEDOWS.

C# 및 .NET는 지속적인 업데이트 및 최적화를 통해 신흥 기술의 요구에 적응합니다. 1) C# 9.0 및 .NET5는 레코드 유형 및 성능 최적화를 소개합니다. 2) .NETCORE는 클라우드 네이티브 및 컨테이너화 된 지원을 향상시킵니다. 3) ASP.NETCORE는 최신 웹 기술과 통합됩니다. 4) ML.NET는 기계 학습 및 인공 지능을 지원합니다. 5) 비동기 프로그래밍 및 모범 사례는 성능을 향상시킵니다.

C#.netissuitable forenterprise-levelapplications는 richlibraries, androbustperformance, 그러나 itmaynotbeidealforcross-platformdevelopmentorwhenrawspeediscritical, wherelanguagesslikerustorthightordogrordogrognegrognegrognegrognecross-platformdevelopmentor.

.NET에서 C#의 프로그래밍 프로세스에는 다음 단계가 포함됩니다. 1) C# 코드 작성, 2) 중간 언어 (IL)로 컴파일하고 .NET 런타임 (CLR)에 의해 실행됩니다. .NET에서 C#의 장점은 현대적인 구문, 강력한 유형 시스템 및 .NET 프레임 워크와의 긴밀한 통합으로 데스크탑 응용 프로그램에서 웹 서비스에 이르기까지 다양한 개발 시나리오에 적합합니다.

C#은 Microsoft가 개발 한 최신 객체 지향 프로그래밍 언어이며 .NET 프레임 워크의 일부로 개발되었습니다. 1.C#은 캡슐화, 상속 및 다형성을 포함한 객체 지향 프로그래밍 (OOP)을 지원합니다. 2. C#의 비동기 프로그래밍은 응용 프로그램 응답 성을 향상시키기 위해 비동기 및 키워드를 기다리는 키워드를 통해 구현됩니다. 3. LINQ를 사용하여 데이터 컬렉션을 간결하게 처리하십시오. 4. 일반적인 오류에는 NULL 참조 예외 및 인덱스 외 예외가 포함됩니다. 디버깅 기술에는 디버거 사용 및 예외 처리가 포함됩니다. 5. 성능 최적화에는 StringBuilder 사용 및 불필요한 포장 및 Unboxing을 피하는 것이 포함됩니다.

C#.NET 애플리케이션에 대한 테스트 전략에는 단위 테스트, 통합 테스트 및 엔드 투 엔드 테스트가 포함됩니다. 1. 단위 테스트를 통해 MSTEST, NUNIT 또는 XUNIT 프레임 워크를 사용하여 코드의 최소 단위가 독립적으로 작동합니다. 2. 통합 테스트는 일반적으로 사용되는 시뮬레이션 된 데이터 및 외부 서비스를 결합한 여러 장치의 기능을 확인합니다. 3. 엔드 투 엔드 테스트는 사용자의 완전한 작동 프로세스를 시뮬레이션하며 셀레늄은 일반적으로 자동 테스트에 사용됩니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

WebStorm Mac 버전
유용한 JavaScript 개발 도구

안전한 시험 브라우저
안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

SublimeText3 영어 버전
권장 사항: Win 버전, 코드 프롬프트 지원!

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경
