취미 프로그래밍: 이벤트를 대상으로 삼기(답안 참조)
방법1: 추가 삭제의 실현을 직접 제공합니다
앞의 글에서 몇몇 친구들은 가장 간단한 방법을 제시했다. 즉,AddHandler와RemoveHandler의 실현을 직접 제공하는 것이다. 예를 들어:public class DelegateEvent
{
private Action m_addHandler;
private Action m_removeHandler;
public DelegateEvent(Action add, Action remove)
{
this.CheckDelegateType();
if (add == null) throw new ArgumentNullException("add");
if (remove == null) throw new ArgumentNullException("remove");
this.m_addHandler = add;
this.m_removeHandler = remove;
}
private void CheckDelegateType()
{
if (!typeof(Delegate).IsAssignableFrom(typeof(TDelegate)))
{
throw new ArgumentException("TDelegate must be an Delegate type.");
}
}
public DelegateEvent AddHandler(TDelegate handler)
{
this.m_addHandler(handler);
return this;
}
public DelegateEvent RemoveHandler(TDelegate handler)
{
this.RemoveHandler(handler);
return this;
}
}
사용자는 AddHandler와 RemoveHandler 방법에 각각 사용되는 두 가지 의뢰를 직접 제공할 수 있다.구조 함수에서 우리는 매개 변수의 비null 판단을 진행하는 것 외에 위탁 유형의 검사도 진행한다.C#은 일반 구속에 대한 아쉬움이 많습니다. 예를 들어 일반 매개변수를 Delegate 유형의 하위 클래스로 구속할 수 없습니다.따라서 CheckDelegateType을 사용하여 유형이 호환되는지 확인합니다.
그래서 우리는 이렇게 코드를 작성할 수 있다.var myClass = new MyClass();
var de = new DelegateEvent<EventHandler>(
h => myClass.MyEvent += h,
h => myClass.MyEvent -= h);
이 방법의 결점도 비교적 뚜렷하다.그것은 바로dd와remove 두 의뢰의 실현이 정확한지 제한할 수 없으며, 즉각 프로그래머가 일부 오류를 제공해도 성실하게 실행할 수밖에 없다는 것이다.예를 들어, 우리가dd작업에서도 +=를 사용했거나,remove작업에서 다른 이벤트를 삭제했을 수도 있습니다.그리고 이런 문제는 발견하기 어렵다.이 밖에 이런 방법은 약간의 코드도 비교적 많이 필요하다.우수한 API 디자인은 개발자들이 쉽게 사용할 수 있고 불필요한 번거로움을 최대한 피해야 한다. 적어도 가능한 한 빨리 오류를 보고해야 한다.
방법2: 실례+사건명
객체 인스턴스를 제공하고 이벤트 이름을 추가하거나 Delegate Event 객체를 구성할 수 있습니다.public DelegateEvent(object obj, string eventName)
{
this.CheckDelegateType();
if (obj == null) throw new ArgumentNullException("obj");
if (String.IsNullOrEmpty(eventName)) throw new ArgumentNullException("eventName");
this.BindEvent(obj.GetType(), obj, eventName);
}
private void BindEvent(Type type, object obj, string eventName)
{
var eventInfo = type.GetEvent(eventName,
BindingFlags.Public | BindingFlags.NonPublic |
(obj == null ? BindingFlags.Static : BindingFlags.Instance));
if (eventInfo == null)
{
throw new ArgumentException(
String.Format("Event {0} is missing in {1}",
eventName, type.FullName));
}
if (eventInfo.EventHandlerType != typeof(TDelegate))
{
throw new ArgumentException(
String.Format("Type of event {0} in {1} is mismatched with {2}.",
eventName, type.FullName, typeof(TDelegate).FullName));
}
this.m_addHandler = h => eventInfo.AddEventHandler(obj, (Delegate)(object)h);
this.m_removeHandler = h => eventInfo.RemoveEventHandler(obj, (Delegate)(object)h);
}
대상과 이벤트 이름을 얻은 후, 당연히 해야 할 일은 파라미터가 비어 있는지, TDelegate 형식이 의뢰인지 확인하는 것입니다. 그 다음은BindEvent 방법으로 m 를 귀속시키는 것입니다.addHandler 및 mremoveHandler 두 의뢰.BindEvent 방법에서는 이벤트를 반사적으로 가져오는 이벤트 인포 대상을 주로 사용한다.이벤트 인포에 대한 검사는 주로 두 가지 측면에 나타난다. 하나는 이 사건이 존재하는지, 다른 하나는 이 사건의 의뢰 유형이 TDelegate와 같은지이다.m_addHandler 및 mremoveHandler 의뢰의 구조는 매우 간단하지만, 컴파일러가 부정확한 유형의 TDelegate를 Delegate로 전환하는 것을 허용하지 않기 때문에, 우리는 이를 Object로 전환한 다음Delegate로 전환하여 이벤트 인포에 추가해야 한다.
이 구조 함수는 다음과 같이 사용됩니다.var myClass = new MyClass();
var de = new DelegateEvent<EventHandler>(myClass, "MyEvent");
이 방법의 단점은 이벤트가 문자열로 표시되는 데 있다. 이것은 오류가 실행될 때만 바뀔 수 있다는 것을 의미한다.또한 My 이벤트의 이름을 재구성해서 수정하려면 편집기에서 문자열을 수정할 수 없습니다.따라서 우리는'강한 유형'을 강조해 왔다. 중요한 목적은 정적 검사와 재구성 지원을 얻는 것이다.
이 방법으로는 정적 사건을 정하는 데 도움이 되지 않는다.그래서 우리는 더 노력해야 한다.
방법3: 유형+이벤트명
정적 사건이라면 대상의 사건이 아니라 유형의 사건으로 귀속된다.따라서 세 번째 방법은 유형을 나타내는 대상과 이벤트 이름을 제공하는 것이다.public DelegateEvent(Type type, string eventName)
{
this.CheckDelegateType();
if (type == null) throw new ArgumentNullException("type");
if (String.IsNullOrEmpty(eventName)) throw new ArgumentNullException("eventName");
this.BindEvent(type, null, eventName);
}
그래, 이렇게 간단해.이미 많은 논리가 BindEvent 메서드에 포함되어 있습니다.사용 방법은 다음과 같습니다.var de = new DelegateEvent<EventHandler>(typeof(MyClass), "MyStaticEvent");
이곳의 단점은 이전과 마찬가지로 정적 검사와 재구성 지원을 받을 수 없다.이것은 어쩔 수 없는 것 같다. 설령 Reactive Framework에서 마이크로소프트 친구들도 이벤트를 연결하기 위해 문자열을 사용한다.
방법4: 표현식 트리를 사용하여 이벤트 지정
이것이 바로 문장이 처음에 언급한 '개자식 같다' 는 방법이다.그는 비록 매우 큰 제한이 있지만 결코 옳은 곳이 하나도 없는 것은 아니다.따라서 그것도 하나의 방법으로 간주하자.public DelegateEvent(Expression<Func> eventExpr)
{
this.CheckDelegateType();
// () => obj.EventName
if (eventExpr == null) throw new ArgumentNullException("eventExpr");
// obj.EventName
var memberExpr = eventExpr.Body as MemberExpression;
if (memberExpr == null)
{
throw new ArgumentNullException("eventExpr", "Not an event.");
}
object instance = null;
// obj
if (memberExpr.Expression != null)
{
try
{
// () => obj
var instanceExpr = Expression.Lambda<Func<object>>(memberExpr.Expression);
instance = instanceExpr.Compile().Invoke();
}
catch (Exception ex)
{
throw new ArgumentNullException("eventExpr is not an event", ex);
}
}
this.BindEvent(memberExpr.Member.DeclaringType, instance, memberExpr.Member.Name);
}
몇 차례의 표현식 트리의 조립과 해석을 거쳤는데, 당신은 아직도 이것이 접촉하기 어려운 화제라고 생각하십니까?주석에서 알 수 있듯이, 사실 그것의 매 단계의 조작은 매우 명확하고, 표현식의 정보를 편리하고 조리 있게 추출할 수 있다.C# 컴파일러의 유형 추정 기능과 함께 Delegate Event 객체를 구성하는 데 도움이 되는 방법을 추가할 수도 있습니다.public static class EventFactory
{
public static DelegateEvent Create(Expression<Func> eventExpr)
{
return new DelegateEvent(eventExpr);
}
}
그래서 우리는 이렇게 사용할 수 있다.class Program
{
public event EventHandler MyEvent;
public static event EventHandler MyStaticEvent;
static void Main(string[] args)
{
var sde = EventFactory.Create(() => MyStaticEvent);
var p = new Program();
var de = EventFactory.Create(() => p.MyEvent);
}
}
이 방법의 장점은 프로그래밍이 쉽고 정적 검사와 재구성 등'복리'를 누릴 수 있다는 것이다.그러나 그 제한도 논의되었다. 그것이 바로 '이벤트를 정의하는 클래스에만 사용할 수 있다.위의 코드가 Program의 Main 방법에서 벗어나면 컴파일되지 않는다는 것이다.따라서 이 방법은 이벤트를 정의하는 클래스가 직접 Delegate 이벤트의 대상을 노출하는 장면에만 적용된다.만약 당신이 이 장면 아래에 있다면, 그것은 거의 당신의 가장 좋은 선택입니다.
총결산
이것이 바로 나의 참고 답안이다. 어렵지 않지만, 단번에 이룰 수 있는 것은 아닌 것 같다.이것도 내가'취미 프로그래밍'을 하는 목적이다. 나는 모든 문제의 해결 방안을 작은 범위에 집중하여 각각의 편리함을 발굴할 수 있기를 바란다. 설령 그것이 모두 간단하더라도.예를 들어 당신은 첫 번째 방법을 쉽게 생각할 수 있지만 다른 사용 장면에 적합한 구조 방식도 준비했습니까?만약 당신이 각종 구조 방식을 짰다면, 이상 상황을 모두 판단했습니까?만약 이상 상황을 판단했다면, 개발을 간소화하기 위해 보조적인 API를 제공했습니까? (예: 위의 EventFactory)
이것들은 희자가 몇 가지나 쓰는가의 문제가 아니라 한 사람이 주도면밀하게 고려하는지 고찰하는 것이다.내가 관찰한 바에 의하면'희자는 몇 가지 문법이 있다'는 말은 많은 경우에 이미 몇몇 친구들이 자신을 위해 주도면밀하게 생각하지 않거나 깊이 이해하지 못하고 벗어나는 이유가 되었다.안타깝게도 어떤 방법에는 몇 가지 이상이 있다. 크로스 페이지에서 데이터를 전달하는 몇 가지 방법을 열거하고 C#의 구성원들이 어떤 수식부호를 가지고 있는지 등은 모두 몇몇 유명 대기업에서 지원자를 고찰하는 제목이다.
됐어, 분명히 말해 봐. 마이크로소프트야. 게다가 내가 직접 만난 면접문제야.
텍스트 모든 코드:http://gist.github.com/188304
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
public class DelegateEvent
{
private Action m_addHandler;
private Action m_removeHandler;
public DelegateEvent(Action add, Action remove)
{
this.CheckDelegateType();
if (add == null) throw new ArgumentNullException("add");
if (remove == null) throw new ArgumentNullException("remove");
this.m_addHandler = add;
this.m_removeHandler = remove;
}
private void CheckDelegateType()
{
if (!typeof(Delegate).IsAssignableFrom(typeof(TDelegate)))
{
throw new ArgumentException("TDelegate must be an Delegate type.");
}
}
public DelegateEvent AddHandler(TDelegate handler)
{
this.m_addHandler(handler);
return this;
}
public DelegateEvent RemoveHandler(TDelegate handler)
{
this.RemoveHandler(handler);
return this;
}
}
var myClass = new MyClass();
var de = new DelegateEvent<EventHandler>(
h => myClass.MyEvent += h,
h => myClass.MyEvent -= h);
객체 인스턴스를 제공하고 이벤트 이름을 추가하거나 Delegate Event 객체를 구성할 수 있습니다.
public DelegateEvent(object obj, string eventName)
{
this.CheckDelegateType();
if (obj == null) throw new ArgumentNullException("obj");
if (String.IsNullOrEmpty(eventName)) throw new ArgumentNullException("eventName");
this.BindEvent(obj.GetType(), obj, eventName);
}
private void BindEvent(Type type, object obj, string eventName)
{
var eventInfo = type.GetEvent(eventName,
BindingFlags.Public | BindingFlags.NonPublic |
(obj == null ? BindingFlags.Static : BindingFlags.Instance));
if (eventInfo == null)
{
throw new ArgumentException(
String.Format("Event {0} is missing in {1}",
eventName, type.FullName));
}
if (eventInfo.EventHandlerType != typeof(TDelegate))
{
throw new ArgumentException(
String.Format("Type of event {0} in {1} is mismatched with {2}.",
eventName, type.FullName, typeof(TDelegate).FullName));
}
this.m_addHandler = h => eventInfo.AddEventHandler(obj, (Delegate)(object)h);
this.m_removeHandler = h => eventInfo.RemoveEventHandler(obj, (Delegate)(object)h);
}
대상과 이벤트 이름을 얻은 후, 당연히 해야 할 일은 파라미터가 비어 있는지, TDelegate 형식이 의뢰인지 확인하는 것입니다. 그 다음은BindEvent 방법으로 m 를 귀속시키는 것입니다.addHandler 및 mremoveHandler 두 의뢰.BindEvent 방법에서는 이벤트를 반사적으로 가져오는 이벤트 인포 대상을 주로 사용한다.이벤트 인포에 대한 검사는 주로 두 가지 측면에 나타난다. 하나는 이 사건이 존재하는지, 다른 하나는 이 사건의 의뢰 유형이 TDelegate와 같은지이다.m_addHandler 및 mremoveHandler 의뢰의 구조는 매우 간단하지만, 컴파일러가 부정확한 유형의 TDelegate를 Delegate로 전환하는 것을 허용하지 않기 때문에, 우리는 이를 Object로 전환한 다음Delegate로 전환하여 이벤트 인포에 추가해야 한다.
이 구조 함수는 다음과 같이 사용됩니다.
var myClass = new MyClass();
var de = new DelegateEvent<EventHandler>(myClass, "MyEvent");
이 방법의 단점은 이벤트가 문자열로 표시되는 데 있다. 이것은 오류가 실행될 때만 바뀔 수 있다는 것을 의미한다.또한 My 이벤트의 이름을 재구성해서 수정하려면 편집기에서 문자열을 수정할 수 없습니다.따라서 우리는'강한 유형'을 강조해 왔다. 중요한 목적은 정적 검사와 재구성 지원을 얻는 것이다.
이 방법으로는 정적 사건을 정하는 데 도움이 되지 않는다.그래서 우리는 더 노력해야 한다.
방법3: 유형+이벤트명
정적 사건이라면 대상의 사건이 아니라 유형의 사건으로 귀속된다.따라서 세 번째 방법은 유형을 나타내는 대상과 이벤트 이름을 제공하는 것이다.public DelegateEvent(Type type, string eventName)
{
this.CheckDelegateType();
if (type == null) throw new ArgumentNullException("type");
if (String.IsNullOrEmpty(eventName)) throw new ArgumentNullException("eventName");
this.BindEvent(type, null, eventName);
}
그래, 이렇게 간단해.이미 많은 논리가 BindEvent 메서드에 포함되어 있습니다.사용 방법은 다음과 같습니다.var de = new DelegateEvent<EventHandler>(typeof(MyClass), "MyStaticEvent");
이곳의 단점은 이전과 마찬가지로 정적 검사와 재구성 지원을 받을 수 없다.이것은 어쩔 수 없는 것 같다. 설령 Reactive Framework에서 마이크로소프트 친구들도 이벤트를 연결하기 위해 문자열을 사용한다.
방법4: 표현식 트리를 사용하여 이벤트 지정
이것이 바로 문장이 처음에 언급한 '개자식 같다' 는 방법이다.그는 비록 매우 큰 제한이 있지만 결코 옳은 곳이 하나도 없는 것은 아니다.따라서 그것도 하나의 방법으로 간주하자.public DelegateEvent(Expression<Func> eventExpr)
{
this.CheckDelegateType();
// () => obj.EventName
if (eventExpr == null) throw new ArgumentNullException("eventExpr");
// obj.EventName
var memberExpr = eventExpr.Body as MemberExpression;
if (memberExpr == null)
{
throw new ArgumentNullException("eventExpr", "Not an event.");
}
object instance = null;
// obj
if (memberExpr.Expression != null)
{
try
{
// () => obj
var instanceExpr = Expression.Lambda<Func<object>>(memberExpr.Expression);
instance = instanceExpr.Compile().Invoke();
}
catch (Exception ex)
{
throw new ArgumentNullException("eventExpr is not an event", ex);
}
}
this.BindEvent(memberExpr.Member.DeclaringType, instance, memberExpr.Member.Name);
}
몇 차례의 표현식 트리의 조립과 해석을 거쳤는데, 당신은 아직도 이것이 접촉하기 어려운 화제라고 생각하십니까?주석에서 알 수 있듯이, 사실 그것의 매 단계의 조작은 매우 명확하고, 표현식의 정보를 편리하고 조리 있게 추출할 수 있다.C# 컴파일러의 유형 추정 기능과 함께 Delegate Event 객체를 구성하는 데 도움이 되는 방법을 추가할 수도 있습니다.public static class EventFactory
{
public static DelegateEvent Create(Expression<Func> eventExpr)
{
return new DelegateEvent(eventExpr);
}
}
그래서 우리는 이렇게 사용할 수 있다.class Program
{
public event EventHandler MyEvent;
public static event EventHandler MyStaticEvent;
static void Main(string[] args)
{
var sde = EventFactory.Create(() => MyStaticEvent);
var p = new Program();
var de = EventFactory.Create(() => p.MyEvent);
}
}
이 방법의 장점은 프로그래밍이 쉽고 정적 검사와 재구성 등'복리'를 누릴 수 있다는 것이다.그러나 그 제한도 논의되었다. 그것이 바로 '이벤트를 정의하는 클래스에만 사용할 수 있다.위의 코드가 Program의 Main 방법에서 벗어나면 컴파일되지 않는다는 것이다.따라서 이 방법은 이벤트를 정의하는 클래스가 직접 Delegate 이벤트의 대상을 노출하는 장면에만 적용된다.만약 당신이 이 장면 아래에 있다면, 그것은 거의 당신의 가장 좋은 선택입니다.
총결산
이것이 바로 나의 참고 답안이다. 어렵지 않지만, 단번에 이룰 수 있는 것은 아닌 것 같다.이것도 내가'취미 프로그래밍'을 하는 목적이다. 나는 모든 문제의 해결 방안을 작은 범위에 집중하여 각각의 편리함을 발굴할 수 있기를 바란다. 설령 그것이 모두 간단하더라도.예를 들어 당신은 첫 번째 방법을 쉽게 생각할 수 있지만 다른 사용 장면에 적합한 구조 방식도 준비했습니까?만약 당신이 각종 구조 방식을 짰다면, 이상 상황을 모두 판단했습니까?만약 이상 상황을 판단했다면, 개발을 간소화하기 위해 보조적인 API를 제공했습니까? (예: 위의 EventFactory)
이것들은 희자가 몇 가지나 쓰는가의 문제가 아니라 한 사람이 주도면밀하게 고려하는지 고찰하는 것이다.내가 관찰한 바에 의하면'희자는 몇 가지 문법이 있다'는 말은 많은 경우에 이미 몇몇 친구들이 자신을 위해 주도면밀하게 생각하지 않거나 깊이 이해하지 못하고 벗어나는 이유가 되었다.안타깝게도 어떤 방법에는 몇 가지 이상이 있다. 크로스 페이지에서 데이터를 전달하는 몇 가지 방법을 열거하고 C#의 구성원들이 어떤 수식부호를 가지고 있는지 등은 모두 몇몇 유명 대기업에서 지원자를 고찰하는 제목이다.
됐어, 분명히 말해 봐. 마이크로소프트야. 게다가 내가 직접 만난 면접문제야.
텍스트 모든 코드:http://gist.github.com/188304
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
public DelegateEvent(Type type, string eventName)
{
this.CheckDelegateType();
if (type == null) throw new ArgumentNullException("type");
if (String.IsNullOrEmpty(eventName)) throw new ArgumentNullException("eventName");
this.BindEvent(type, null, eventName);
}
var de = new DelegateEvent<EventHandler>(typeof(MyClass), "MyStaticEvent");
이것이 바로 문장이 처음에 언급한 '개자식 같다' 는 방법이다.그는 비록 매우 큰 제한이 있지만 결코 옳은 곳이 하나도 없는 것은 아니다.따라서 그것도 하나의 방법으로 간주하자.
public DelegateEvent(Expression<Func> eventExpr)
{
this.CheckDelegateType();
// () => obj.EventName
if (eventExpr == null) throw new ArgumentNullException("eventExpr");
// obj.EventName
var memberExpr = eventExpr.Body as MemberExpression;
if (memberExpr == null)
{
throw new ArgumentNullException("eventExpr", "Not an event.");
}
object instance = null;
// obj
if (memberExpr.Expression != null)
{
try
{
// () => obj
var instanceExpr = Expression.Lambda<Func<object>>(memberExpr.Expression);
instance = instanceExpr.Compile().Invoke();
}
catch (Exception ex)
{
throw new ArgumentNullException("eventExpr is not an event", ex);
}
}
this.BindEvent(memberExpr.Member.DeclaringType, instance, memberExpr.Member.Name);
}
몇 차례의 표현식 트리의 조립과 해석을 거쳤는데, 당신은 아직도 이것이 접촉하기 어려운 화제라고 생각하십니까?주석에서 알 수 있듯이, 사실 그것의 매 단계의 조작은 매우 명확하고, 표현식의 정보를 편리하고 조리 있게 추출할 수 있다.C# 컴파일러의 유형 추정 기능과 함께 Delegate Event 객체를 구성하는 데 도움이 되는 방법을 추가할 수도 있습니다.
public static class EventFactory
{
public static DelegateEvent Create(Expression<Func> eventExpr)
{
return new DelegateEvent(eventExpr);
}
}
그래서 우리는 이렇게 사용할 수 있다.
class Program
{
public event EventHandler MyEvent;
public static event EventHandler MyStaticEvent;
static void Main(string[] args)
{
var sde = EventFactory.Create(() => MyStaticEvent);
var p = new Program();
var de = EventFactory.Create(() => p.MyEvent);
}
}
이 방법의 장점은 프로그래밍이 쉽고 정적 검사와 재구성 등'복리'를 누릴 수 있다는 것이다.그러나 그 제한도 논의되었다. 그것이 바로 '이벤트를 정의하는 클래스에만 사용할 수 있다.위의 코드가 Program의 Main 방법에서 벗어나면 컴파일되지 않는다는 것이다.따라서 이 방법은 이벤트를 정의하는 클래스가 직접 Delegate 이벤트의 대상을 노출하는 장면에만 적용된다.만약 당신이 이 장면 아래에 있다면, 그것은 거의 당신의 가장 좋은 선택입니다.
총결산
이것이 바로 나의 참고 답안이다. 어렵지 않지만, 단번에 이룰 수 있는 것은 아닌 것 같다.이것도 내가'취미 프로그래밍'을 하는 목적이다. 나는 모든 문제의 해결 방안을 작은 범위에 집중하여 각각의 편리함을 발굴할 수 있기를 바란다. 설령 그것이 모두 간단하더라도.예를 들어 당신은 첫 번째 방법을 쉽게 생각할 수 있지만 다른 사용 장면에 적합한 구조 방식도 준비했습니까?만약 당신이 각종 구조 방식을 짰다면, 이상 상황을 모두 판단했습니까?만약 이상 상황을 판단했다면, 개발을 간소화하기 위해 보조적인 API를 제공했습니까? (예: 위의 EventFactory)
이것들은 희자가 몇 가지나 쓰는가의 문제가 아니라 한 사람이 주도면밀하게 고려하는지 고찰하는 것이다.내가 관찰한 바에 의하면'희자는 몇 가지 문법이 있다'는 말은 많은 경우에 이미 몇몇 친구들이 자신을 위해 주도면밀하게 생각하지 않거나 깊이 이해하지 못하고 벗어나는 이유가 되었다.안타깝게도 어떤 방법에는 몇 가지 이상이 있다. 크로스 페이지에서 데이터를 전달하는 몇 가지 방법을 열거하고 C#의 구성원들이 어떤 수식부호를 가지고 있는지 등은 모두 몇몇 유명 대기업에서 지원자를 고찰하는 제목이다.
됐어, 분명히 말해 봐. 마이크로소프트야. 게다가 내가 직접 만난 면접문제야.
텍스트 모든 코드:http://gist.github.com/188304
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.