Динамическое ключевое слово C#4 – почему бы и нет?

StackOverflow https://stackoverflow.com/questions/245318

  •  05-07-2019
  •  | 
  •  

Вопрос

Прочитав множество ответов на эта тема, Я вижу, что многие из тех, кому это не нравится, ссылаются на возможность злоупотребления новым ключевым словом.У меня вопрос: какого рода злоупотребления?Как можно было так злоупотреблять этим, что это вызвало у людей яростную неприязнь?Речь идет только о пуризме?Или есть настоящая ловушка, которую я просто не вижу?

Это было полезно?

Решение

Некоторые видят в этом инструмент, которым будут злоупотреблять. Нравится " Option Strict Off " и " При ошибке Resume Next " в VB, который "чистый" таких языков, как C # и Java никогда не было.

Многие говорили то же самое о " var " Ключевое слово, но я не вижу его злоупотребления, как только стало понятно, что это не то же самое, что VB "Вариант"

Это может привести к злоупотреблениям в тех местах, где ленивые разработчики не хотят проверять тип в классах и просто пытаются отлавливать динамические вызовы вместо того, чтобы писать " если бла это Бла ... ".

Лично я считаю, что его можно правильно использовать в таких ситуациях, как этот недавний вопрос, на который я ответил.

Я думаю, что те, кто действительно понимает его мощь, в значительной степени относятся к динамическим языкам .NET.

Другие советы

Я думаю, что большая часть отвращения, которое люди выражают этой функции, сводится к тому, что «это плохая языковая функция, потому что она позволит плохим разработчикам писать плохой код». Если подумать, то по этой логике все языковые возможности плохие.

Когда я сталкиваюсь с блоком VB-кода, которому какой-то гений присваивает префикс On Error Resume Next , я ругаю не VB. Может быть, я должен, я полагаю. Но по моему опыту, человек, который полон решимости положить пенни в блок предохранителей, найдет способ. Даже если вы опустошите свои карманы, он вылепит свои собственные копейки.

Я с нетерпением жду более полезного способа взаимодействия между C # и Python. Я пишу все больше и больше кода, который делает это. Ключевое слово dynamic не может появиться достаточно скоро для этого конкретного случая использования, потому что нынешний способ сделать это заставляет меня чувствовать, что я советский академик 1950-х годов, который едет на Запад на конференцию : до того, как я уйду, есть огромное количество правил и документов, я почти уверен, что кто-то будет наблюдать за мной все время, пока я там, и большую часть того, что я заберу, пока буду там, заберут я на границе, когда я вернусь.

dynamic - это плохо, потому что подобный код будет появляться повсюду:

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;
}

Первый из них не содержит статической информации о типе, не проверяет время компиляции, не самодокументируется, не выводит тип, поэтому люди будут вынуждены использовать динамическую ссылку на сайте вызовов для сохранения результата, что приведет к еще большей потере типа и все это скручивается вниз.

Я уже начинаю бояться динамики .

Изменить . Опасность миновала (Фу!) ... и динамикой все же не злоупотребляли, нет необходимости опускать голосование за меня через 3 года:)

Настоящая ловушка? Сильное отсутствие документации. Вся архитектура приложения существует в сознании человека (или людей), который его написал. По крайней мере, при строгой типизации вы можете посмотреть, что делает объект, через определение класса. С динамической типизацией вы должны в лучшем случае вывести значение из его использования. В худшем случае у вас НЕТ ИДЕИ, что это за объект. Это как программирование всего на JavaScript. ACK!

Когда люди понимают, что им не хватает хорошего IntelliSense с dynamic , они снова переключаются с dynamic на « dynamic -когда-надо-и-<код> вар -На-все-другие раза.

Цели dynamic включают: взаимодействие с динамическими языками и платформами, такими как COM / C ++ и DLR / IronPython / IronRuby; а также превращение самого C # в IronSmalltalkWithBraces со всем, что реализует IDynamicObject .

Хорошие времена будут у всех. (Если вам не нужно поддерживать код, написанный кем-то другим.)

Это похоже на обсуждение публичных камер, конечно, они могут и будут использоваться не по назначению, но есть и преимущества их использования.

Нет причины, по которой вы не могли бы запретить " динамический " ключевое слово в вашем собственном руководстве по кодированию, если оно вам не нужно. Так в чем проблема? Я имею в виду, если вы хотите делать сумасшедшие вещи с помощью " динамического " Ключевое слово и притворяться, что C # - некоторый двоюродный брат мутанта JavaScript, будь моим гостем Просто держи эти эксперименты подальше от моей кодовой базы. ;)

ФУД.Возможно, это лучшая вещь со времен нарезанного хлеба, но весь мой опыт работы с 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