문제

많은 답변을 읽은 후 이 스레드, 나는 그것을 싫어하는 많은 사람들이 새로운 키워드의 남용 가능성을 인용한다고 생각합니다. 내 질문은 어떤 종류의 학대입니까? 사람들이 그것을 격렬하게 싫어하게 만들기 위해 어떻게 이것이 악용 될 수 있습니까? 순수주의에 관한 것입니까? 아니면 내가 보지 못하는 진짜 함정이 있습니까?

도움이 되었습니까?

해결책

어떤 사람들은 그것을 남용 될 도구로 본다. C# 및 Java와 같은 "순수한"언어가 없었던 VB에서 "Option Strict Off"및 "On Error Resume Next"와 같이.

많은 사람들이 "var"키워드에 대해 똑같이 말했지만, 그것이 VB의 "Variant"와 같지 않다는 것을 이해하면 남용되는 것을 보지 못했습니다.

게으른 개발자가 수업에서 유형 확인을 원하지 않고 "Blah가 blah ..."를 쓰지 않고 역동적 인 전화를 걸어보십시오.

나는 개인적으로 그것이 다음과 같은 상황에서 제대로 사용할 수 있다고 생각합니다. 이것 내가 대답 한 최근 질문.

나는 그것이 실제로 그것을 이해하는 사람들이 동적 .NET 언어에 크게 많은 힘이라고 생각합니다.

다른 팁

사람들 이이 기능을 표현하는 많은 반란이 "이것은 나쁜 개발자가 나쁜 코드를 작성할 수 있기 때문에 나쁜 언어 기능입니다." 당신이 그것에 대해 생각한다면, 그 논리에 의해 모두 언어 기능은 나쁘다.

일부 천재가 접두사 한 VB 코드 블록을 만날 때 On Error Resume Next, 내가 저주하는 것은 VB가 아닙니다. 어쩌면 내가해야한다고 생각합니다. 그러나 내 경험상 퓨즈 박스에 페니를 넣기로 결심 한 사람은 방법을 찾을 것입니다. 당신이 그의 주머니를 비워도 자신의 동전을 패션 할 것입니다.

나, 나는 C#과 Python간에 상호 운용하는 더 유용한 방법을 고대하고있다. 나는 이것을하는 점점 더 많은 코드를 쓰고 있습니다. 그만큼 dynamic 키워드는 특정 사용 사례에 대해 곧 올 수 없습니다. 현재의 방식으로 인해 회의를 위해 서양으로 여행하는 1950 년대 소비에트 학자 인 것 같은 느낌이 들기 때문입니다. 엄청난 규칙과 서류 작업이 있습니다. 떠나기 전에, 나는 누군가가 내가 거기에있을 때까지 나를보고있을 것이라고 확신합니다. 그리고 내가 거기에있는 동안 내가 집어 들면서 내가 돌아올 때 국경에서 나에게서 빼앗길 것입니다.

동적 이와 같은 코드는 모든 곳에서 튀어 나오기 때문에 나쁘다.

public dynamic Foo(dynamic other) {
  dynamic clone = other.Clone();
  clone.AssignData(this.Data);
  return clone ;
}

대신에:

public T Foo<T>(T other) where T: ICloneable, IAssignData{
    T clone = (T)other.Clone();
    clone.AssignData(this.Data);
    return clone;
}

첫 번째는 정적 유형 정보가없고 컴파일 시간 점검이 없으며 자체 문서화가 아니며 유형 추론이 없으므로 사람들은 콜 사이트에서 동적 참조를 사용하여 결과를 저장하여 더 많은 유형 손실을 초래합니다. 이 나선이 내려갑니다.

나는 이미 두려워하기 시작했다 동적.

편집하다: 위험이 통과되었습니다 (Phew!) ... 그리고 다이나믹은 결국 학대되지 않았으며, 3 년 후에 나에게 투표 할 필요가 없습니다 :)

진짜 함정? 문서의 심각한 부족. 전체 응용 프로그램의 건축은 그것을 쓴 사람 (또는 사람)의 마음에 존재합니다. 적어도 강한 유형의 경우 클래스 정의를 통해 객체가 무엇을하는지 볼 수 있습니다. 다이나믹 유형을 사용하면 사용에서 의미를 추론해야합니다. 최악의 경우, 당신은 객체가 무엇인지 전혀 모릅니다. 모든 것을 JavaScript로 프로그래밍하는 것과 같습니다. ack!

사람들이 자신이 좋은 지능을 얻지 못한다는 것을 깨달았을 때 dynamic, 그들은 다시 존재로 전환 할 것입니다 dynamic-행복합니다 dynamic-절개시기-var-모든 시간.

목적 dynamic 포함 : 동적 언어 및 Com/C ++ 및 DLR/Ironpython/Ironruby와 같은 플랫폼과의 상호 운용성; C# 자체를 Ironsmalltalkwithbraces로 바꾸는 것뿐만 아니라 모든 구현을 통해 IDynamicObject.

좋은 시간은 모두가있을 것입니다. (다른 사람이 쓴 코드를 유지하지 않아도됩니다.)

이것은 공개 카메라에 대해 논의하는 것과 비슷합니다. 오용 할 수 있고 오용 될 것이지만, 그 카메라도 마찬가지입니다.

필요하지 않은 경우 자신의 코딩 가이드 라인에서 "동적"키워드를 금지 할 수없는 이유는 없습니다. 그래서 문제는 무엇입니까? "Dynamic"키워드로 미친 일을하고 싶다면 C#은 JavaScript의 일부 돌연변이 사촌 인 내 손님이 되십시오. 이 실험을 코드베이스에서 보관하십시오. ;)

FUD. 얇게 썬 빵 이후로 가장 좋은 일이지만 VB, JavaScript 등의 모든 경험은 C#이 동적 바인딩을 가질 것이라는 것을 알기위한 오한을 가져옵니다. 나는 가까운 시일 내에 합리적으로 볼 수 있고 동적 언어와 상호 운용성을 가능하게하는 새로운 기능이 얼마나 좋은지 볼 수 있다는 것을 알고 있습니다. 그러나 시간이 좀 걸릴 것입니다. 나는 인간, 알았지? :-)

현재 방법을 호출하는 방법이 역동적으로 결함이있는 이유는 보이지 않습니다.

이를 위해서는 세 줄이 필요하거나 System.Object에서 확장 방법을 추가 할 수 있습니다.

class Program
{
    static void Main(string[] args)
    {
        var foo = new Foo();            
        Console.WriteLine(foo.Invoke("Hello","Jonathan"));
    }        
}

static class DynamicDispatchHelper
{
    static public object Invoke(this object ot, string methodName, params object[] args)
    {
        var t = ot.GetType();
        var m = t.GetMethod(methodName);
        return m.Invoke(ot, args);
    }
}

class Foo
{
    public string Hello(string name)
    {
        return ("Hello World, " + name);
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top