'60k'사내 의 19 문 제 를 풀다.

9921 단어 c#면접 문제
먼저 제목 을 살 펴 보 자.
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  Maybemonad 를 실현 하고 LINQ 를 이용 하여 Nothing(빈 값)과 Just(값 있 음)에 대한 구 화 를 실현 합 니 다.
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와 함께 사용 해 야 합 니 다.한 함수 에서 여러 번(여러 개가 아 닌)되 돌아 갈 수 있 습 니 다.그 본질 은 async/await 와 마찬가지 로 상태 기 입 니 다.
yield 를 사용 하지 않 으 면 IEnumerable를 실현 해 야 합 니 다.GetEnumerator만 노출 되 어 yield 가 다시 들 어 갈 수 있 고 사람들의 습관 에 부합 하도록 확보 합 니 다.
C++/자바/ES6 와 같은 다른 언어 는 generator(생 성기)라 고 합 니 다.이것 은.NET 의 IEnumerator(IEnumerable가 아 닌)에 해당 합 니 다.이런 디자인 으로 인해 yield 는 다시 들 어 갈 수 없고 한 번 교체 하면 다시 교체 할 수 없 으 므 로 주의해 야 한다.
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/IEnumerable/IAsyncEnumerable등 상태 기 종 류 를 정의 해 야 합 니 다.stackful 은 필요 하지 않 기 때문에 이 부분 은 stackless 가 귀 찮 습 니 다.
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.Maybemonad 를 실현 하고 LINQ 를 이용 하여 Nothing(빈 값)과 Just(값 있 음)에 대한 구 화 를 실현 합 니 다.
본 문 제 는 비교적 이해 하기 어렵 습 니 다.큰 사람과 확인 한 결과 본질 은 다음 과 같은 효 과 를 실현 해 야 합 니 다.

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를 계승 하여 LINQ to Objects 의 기본 기능 을 실현 하지만 오 답 입 니 다.
정 답:

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로 가 는 것 이 아니 라 손 으로 훑 을 수 있 는 LINQ 표현 식―Select Many 로 표시 할 수 있 습 니 다.(이 점 에 대해 서 는 사실 매우 중요 하 다.나 는 잠시 후에 시간 이 있 으 면 이 점 에 대해 깊이 이야기 할 것 이다.)
총결산
이런 기술 들 은 평소에 비교적 인기 가 없 을 수도 있 고,모두 정확하게 대답 할 수 있다 는 것 도 그다지 유용 하 다 는 것 을 의미 하지 않 으 며,사용 할 기회 가 있 기 어 려 울 수도 있다.
그러나 ASP.NET Core 와 같은 초고 성능 네트워크 서버,미들웨어 나 Unity 3D 와 같은 고성능 게임 엔진 을 개발 하거나 고성능 실시 간 ETL 같은 것 을 만 들 면 이런 지식 에 의존 해 어깨 를 나란히 하거나 C/C++를 뛰 어 넘 는 성능 을 낼 수 있 고 C\#/.NET 편의 성 을 누 릴 수 있 는 제품 이다.
군 에 서 는 면접 에서 이런 문 제 를 내 는 회사 가 마음 이 너무 크 거나 적어도 60k 를 열 어야 한 다 는 우스갯소리 가 나 왔 기 때문에 본 고 는 60k 사내 라 고 이름 을 지 었 다.
저의 다음 편 기대 해 주세요.😂。
이상 은'60k'사내 의 19 문 제 를 푸 는 C\#면접 문제(상)의 상세 한 내용 입 니 다.C\#면접 문제 에 관 한 자 료 는 우리 의 다른 관련 글 을 주목 하 세 요!

좋은 웹페이지 즐겨찾기