'60k'사내 의 19 문 제 를 풀다.
1 async 함수 의 컴 파일 방식 을 약술 하 십시오.
2 Task 상태 기기 의 실현 과 작업 체 제 를 약술 하 십시오.
3 await 의 역할 과 원 리 를 약술 하고 GetResult()와 어떤 차이 가 있 는 지 설명 하 십시오.
4 Task 와 Thread 는 차이 가 있 나 요?하면,만약,만약...
5 yield 의 역할 을 약술 하 다.
6 IEnumerable
7 stackless coroutine 과 stackful coroutine 의 차 이 를 약술 하고 C\#의 coroutine 이 어떤 것 인지 지적 합 니 다.
8 selectmany 의 역할 을 약술 하 세 요.
9 하나의 함수 Compose 를 실현 하여 여러 함 수 를 복합 하 는 데 사용 하 십시오.
10 Maybe
11 LINQ 의 lazy computation 메커니즘 을 약술 하 다
12 Select Many 를 이용 하여 두 배열 의 요소 의 두 가 지 를 실현 합 니 다.
13 3 원 함수 에 코 리 화 를 실현 하 세 요.
14 ref struct 의 역할 을 약술 하 십시오.
15 ref return 의 사용 방법 을 약술 하 십시오.
16 foreach 와 ref 를 이용 하여 하나의 배열 의 모든 요소 에 1 을 추가 하 십시오.
17 ref,out,in 이 함수 매개 변수 수정자 로 사용 할 때의 차 이 를 약술 하 십시오.
18 비 sealed 류 의 IDisposable 실현 방법 을 약술 하 십시오.
19 delegate 와 이벤트 의 본질은 무엇 입 니까?그들의 실현 메커니즘 을 약술 해 주 십시오
맞습니다.이것 은[광저우.NET 기술 클럽]위 챗 군 에서 온 Programming Languages(프로 그래 밍 언어 개발 과학)의 큰 사람 입 니 다.본 고 는 제 가 감히 이 문제 들 에 대답 하 겠 습 니 다.😂。
이 문제 들 은(나 에 게)비교적 어렵 기 때문에,나 는 이번에 감히 앞의 10 문제 만 대답 하고,전편 이 발작 하 였 으 며,나머지 절반 의 문 제 는 내 가 천천히 자 료 를 찾 아 보고,별도로 대답 할 때 까지 기 다 렸 다.😂。
1.async 함수 의 컴 파일 방식 을 약술 하 십시오.
async/await 는 C\#5.0 에서 내 놓 은 비동기 코드 프로 그래 밍 모델 로 그 본질은 상태 기 로 컴 파일 된 것 이다.함수 앞 에 async 를 끼 우 면 함 수 를 상태 기 로 변환 합 니 다.
2.Task 상태 기기 의 실현 과 작업 체 제 를 약술 하 십시오.
CPS 는 모두 Continuation Passing Style 이 라 고 하 는데.NET 에 서 는 자동 으로 다음 과 같이 컴 파일 됩 니 다.
(1)모든 인 용 된 부분 변 수 를 패키지 로 만 들 고 숨겨 진 상태 기기 의 클래스 에 넣 습 니 다.
(2)모든 await 를 하나의 상태 번호 로 펼 치고 몇 개의 await 만 있 으 면 몇 개의 상태 번호 가 있 습 니 다.
(3)한 상 태 를 실행 할 때마다 상태 반전 기의 MoveNext 방법 을 반복 하고 다음 상태 번 호 를 지정 합 니 다.
(4)MoveNext 방법 은 스 레 드 와 이상 등 문 제 를 처리 해 야 한다.
3.await 의 역할 과 원 리 를 약술 하고 GetResult()와 어떤 차이 가 있 는 지 설명 하 십시오.
상태 기의 측면 에서 볼 때 await 의 본질은 Task.GetAwaiter()의 UnsafeOnComplete(Action)를 호출 하고 다음 상태 번 호 를 지정 하 는 것 이다.
다 중 스 레 드 의 측면 에서 볼 때 await 의 Task 가 새로운 스 레 드 에서 실행 되 어야 한다 면 이 상태 기기 의 MoveNext()방법 은 즉시 돌아 갑 니 다.이때 메 인 스 레 드 가 풀 려 난 다음 UnsafeOnComplete 가 지정 한 스 레 드 컨 텍스트 에서 MoveNext()와 다음 상태의 코드 를 계속 합 니 다.
이에 비해 GetResult()는 현재 스 레 드 에서 Task 의 완성 을 즉시 기다 리 는 것 입 니 다.Task 가 완성 되 기 전에 현재 스 레 드 는 방출 되 지 않 습 니 다.
메모:Task 가 반드시 새로운 스 레 드 에서 실행 되 는 것 은 아 닐 수도 있 습 니 다.이 때 GetResult()나 await 를 사용 하면 상태 기 를 만 들 수 있 는 지 없 는 지 의 차이 만 있 습 니 다.
4.Task 와 Thread 는 차이 가 있 나 요?하면,만약,만약...
Task 와 Thread 는 다 중 스 레 드 방식 으로 코드 를 실행 할 수 있 지만 큰 차이 가 있 습 니 다.
Task 는.NET 4.5 에 발표 되 었 습 니 다.새로운 async/await 코드 모델 과 결합 하여 코드 를 쓸 수 있 습 니 다.새로운 스 레 드 를 만 들 수 있 을 뿐만 아니 라 스 레 드 풀(기본 값),단일 스 레 드 등 방식 으로 프로 그래 밍 할 수 있 습 니 다.UI 프로 그래 밍 분야 에서 Task 는 UI 스 레 드 컨 텍스트 로 자동 으로 돌아 갈 수 있 고 여러 개의 Task 를 관리 할 수 있 는 편리 한 API 도 제공 합 니 다.표 로 요약 하면 다음 과 같 습 니 다.
구별
Task
Thread
.net 버 전
4.5
1.1
async/await
지지 하 다.
지지 하지 않 음
새 스 레 드 만 들 기
지지 하 다.
지지 하 다.
스 레 드 탱크/단일 스 레 드
지지 하 다.
지지 하지 않 음
주 루틴 되 돌리 기
지지 하 다.
지지 하지 않 음
관리 API
지지 하 다.
지지 하지 않 음
TL;DR 은...Task 로 하면 돼 요.
5.yield 의 역할 을 약술 한다.
yield 는 IEnumerable
yield 를 사용 하지 않 으 면 IEnumerable
C++/자바/ES6 와 같은 다른 언어 는 generator(생 성기)라 고 합 니 다.이것 은.NET 의 IEnumerator
6.IEnumerable
IEnumerable<int> GenerateFibonacci(int n)
{
int current = 1, next = 1;
for (int i = 0; i < n; ++i)
{
yield return current;
next = current + (current = next);
}
}
7.stackless coroutine 과 stackful coroutine 의 차 이 를 약술 하고 C\#의 coroutine 이 어떤 것 인지 지적 합 니 다.stackless 와 stackful 은 협 정 중 스 택 의 메모리 에 대응 합 니 다.stackless 는 스 택 메모리 위치 가 고정 되 지 않 음 을 나타 내 고 stackful 은 고정 적 인 스 택 메모 리 를 분배 해 야 합 니 다.
계속 실행(Continuation/MoveNext()할 때 stackless 는 컴 파일 러 가 코드 를 생 성 해 야 합 니 다.예 를 들 어 패 키 지 를 닫 으 면 계속 실행 논 리 를 정의 합 니 다.stackful 은 원 스 택 의 위치 에서 직접 실 행 됩 니 다.
성능 에 있어 서 stackful 의 중단 반환 은 CPU 의 도약 위 치 를 제어 하 는 데 의존 하여 이 루어 져 야 합 니 다.소 작업 에 속 하고 CPU 의 분기 예측 에 약간 영향 을 주어 성능 에 영향 을 줄 수 있 습 니 다(그러나 영향 은 크 지 않 습 니 다).이 부분 은 stackless 에 영향 을 주지 않 습 니 다.
메모리 에 있어 서 stackful 은 고정 크기 의 스 택 메모리(예 를 들 어 4kb)를 할당 해 야 합 니 다.stackless 는 상태 번호 변 수 를 가 진 상태 기 를 만 들 고 stackful 이 사용 하 는 메모리 가 더 큽 니 다.
소 작업 에 있어 서 stackful 은 완전히 일치 하 는 재 귀/이상 처리 등 을 쉽게 실현 할 수 있 고 아무런 영향 이 없 지만 stackless 는 컴 파일 러 작가 의 뛰어난 기술 이 있어 야 실현 할 수 있 습 니 다(예 를 들 어 C\#의 작가).최초의 C\#5.0 은 try-catch 블록 에 await 를 쓸 수 없습니다.
기 존 구성 요소 와 결합/프레임 워 크 의존 에 있어 stackless 는 Task
Go 는 stackful 에 속 하기 때문에 모든 goroutine 은 고정 크기 의 메모 리 를 할당 해 야 합 니 다.
C\#stackless 에 속 합 니 다.패 킷 과 상태 기 를 만 들 것 입 니 다.컴 파일 러 생 성 코드 를 사용 하여 계속 실행 논 리 를 지정 해 야 합 니 다.
총 결 은 다음 과 같다.
기능.
stackless
stackful
메모리 위치
고정 되 지 않 음
고정했어
계속 실행 하 다
컴 파일 러 정의
CPU 점프
성능/속도
빠르다.
빠르다
메모리 사용량
낮다
고정 크기 의 스 택 메모리 가 필요 합 니 다.
컴 파일 러 난이도
어렵다.
알맞다
구성 요소 의존
거북 하 다
편리 하 다.
끼 워 넣다
지지 하지 않 음
지지 하 다.
예 를 들다
C#/js
Go/C++ Boost
8.selectmany 의 역할 을 약술 하 세 요.
js 의 배열 에 해당 하 는 flatMap 은 배열 의 모든 데 이 터 를 0 에서 여러 개의 데이터 로 바 꾸 는 것 을 의미한다.
selectmany 를 선택 하면 필터/.Where 를 실현 할 수 있 습 니 다.방법 은 다음 과 같 습 니 다.
public static IEnumerable<T> MyWhere<T>(this IEnumerable<T> seq, Func<T, bool> predicate)
{
return seq.SelectMany(x => predicate(x) ?
new[] { x } :
Enumerable.Empty<T>());
}
selectmany 는 LINQ 에서 from 키워드 의 구성 부분 이라는 점 을 10 번 에 시연 한다.9.하나의 함수 Compose 를 실현 하여 여러 함 수 를 복합 하 는 데 사용 하 십시오.
public static Func<T1, T3> Compose<T1, T2, T3>(this Func<T1, T2> f1, Func<T2, T3> f2)
{
return x => f2(f1(x));
}
그리고 사용 방법:
Func<int, double> log2 = x => Math.Log2(x);
Func<double, string> toString = x => x.ToString();
var log2ToString = log2.Compose(toString);
Console.WriteLine(log2ToString(16)); // 4
10.Maybe본 문 제 는 비교적 이해 하기 어렵 습 니 다.큰 사람과 확인 한 결과 본질 은 다음 과 같은 효 과 를 실현 해 야 합 니 다.
void Main()
{
Maybe<int> a = Maybe.Just(5);
Maybe<int> b = Maybe.Nothing<int>();
Maybe<int> c = Maybe.Just(10);
(from a0 in a from b0 in b select a0 + b0).Dump(); // Nothing
(from a0 in a from c0 in c select a0 + c0).Dump(); // Just 15
}
내 원숭이 가 진화 한 두뇌 의 이해 에 따 르 면 자 연 스 럽 게 다음 과 같은 코드 를 쓸 수 있 을 것 이다.
public class Maybe<T> : IEnumerable<T>
{
public bool HasValue { get; set; }
public T Value { get; set;}
IEnumerable<T> ToValue()
{
if (HasValue) yield return Value;
}
public IEnumerator<T> GetEnumerator()
{
return ToValue().GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return ToValue().GetEnumerator();
}
}
public class Maybe
{
public static Maybe<T> Just<T>(T value)
{
return new Maybe<T> { Value = value, HasValue = true};
}
public static Maybe<T> Nothing<T>()
{
return new Maybe<T>();
}
}
자 연 스 럽 게 IEnumerable정 답:
public struct Maybe<T>
{
public readonly bool HasValue;
public readonly T Value;
public Maybe(bool hasValue, T value)
{
HasValue = hasValue;
Value = value;
}
public Maybe<B> SelectMany<TCollection, B>(Func<T, Maybe<TCollection>> collectionSelector, Func<T, TCollection, B> f)
{
if (!HasValue) return Maybe.Nothing<B>();
Maybe<TCollection> collection = collectionSelector(Value);
if (!collection.HasValue) return Maybe.Nothing<B>();
return Maybe.Just(f(Value, collection.Value));
}
public override string ToString() => HasValue ? $"Just {Value}" : "Nothing";
}
public class Maybe
{
public static Maybe<T> Just<T>(T value)
{
return new Maybe<T>(true, value);
}
public static Maybe<T> Nothing<T>()
{
return new Maybe<T>();
}
}
주의:우선 이것 은 함수 식 프로 그래 밍 의 응용 장면 으로 struct―값 유형 을 사용 해 야 한다.
그 다음으로 모든 LINQ 가 IEnumerable
총결산
이런 기술 들 은 평소에 비교적 인기 가 없 을 수도 있 고,모두 정확하게 대답 할 수 있다 는 것 도 그다지 유용 하 다 는 것 을 의미 하지 않 으 며,사용 할 기회 가 있 기 어 려 울 수도 있다.
그러나 ASP.NET Core 와 같은 초고 성능 네트워크 서버,미들웨어 나 Unity 3D 와 같은 고성능 게임 엔진 을 개발 하거나 고성능 실시 간 ETL 같은 것 을 만 들 면 이런 지식 에 의존 해 어깨 를 나란히 하거나 C/C++를 뛰 어 넘 는 성능 을 낼 수 있 고 C\#/.NET 편의 성 을 누 릴 수 있 는 제품 이다.
군 에 서 는 면접 에서 이런 문 제 를 내 는 회사 가 마음 이 너무 크 거나 적어도 60k 를 열 어야 한 다 는 우스갯소리 가 나 왔 기 때문에 본 고 는 60k 사내 라 고 이름 을 지 었 다.
저의 다음 편 기대 해 주세요.😂。
이상 은'60k'사내 의 19 문 제 를 푸 는 C\#면접 문제(상)의 상세 한 내용 입 니 다.C\#면접 문제 에 관 한 자 료 는 우리 의 다른 관련 글 을 주목 하 세 요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.