Гранулярность синтаксиса, раскрашивающего Visual Studio

FormatterServices.GetUninitializedObject() создаст экземпляр, не вызывая конструктора. Я нашел этот класс при помощи Отражатель и роющий через часть ядра.Net классы сериализации.

я протестировал его с помощью примера кода ниже, и похоже, что это работает отлично:

using System;
using System.Reflection;
using System.Runtime.Serialization;

namespace NoConstructorThingy
{
    class Program
    {
        static void Main()
        {
            // does not call ctor
            var myClass = (MyClass)FormatterServices.GetUninitializedObject(typeof(MyClass));

            Console.WriteLine(myClass.One); // writes "0", constructor not called
            Console.WriteLine(myClass.Two); // writes "0", field initializer not called
        }
    }

    public class MyClass
    {
        public MyClass()
        {
            Console.WriteLine("MyClass ctor called.");
            One = 1;
        }

        public int One { get; private set; }
        public readonly int Two = 2;
    }
}

http://d3j5vwomefv46c.cloudfront.net/photos/large/687556261.png

9
задан I. J. Kennedy 22 October 2009 в 21:23
поделиться

2 ответа

Несколько мыслей.

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

Во-вторых, функции распределяются по приоритетам на основе их чистой выгоды, то есть их общей выгоды для наших клиентов за вычетом наших общих затрат на их внедрение. Здесь есть очень реальные «альтернативные издержки». Каждая функция, которую мы ДЕЙСТВИТЕЛЬНО реализуем, - это десятки функций, на которые у нас нет бюджета. Таким образом, функции не только должны стоить работы, чтобы они стали реальностью, они должны быть БОЛЕЕ полезными, чем любая из тысяч функций, которые мы включили в наши списки запросов функций. Это высокая планка для достижения; большинство функций никогда не достигают этого.

Чтобы объяснить мой третий пункт, вам нужно немного знать о том, как обрабатываются языки. Мы начинаем с того, что берем исходный код и «превращаем» его в «токены» - слова. На этом этапе мы знаем, является ли каждый символ частью числа, строки, ключевого слова, идентификатора, комментария, директивы препроцессора и так далее. Лексирование невероятно быстрое ; мы можем легко преобразовать файл между нажатиями клавиш.

Затем мы берем серию токенов и «разбираем» их в «абстрактное синтаксическое дерево». Это определяет, какие части кода являются классами, выражениями, объявлениями локальных переменных, именами, назначениями и т. Д. Разбор также выполняется быстро, но не так быстро, как лексирование. Мы проделываем некоторые уловки, например, пропускаем синтаксический анализ тел методов до тех пор, пока кто-нибудь не увидит их.

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

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

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

Иногда мы можем придумать что-то особенное, вроде «это, вероятно, тип?» чтобы придать ему другой цвет. Но выяснение того, является ли данная сущность, скажем, группой методов, а не полем типа делегата, требует довольно богатого уровня семантического анализа, уровня, который в настоящее время мы не выполняем при каждом нажатии клавиши.

Теперь мы можем кое-что сделать. Мы могли бы лучше понимать изменения в потоке токенов и проводить повторный грамматический и семантический анализ только в отредактированной части дерева. Сейчас мы проводим некоторые исследования в этой области, но это всего лишь исследования; он может никогда не попасть в продукт.

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

Теперь есть вещи, которые мы можем сделать здесь. Мы могли бы лучше понимать изменения в потоке токенов и проводить повторный грамматический и семантический анализ только в отредактированной части дерева. Сейчас мы проводим некоторые исследования в этой области, но это всего лишь исследования; он может никогда не попасть в продукт.

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

Теперь есть вещи, которые мы можем сделать здесь. Мы могли бы лучше понимать изменения в потоке токенов и проводить повторный грамматический и семантический анализ только в отредактированной части дерева. Сейчас мы проводим некоторые исследования в этой области, но это всего лишь исследования; он может никогда не попасть в продукт.

Сейчас мы проводим некоторые исследования в этой области, но это всего лишь исследования; он может никогда не попасть в продукт.

Сейчас мы проводим некоторые исследования в этой области, но это всего лишь исследования; он может никогда не попасть в продукт.

14
ответ дан 4 December 2019 в 13:03
поделиться

Я считаю, что плагин ReSharper обеспечивает улучшенную подсветку синтаксиса, о которой вы говорите. Также могут быть другие плагины, которые предоставляют то же самое (с меньшими затратами), которое я использую. Я согласен, что подсветка синтаксиса очень полезна. ReSharper также делает некоторые приятные вещи, например, закрашивает мертвый код серым, чтобы сделать его более очевидным, выделяет текущую строку и т. Д.

-Daniel

2
ответ дан 4 December 2019 в 13:03
поделиться
Другие вопросы по тегам:

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