Рассмотрите “доступное” ключевое слово в C#

здесь мы можем создать подчеркивание цветом в тексте

<u style="text-decoration-color: red;">The color of the lines should now be red!</u>

или

Цвет теперь линии должны быть красными!

<h1 style=" text-decoration:underline; text-decoration-color: red;">The color of the lines should now be red!</u>
13
задан 2 revs 29 May 2009 в 07:12
поделиться

5 ответов

Часто заявляемый принцип заключается в том, что «шаблоны проектирования необходимы для устранения недостатков языка». Это пример того принципа. Нам нужен одноразовый шаблон, потому что язык не дает его вам.

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

Но языковой дизайн - это все. дорого, и к нему можно приложить ограниченное количество усилий. Таким образом, мы пытаемся найти наиболее полезные и убедительные шаблоны для включения в сам язык. И мы пытаемся найти способ, который не только был бы удобен, но и действительно добавил бы выразительной силы языку. LINQ, например, переносит концепции фильтрации, проецирования, объединения, группировки и упорядочения данных в сам язык, что добавляет ему выразительной силы.

Хотя это, безусловно, хорошая идея, я не думаю, это соответствует планке. Я согласен, это было бы неплохим удобством, но оно не позволяет использовать какие-либо действительно богатые новые сценарии.

24
ответ дан 1 December 2019 в 18:55
поделиться

Лично я считаю поддержку IDisposable вполне приличной в текущей версии .NET. Наличие ключевого слова using в значительной степени превращает его в первоклассную конструкцию для меня.

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

Конечно, деструктор ( ~ MyDisposableThing ) и метод без параметров Dispose () являются подлинно шаблонными и могут быть исключены пользователем ключевого слова языка, как вы предлагаете - но опять же, я не уверен введение фактического нового ключевого слова - это все, что необходимо для нескольких строк кода.

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

Я не уверен, что введение действительно нового ключевого слова - это все, что необходимо для нескольких строк кода.

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

Я не уверен, что введение действительно нового ключевого слова - это все, что необходимо для нескольких строк кода.

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

5
ответ дан 1 December 2019 в 18:55
поделиться

Хорошо, вам нужно понять разницу между управляемой и неуправляемой памятью. Проще говоря, деструкторы стиля C ++ не будут работать в управляемом мире C #, потому что нет гарантии, когда объект будет собран сборщиком мусора, поэтому вы никогда не узнаете, когда деструктор будет вызван, что сделало бы вещи очень непредсказуемыми.

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

Это причина, по которой в C # не может быть деструкторов.

-1
ответ дан 1 December 2019 в 18:55
поделиться

В дополнение к другим ответам существует проблема: сколько должно быть реализовано и чего люди должны от него ожидать? Допустим, я объявил свой класс следующим образом:

public disposable class MyClass
{
    readonly AnotherDisposableObject resource = new AnotherDisposableObject();

    ~MyClass()
    {
        this.resource.Dispose();
    }

    public void DoStuff()
    {
        this.resource.SomeMethod();
    }
}

Тогда что вы ожидаете, если бы вызывающий объект вызвал DoStuff после , экземпляр был удален? Должен ли компилятор автоматически вставлять что-то вроде

if (this.disposed) throw new ObjectDisposedException();

в начало каждого метода, потому что вы объявили класс как одноразовый?

Если да, то как насчет случаев, когда методам явно разрешено вызывать после удаления объекта (например, MemoryStream.GetBuffer )? Не могли бы вы ввести новое ключевое слово, указывающее на это компилятору, например public useafterdispose void ... ?

Если нет, то как вы объясните людям, что ключевое слово new реализует для вас часть стандартного кода, но им все равно нужно написать код, чтобы проверить, удаляется ли объект в каждом методе? Более того, как могут они даже это проверить, потому что вся информация о состоянии о том, был ли объект удален, генерируется автоматически! Теперь им нужно отслеживать свой собственный флаг в методе ~ MyClass , который отменяет половину работы, которую компилятор должен делать за вас.

Я думаю, что в качестве конкретного языкового шаблона в концепции слишком много дыр. , и он пытается решить только одну конкретную проблему. Теперь то, что может решить весь этот класс проблем универсальным способом, так это примеси (т.е. одноразовый миксин), и эта языковая функция обычно может быть повторно использована для различных концепций (например, Equatable mixin, Comparable mixin и т. д.). Вот куда пойдут мои деньги.

6
ответ дан 1 December 2019 в 18:55
поделиться

Я полностью согласен с тем, что IDisposable нуждается в улучшенной языковой поддержке. Вот мой вариант, сделанный недавно . Детали, вероятно, неверны, но C ++ / CLI служит для этого довольно хорошей моделью. К сожалению, когда я показываю им примеры на C ++ / CLI, это сбивает с толку программистов на C #. Но он уже делает «правильные вещи» с точки зрения реализации; нам просто понадобится новый синтаксис в C #.

Даже в простейшем приложении Windows Forms есть метод Dispose , который генерируется мастером и является хрупким перед лицом неопытных изменений. Идея компоновки компонентов вместе так, чтобы один компонент мог «владеть» несколькими другими, настолько фундаментален, что IDisposable практически неизбежен, и, к сожалению, в большинстве книг требуется несколько страниц, чтобы объяснить, как его правильно реализовать.

Существующий оператор using заботится о стороне клиента. Там, где нам нужна дополнительная языковая поддержка, находится на стороне реализации.

Некоторые поля класса являются ссылками на вещи, которыми класс «владеет», а некоторые не принадлежат. Итак, мы должны иметь возможность пометить поле как принадлежащее.

Кроме того, было бы очень плохой идеей автоматически создавать финализатор. Чаще всего классу принадлежат другие объекты, реализующие IDisposable . Не все классы являются потокобезопасными, и в этом не должно быть необходимости. Если они вызываются из финализатора, это происходит в другом потоке, заставляя их быть потокобезопасными.

4
ответ дан 1 December 2019 в 18:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: