Из MSDN" Новые Рекомендации для Использования Строк в Microsoft.NET 2.0 "
Сводка: Кодируйте владельцев, ранее использующих
InvariantCulture
для сравнения строк, преобразования регистра, и сортировка должна сильно рассмотреть использование нового набораString
перегрузки в Microsoft.NET 2.0. А именно, данные, которые разработаны, чтобы быть агностическими культурой и лингвистически не важные , должны начать определять перегрузки с помощью илиStringComparison.Ordinal
илиStringComparison.OrdinalIgnoreCase
члены новогоStringComparison
перечисление. Они осуществляют сравнение байта байтом, подобноеstrcmp
, который не только избегает ошибок от лингвистической интерпретации чрезвычайно символьных строк, но обеспечивает лучшую производительность.
Мы ориентируемся на несколько версий среды выполнения одновременно (.NET 1.1, .NET 2.0 и .NET 3.5) для некоторых продукты.
Мы обрабатываем это несколькими способами:
например:
\ProductFoo_1_1.sln (.NET 1.1 solution, VS 2003) \ProductFoo_2_0.sln (.NET 2.0 solution, VS 2008) \ProductFoo_3_5.sln (.NET 3.5 solution, VS 2008) \FooLibrary\FooLibrary_1_1.csproj (.NET 1.1 Project, VS 2003) \FooLibrary\FooLibrary_2_0.csproj (.NET 2.0 Project, VS 2008) \FooLibrary\FooLibrary_3_5.csproj (.NET 3.5 Project, VS 2008) \FooLibrary\FooClass.cs (shared amongst all Projects) \FooLibrary\FooHelpers_1_1.cs (only referenced by the .NET 1.1 project) \FooService\FooService_3.5.csproj (.NET 3.5 Project, VS 2008) \FooService\FooService.cs
Определение символов NET_X_X
в каждом из решений
Для кода, специфичного для .NET Framework, мы используем инструкции препроцессора, такие как:
public void SomeMethod(int param) { #ifdef NET_1_1 // Need to use Helper to Get Foo under .NET 1.1 Foo foo = Helper.GetFooByParam(param); #elseif NET_2_0 || NET_3_5 // .NET 2.0 and above can use preferred method. var foo = new Foo { Prop = param }; foo.LoadByParam(); #endif foo.Bar(); } #ifdef NET_3_5 // A method that is only available under .NET 3.5 public int[] GetWithFilter(Func Filter) { // some code here } #endif
Для пояснения, приведенные выше строки начинаются с # - команды препроцессора. Когда вы компилируете решение, компилятор C # (csc) предварительно обрабатывает исходные файлы.
Если у вас есть оператор #ifdef
, то csc выполнит оценку, чтобы определить, определен ли этот символ, и если да, то включит строки в этот сегмент при компиляции проекта.
Это способ разметки кода для компиляции в определенных условиях - мы также используем его для включения более интенсивной отладочной информации в конкретные подробные отладочные сборки, например:
#if DEBUG_VERBOSE Logging.Log("Web service Called with parameters: param = " + param); Logging.Log("Web service Response: " + response); Logging.Log("Current Cache Size (bytes): " + cache.TotalBytes); // etc. #endif
Это действительно усложняет задачу, поэтому мы делаем это только там, где нам нужно поддерживать устаревший экземпляр .NET 1.1 или 2.0 ( например, когда клиент не может / не хочет обновлять).
Я полагаю, что когда появится .NET 4.0, мы сделаем то же самое и просто добавим символ NET_4_0.
Я бы оставьте значение 2.0, если вам не нужно использовать функции 3.0 или 3.5.
Если бы я начал новый проект, Я всегда буду использовать новейшую среду выполнения! Если доступна версия 3.5, зачем мне начинать проект в версии 2.0 или 1.0, если я не знал, что с новой версией что-то серьезно не так? Новые версии означают исправление старых ошибок и добавление новых функций, так что это хорошо.
Когда дело доходит до обновления старого проекта до новой версии, вам необходимо учитывать ваши прибыли и убытки. Если он испортился, обновите его, если не придерживайтесь старой версии.
Будьте осторожны, потому что новые инструменты могут не поддерживать старые версии. Хотя это не относится к 2010 году, поскольку он поддерживает все версии до 2.0.
Я голосую за ответ Эрика ван Бракеля. Также я хотел бы предложить, чтобы если вы хотите поддерживать такие функции 3.5, как LINQ и методы расширения, вы можете создать дополнительную библиотеку, скажем
MyLibrary.DLL
MyLibrary.LINQ.dll
, используя тот же подход. как и MS (когда они оставили версию System.dll 2.0, но добавили все новые функции в System.Core.dll)
Я бы нацелился на версию 2.0 с библиотекой, содержащей основные функции, и добавил бы дополнительную библиотеку, нацеленную на 3.5, чтобы добавить некоторые методы расширения на основе вашей основной библиотеки.
попробуйте следующее:
переключите режим нацеливания на framework 2.0 (удалив ссылку на System.Core).
если он не компилируется, попробуйте добавить ссылку на linqbridge.dll :
Если нет, то вы должны выбрать 3,5;)
С моей точки зрения, если вам нужен широкий круг пользователей, вы должны делать это с ранними версиями, 1.1 будет хорошо, потому что он будет работать на любой машине, имеющей .Net, что когда-либо его версия.
Лично я бы выбрал .NET 2.0. Это означает, среди прочего:
Нет linq
Вы МОЖЕТЕ использовать лямбда-выражения
Дело в том, что , вы можете использовать функции языка C # 3.x (так называемый синтаксический сахар), но вы не можете использовать библиотеки, предназначенные для C # 3.x (System.Core, чтобы назвать один, включает методы расширения и linq).
Я бы не стал пытаться поддерживать C # 1.x, поскольку он сильно отличается от C # 2.x и выше. Кроме того, я ожидаю, что большинство людей, которые будут использовать вашу библиотеку, - это люди, создающие новые вещи, которые в здравом уме не стали бы использовать C # 1.x; -)
Это зависит от того, для чего предназначена dll. Если у него просто общая логика C #, которую вы хотели бы сделать доступной для других, то .net 2.0, вероятно, ваш лучший выбор. Однако, если это имеет какое-либо отношение к более новым функциям в .net, таким как WPF, EF, WCF, silverlight и т. Д., Тогда это должна быть версия .net, которая поддерживает эту конкретную функцию.
Лично я бы сказал, пишите это в .net 3.5 только потому, что переход с .net2.0 на .net3.5 довольно безболезнен, потому что критических изменений не так много, как при переходе с .net1.x на .net2 .0. :)
Я не думаю, что кто-то больше использует .Net 1.1. Так что, если вы действительно не хотите использовать функции 3.5, 2.0 должно быть в порядке. Кроме того, если у вас есть контроль над тем, кто на самом деле будет использовать вашу библиотеку, это тоже зависит от них. Если у них есть последняя версия фреймворка, вы можете использовать ее.