Study/TIL(Today I Learned)

24.07.26 C#

에린_1 2024. 7. 26. 21:33
728x90

C#

AsEnumerable Method

  • LINQ 쿼리는 IEnumerable<T> 또는 IQueryable 인터페이스를 구현하는 데이터 원본에서 작동한다. DataTable 클래스는 이 인터페이스를 구현하지 않기 때문에 직접 LINQ 쿼리를 사용할 수 없다.
  • AsEnumerable 메서드를 사용하여 Datatable을 IEnumerable<T>로 변환할 수 있다. 변환된 객체는 원본 DataTable에 바인딩 된다. 따라서 AsEnumerable를 여러 번 호출해도 모두 같은 원본 DataTable에 바인딩된 독립적인 쿼리 가능한 객체를 반환한다.
  • DataTable을 LINQ 쿼리의 원본으로 사용하려면 AsEnumerable 메서드를 사용하여 IEnumerable<T>로 변환해야 한다. 이렇게 변환된 객체는 원본 DataTable에 바인딩되며, 여러번 변환해도 각각 독립적인 쿼리를 수행할 수 있다.

LINQ(Language Integrated Query)

  • C#과 같은 .NET 언어에서 데이터 소스에 대한 쿼리를 쉽게 작성하고 실행할 수 있도록 하는 기능이다. LINQ는 SQL 쿼리와 유사한 문법을 사용하여 컬렉션, XML, 데이터베이스, 객체, 그리고 기타 데이터 소스에 대해 쿼리를 작성할 수 있다.
  • LINQ의 쿼리 식과 메서드 체이닝 문법을 통해 데이터를 필터링, 투영, 정렬, 그룹화, 조인, 집계 등의 다양한 연산을 수행할 수 있다. LINQ를 통해 코드의 가독성을 높이고 복잡한 데이터 처리 로직을 간결하게 작성할 수 있다.

LINQ의 주요 구성 요소

  1. LINQ to Object
    • 메모리에 있는 객체 컬렉션(ex: 배열, 리스트)에 대해 쿼리를 수행할 수 있다.
  2. LINQ to SQL
    • SQL Server 데이터베이스에 대해 쿼리를 수행할 수 있다.
  3. LINQ to XML
    • XML 데이터에 대해 쿼리를 수행할 수 있다.
  4. LINQ TO Entities
    • Entity Framework를 사용하여 데이터베이스에 대해 쿼리를 수행할 수 있다.

기본 문법

  • LINQ 쿼리는 두 가지 문법 스타일을 지원한다.
  • 쿼리 식(Query Syntax)
    • SQL과 유사한 문법
  • 메서드 체이닝(Method Syntax)
    • 메서드 체이닝을 이용한 문법

Select, Where, OrderBy, List.Find(All)

  • Select, Where, OrderBy 메서드들은 IEnumerable 인터페이스에서 제공하고 있다. 이 말은 IEnumerable을 상속하고 있는 모든 클래스에서 사용할 수 있음을 뜻한다.
    • Find는 리스트이다.
    • System.Collections에 있는 데이터 묶음 클래스가 있다. List, ArrayList, Dictionary, Stack, Queue등 거의 모든 Collections에서 사용이 가능하다.
  • Func을 매개변수로 받을 수 있다.
    • 함수로 그때 필요한 값을 찾아올 수 있다.

where

  • 조건을 집어넣어 조건에 맞는 인스턴스 또는 값들을 가져온다.

Select

  • Where과 달리 조건에 맞는 인스턴스가 아닌 그 값 자체를 가져온다.

Find

  • 조건을 집어넣어 조건에 맞는 인스턴스 또는 값들을 가져온다.
  • FindAll을 사용할 시 Where과 기능은 완전히 유사하지만 FindAll의 경우 반환 타입은 List<item>, where의 경우 IEnumerable<Item>이 된다.

OrderBy, OrderByDescending

  • 매개변수로 넣은 멤버를 기준으로 값을 정렬한다.

참조

https://programming-mr.tistory.com/67

ConcurrentDictionary<TKey, TValue>

  • 여러 개의 스레드에서 동시에 액세스 할 수 있는 키/값 쌍의 스레드로부터 안전한 컬렉션이다.
  • 모든 작업은 원자성이며 클래스의 다른 모든 작업과 관련하여 스레드로부터 안전하다.
  • ConcurrentDictionary<TKey, TValue> 유일한 예외는 대리자, 및 GetOrAdd를 허용하는 메서드이다. AddOrUpdate 사전에 대한 수정 및 쓰기 작업의 경우는 ConcurrentDictionary<TKey, TValue> 세분화된 잠금을 사용하여 스레드 안전을 보장한다.(사전에 대한 읽기 작업은 잠금이 ㅇ벗는 방식으로 수행된다.) 그러나 이러한 메서드에 대한 대리자는 잠금에서 알 수 없는 코드를 실행하여 발생할 수 있는 문제를 방지하기 위해 잠금 외부에서 호출된다. 따라서 이러한 대리자가 실행하는 코드에는 작업의 원자성이 적용되지 않는다.

스레드 보안

  • ConcurrentDictionary<TKey, TValue> 모든 공용 및 보호된 멤버는 스레드로부터 안전하며 여러 스레드에서 동시에 사용할 수 있다. 그러나 확정 메서드를 포함하여 구현하는 인터페이스 ConcurrentDictionary<TKey, TValue> 중 하나를 통해 액세스하는 멤버는 스레드로부터 안전하게 보호되지 않으며 호출자가 동기화해야 할 수도 있다.

DebuggerNonUserCodeAttribute

  • 디버거가 코드의 특정 부분을 사용자 코드가 아닌 것으로 처리하도록 지정하는 데 사용된다.
  • 이 속성이 적용된 메서드, 속성 또는 클래스는 디버깅 세션에서 자동으로 무시된다.
  • 주로 코드 생성 도구가 생성한 코드나 라이브러리 코드를 디버깅할 때 사용자에게 불필요한 디버깅 정보가 노출되는 것을 방지하는 데 사용된다.

효과

  • 디버깅 세션 중에 이 메서드나 클래스에 대한 스택 추적이 생략된다.
  • 예외가 발생하더라도 디버거는 이 코드의 내부로 들어가지 않고 사용자 코드로 이동한다.
  • 디버거가 해당 코드의 중단점(breakpoint)을 무시한다.

GerneratedCodeAttribute

  • 코드가 도구에 의해 생성되었음을 나타내는 속성이다. 이 속성은 코드 분석 도구와 같은 도구가 생성된 코드와 수동으로 작성된 코드를 구분하는 데 도움이 된다. 이 속성은 코드 생성기, 예를 들어 코드 생성 도구나 프록시 생성 도구 등이 생성한 코드에 주로 사용된다.

속성 구성

  • Tool
    • 코드를 생성한 도구의 이름
  • Version
    • 코드 생성 도구의 버전

효과

  • 코드 분석 도구가 이 속성을 사용하여 경고 또는 오류를 무시할 수 있다.
  • 코드를 유지 보수하는 개발자가 이 코드가 자동으로 생성된 것임을 명확히 알 수 있다.

RepeatedField

  • Google Protocol Buffers(Protobuf)에서 사용되는 C# 클래스이다.
  • Protocol Buffers는 데이터를 직렬화하는 방법으로, Google에서 개발했으며, 특히 네트워크 통신 및 데이터 저장소에 효율적인 데이터 포맷을 제공한다.
  • RepeatedField는 프로토콜 버퍼 메시지 내에서 여러 값을 담을 수 있는 반복 필드를 나타낸다.

특징

  1. 반복 필드
    • 프로토콜 버퍼 메시지에서 반복 필드는 여러 개의 동일한 타입의 값을 담을 수 있는 필드이다.
  2. 제네릭 클래스
    • RepeatedField<T>는 제네릭 클래스이며, T는 저장될 값의 타입을 나타낸다.
  3. 자동으로 관리되는 컬렉션
    • 기본적으로 List와 유사하게 동작하며, 요소를 추가, 제거 및 접근할 수 있는 다양한 메서드를 제공한다.

GUID(Globally Unique Identifier)

  • 전 세계적으로 유일한 값을 생성하기 위한 표준으로, 주로 소프트웨어에서 고유한 식별자를 생성하는 데 사용된다.
  • Microsoft에서 처음 도입됐으며, 다른 시스템에서는 UUID(Universally Unique Identifier)로도 알려져 있다.
  • 128비트의 숫자이며, 일반적으로 32자리 16진수로 표현된다.

형식

  • 32자리 16진수로 표현되며, 하이픈(’-’)으로 구분된 5개의 그룹으로 나뉜다.
ex)
123e4567-e89b-12d3-a456-426614174000
  • 이 형식은 다음과 같이 구분된다.
    • 첫 번째 그룹 : 8자리
    • 두 번째 그룹 : 4자리
    • 세 번째 그룹 : 4자리
    • 네 번째 그룹 : 4자리
    • 다섯 번째 그룹 : 12자리

사용 예

  • 데이터베이스의 기본 키, 소프트웨어의 라이선스 키, 파일 및 리소스의 고유 식별자, 분산 시스템에서의 고유 식별자 등.

특성

  1. 고유성
    • 전 세계적으로 유일한 값으로 설계되어 중복될 가능성이 매우 낮습니다.
  2. 128비트 길이
    • 128비트 길이의 숫자로, 다양한 환경에서 고유 식별자로 사용될 수 있다.
  3. 무작위성
    • 무작위로 생성되며, 특정 패턴을 따르지 않는다.

Task.FromResult

  • C#에서 비동기 프로그래밍을 할 때 사용되는 유용한 메서드이다.
  • 이미 알고 있는 결과 값으로 완료된 TASK<TResult>를 생성한다.
  • 동기 작업을 비동기 메서드의 결과로 반환해야 할 때 유용하다.

특징

  • 이미 완료된 상태의 Task를 반환한다.
  • CPU 작업이나 I/O 작업을 기다리지 않는다.
  • 스레드 풀을 사용하지 않는다.

사용 예

  • 캐시된 결과를 반환할 때
  • 단위 테스트에서 모의 객체(mock)를 만들 때
  • 비동기 인터페이스를 구현하지만 실제로는 동기 작업을 수행할 때

성능

  • 새로운 Task 객체를 생성하는 것보다 효율적이다.
  • 이미 알고 있는 값으로 Task를 생성할 때 최적화된 방법이다.
728x90

'Study > TIL(Today I Learned)' 카테고리의 다른 글

24.07.30 C#, 배치 파일과 도스 명령어, 게임 서버  (1) 2024.07.30
24.07.29 C#, 게임 서버  (0) 2024.07.29
24.07.25 C#  (0) 2024.07.25
24.07.24 C#  (1) 2024.07.24
24.07.23 RedMine  (0) 2024.07.23