Динамическое ключевое слово C#4 – почему бы и нет?
Вопрос
Прочитав множество ответов на эта тема, Я вижу, что многие из тех, кому это не нравится, ссылаются на возможность злоупотребления новым ключевым словом.У меня вопрос: какого рода злоупотребления?Как можно было так злоупотреблять этим, что это вызвало у людей яростную неприязнь?Речь идет только о пуризме?Или есть настоящая ловушка, которую я просто не вижу?
Решение
Некоторые видят в этом инструмент, которым будут злоупотреблять. Нравится " 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);
}
}