Вы можете использовать следующее правило в htaccess для перезаписи субдомена во вложенную папку:
RewriteEngine On
#If the host is "sub.domain.com"
RewriteCond %{HTTP_HOST} ^sub.domain.com$ [NC]
#Then rewrite any request to /folder
RewriteRule ^((?!folder).*)$ /folder/$1 [NC,L]
Строка за строкой Объяснение:
RewriteEngine on
Строка выше сообщает серверу включите движок для переписывания URL-адресов.
RewriteCond %{HTTP_HOST} ^sub.domain.com$ [NC]
Эта строка является условием RewriteRule, в котором мы сопоставляем HTTP-узел с использованием шаблона регулярного выражения. Условие говорит, что если хост является sub.domain.com, тогда выполните правило.
RewriteRule ^((?!folder).*)$ /folder/$1 [NC,L]
Правило соответствует http://sub.domain.com/foo и внутренне перенаправляет его на http://sub.domain.com/folder/foo .
Замените sub.domain.com на ваш поддомен и папку с именем папки, которую вы хотите чтобы указать ваш поддомен.
C# и VB имеют дженерики для использования в своих интересах поддержки дженериков в базовом CLR (или наоборот?). Они позволяют Вам писать код статически типизированный язык INA, который может относиться больше чем к одному виду типа, не переписывая код для каждого типа, Вы используете их для (время выполнения сделает это для Вас), или иначе использование Системы. Объект и бросающий везде (как мы имели отношение к ArrayList).
Вы читали статью?
Эти языки также имеют дженерики:
Лично я - огромный поклонник дженериков из-за всего кода, который я не должен писать.
В цели-C можно использовать протоколы для достижения целей дженериков. Так как язык со слабым контролем типов однако, это обычно - не такое же большое беспокойство как тогда, когда Вы боретесь с системой типов для использования одного пути выполнения кода для многих типов.
Java также имеет дженерики. C++ имеет шаблоны.
Динамические языки как Perl и JavaScript не имеют тех же ограничений типа, таким образом, они извлекают главным образом ту же пользу с меньшим количеством работы.
Типичным примером являются наборы. например, ряд типа T, поскольку Добавление (T) метод и T получает () метод. Тот же код, другой тип безопасные наборы.
У C++, D, Ada и других есть шаблоны, надмножество дженериков, которые делают это, немного другой ошибки получает тот же конечный результат (и затем некоторые).
Java IIRC имеет дженерики, но я не делаю Java.
Они увеличивают производительность для наборов с помощью типов значения, так как никакая упаковка/распаковывание не будет требоваться. Они являются намного более чистыми для использования, так как Вы не должны будете бросать объект (например, использование ArrayList) к желаемому типу - и аналогично они помогают осуществить безопасность типов.
Самый легкий способ объяснить это состоит в том, чтобы дать пример. Скажите желание двух хеш-таблиц, та, которая отображает объекты строки типа ввести интервал и тот, который отображает объекты строки типа ввести дважды. Вы могли определить Хеш-таблицу и затем использовать K и V типов. Без дженериков необходимо было бы использовать 'объектный' тип, который, в дополнение к необходимости быть брошенным, чтобы быть значимым, бросает typesafety. Просто инстанцируйте Хеш-таблицы и Хеш-таблицы, и у Вас есть свои хеш-таблицы с надлежащим typechecking и так далее.
Самое большое преимущество дженериков по не универсальные типы в C# (не Java, Java является другой историей), то, что они намного быстрее. JIT генерирует лучший машинный код, который он может придумать для данного типа. List<int>
на самом деле список ints и не целочисленных объектов, переносящих интервал. Это делает универсальные типы удивительно быстро и также безопасный с точки зрения типов, который может помочь Вам обнаружить потрясающую партию ошибок во время компиляции :)
Дженерики, основываются на понятии шаблонов в C++, если Вы знакомы с ними.
Это - способ реализовать алгоритм или структуру данных, но задержка фактического типа это используется на.
Список может затем быть присвоен с любым типом по Вашему выбору интервал, строка и даже пользовательские типы, которые тип присвоен на конструкции списка. Но Вы сможете использовать операции списка, добавляют, удаляют и т.д.
Можно действительно сохранить большое кодирование усилия путем привыкания к дженерикам. И Вы не должны упаковывать и распаковывать между типами.
Java имеет дженерики также. Их называют подстановочными знаками.
Дженерики в.NET превосходны для объектных наборов. Можно определить тип объекта однако, Вы хотите и смочь иметь, скажем, Список, не пишущий кода для этого и иметь доступ ко всей эффективной функциональности универсального набора Списка.NET будучи безопасными с точки зрения типов к T. Это - большой материал.
Рассмотрите эти сигнатуры методов:
//Old and busted
public abstract class Enum
{
public static object Parse(Type enumType, string value);
}
//To call it:
MyEnum x = (MyEnum) Enum.Parse(typeof(MyEnum), someString);
//New and groovy
public abstract class Enum
{
public static T Parse<T>(string value);
}
//To call it:
MyEnum x = Enum.Parse<MyEnum>(someString);
Мама взгляда: Никакое управление типом выполнения.
Из MSDN:
Дженерики предоставляют решение ограничения в более ранних версиях общеязыковой среды выполнения и языка C#, на котором обобщение выполняется путем кастинга типов к и от универсального Объекта базового типа. Путем создания универсального класса можно создать набор, который безопасен с точки зрения типов во время компиляции.
Считайте остальную часть той статьи для наблюдения некоторых примеров того, как Дженерики могут улучшить удобочитаемость и производительность кода.
Вероятно, наиболее популярный способ использования их имеет ArrayLists со строгим контролем типов. В.NET 1.1, необходимо было бы или бросить все от объекта до желаемого Типа или использовать что-то как CodeSmith для генерации ArrayList со строгим контролем типов.
Кроме того, они помогают уменьшить упаковку. Снова, в.NET 1.x, если бы Вы пытались использовать ArrayList с Типом Значения, Вы закончили бы тем, что упаковали и распаковали объекты повсеместно. Дженерики избегают что, позволяя Вам определить Тип, или Ссылку или Значение.
Существует другое удобное использование для них также, обработчиков событий, запросов LINQ, и т.д.
Лично, я думаю, что они позволяют экономить много времени. Я все еще использую Платформу.NET 1.1 и каждый раз, когда Вы хотите определенный набор, необходимо создать набор со строгим контролем типов путем реализации CollectionBase. С Дженериками просто необходимо объявить набор как этот List<MyObject>
и это сделано.
Дженерики в .NET, как наследование и дополнительные методы, допускают сокращение дублирования кода. Позвольте мне объяснить посредством рефакторинга.
Если все классы с общим предком имеют общепринятую методику, помещают общепринятую методику в общего предка классов (наследование).
Если некоторые классы имеют общепринятую методику, которая использует государственный контракт, чтобы достигнуть некоторого результата, превратить общепринятую методику в дополнительный метод по тому государственному контракту.
Если приблизительно несколько методов или классов имеют тот же код, который отличается только типами, на которые реагируют (особенно, где детали типа не относятся к операции метода), соберите те методы или классы в дженерик.