Другой способ использования Newtonsoft.Json :
dynamic stuff = Newtonsoft.Json.JsonConvert.DeserializeObject("{ color: 'red', value: 5 }");
string color = stuff.color;
int value = stuff.value;
TextInfo textInfo = Thread.CurrentThread.CurrentCulture.TextInfo;
textInfo.ToTitleCase("hello world!"); //Returns "Hello World!"
textInfo.ToTitleCase("hElLo WoRld!"); //Returns "Hello World!"
textInfo.ToTitleCase("Hello World!"); //Returns "Hello World!"
textInfo.ToTitleCase("HELLO WORLD!"); //Returns "HELLO WORLD!"
Да, такое поведение задокументировано, но это определенно не помогает.
Возможно, не самое худшее, но некоторые части среды .net используют градусы , в то время как другие используют радиан (и документация, которая появляется с Intellisense, никогда не говорит вам, какие именно, вы должны посетите MSDN, чтобы узнать)
Всего этого можно было избежать, если вместо этого использовать класс Angle
...
Использование параметров по умолчанию с виртуальными методами
abstract class Base
{
public virtual void foo(string s = "base") { Console.WriteLine("base " + s); }
}
class Derived : Base
{
public override void foo(string s = "derived") { Console.WriteLine("derived " + s); }
}
...
Base b = new Derived();
b.foo();
Выход:
производная база
Массивы реализуют IList
, но не реализуют его. Когда вы вызываете Add, он сообщает вам, что это не работает. Так почему же класс реализует интерфейс, если он не может его поддерживать?
Компилируется, но не работает:
IList<int> myList = new int[] { 1, 2, 4 };
myList.Add(5);
У нас часто возникает эта проблема, потому что сериализатор (WCF) превращает все списки IList в массивы и мы получаем ошибки времени выполнения.
События
Я никогда не понимал, почему события языковая функция. Их сложно использовать: вам нужно проверить наличие null перед вызовом, вам нужно отменить регистрацию (себя), вы не можете узнать, кто зарегистрирован (например: я зарегистрировался?). Почему событие - это не просто класс в библиотеке? В основном специализированный Список
?
Dictionary <,>: «Порядок, в котором возвращаются элементы, не определен». Это ужасно, потому что иногда он может вас укусить, но работать с другими, и если вы просто слепо предположили, что Dictionary будет вести себя хорошо («почему бы и нет? Я подумал, что List умеет»), вам действительно нужно вникнуть в это, прежде чем вы наконец начнете подвергать сомнению свое предположение.
(Аналогичный вопрос здесь .)
Худшее, что со мной случилось, - проблема с документом webBrowser:
http://geekswithblogs.net/paulwhitblog/archive/2005/12/12/62961.aspx#107062
решения AllowNavigation работают в формах Windows ...
но в компактной структуре это свойство не существует ...
... пока что единственным решением, которое я нашел, было перестроить элемент управления браузера:
Но для этого вам нужно держать историю браузера под рукой .. .: P
ASP.NET:
Если вы используете Linq-To-SQL, вы вызываете SubmitChanges ()
в контексте данных, и это вызывает исключение (например, дубликат key или другое нарушение ограничения), значения объекта-нарушителя остаются в вашей памяти во время отладки и будут повторно отправляться каждый раз, когда вы впоследствии вызываете SubmitChanges ()
.
Теперь вот реальный kicker: неверные значения останутся в памяти , даже если вы нажмете кнопку «стоп» в своей среде IDE и перезапустите! Я не понимаю, почему кто-то подумал, что это хорошая идея - но этот маленький ASP Значок .NET, который появляется на панели задач, остается работающим и, похоже, сохраняет кэш объектов. Если вы хотите очистить память, щелкните этот значок правой кнопкой мыши и принудительно выключите его! GOTCHA!
Linq-To-Sql и неоднозначность базы данных / локального кода
Иногда Linq просто не может определить, предназначен ли определенный метод для выполнения в базе данных или в локальном коде.
LINQ to SQL и отношения «один-ко-многим»
Это прекрасный вариант, который укусил меня пару раз, и MS предоставила одному из своих разработчиков его вставить ее блог . Я не могу выразить это лучше, чем она, так что взгляните туда.
Не забывайте изолированное хранение . Это дает вам место для чтения и записи файлов без необходимости указать местоположение. Иногда это единственный способ песочковых приложений (например, Silverlight) может хранить пользовательские данные или конкретные данные о специальных данных. Смотри здесь для примера.
-121--3518785-Связанный объект и внешний ключ из синхронизации
Microsoft поступил на эту ошибку .
У меня есть класс вещь
, в котором есть ФК к категории
. Категория не имеет определенного отношения к делу, чтобы не загрязнять интерфейс.
var thing = CreateThing(); // does stuff to create a thing
var category = GetCategoryByID(123); // loads the Category with ID 123
thing.Category = category;
Console.WriteLine("Category ID: {0}", thing.CategoryID);
Выход:
Category ID: 0
аналогично:
var thing = CreateThing();
thing.CategoryID = 123;
Console.WriteLine("Category name: {0}", order.Category.Name);
бросает NullReferenceException
. Связанный объект категория
не загружает запись категории с ID 123.
После того, как вы отправляете изменения в БД, однако эти значения могут быть синхронизированы. Но прежде чем посетить БД, значение FK и связанные с родственным объектом практически независимо!
(Интересно, что неспособность синхронизировать значение FK со связанным объектом, кажется, происходит только в том случае, если нет определенных дочерних отношений, то есть категория не имеет никаких «вещей» свойства. Но «нагрузка по требованию», когда вы просто устанавливаете Значение FK никогда не работает.)
GOTCHA!
LinqToSQL и агрегат пустого набора
См. этот вопрос .
Если у вас есть запрос LinqToSql, по которому вы запускаете агрегат - если ваш набор результатов пуст, Linq не может определить тип данных, даже если он был объявлен.
например. Предположим, у вас есть таблица Утверждение
с полем Amount
, которое в LinqToSql имеет тип decimal
.
var sum = Claims.Where(c => c.ID < 0).Sum(c => c.Amount);
Очевидно, что никакие претензии не имеют идентификатора меньше нуля, так что вы ожидаете увидеть sum = null, верно? Неправильно! Вы получаете InvalidOperationException
, потому что SQL-запрос, лежащий в основе запроса Linq, не имеет типа данных. Вы должны явно указать Linq, что это десятичное число! Таким образом:
var sum = Claims.Where(c => c.ID < 0).Sum(c => (decimal?)c.Amount);
Это действительно глупо, и ИМО - ошибка дизайна со стороны Microsoft.
GOTCHA!
И для LINQ-to-SQL, и для LINQ-to-Entities
return result = from o in table
where o.column == null
select o;
//Returns all rows where column is null
int? myNullInt = null;
return result = from o in table
where o.column == myNullInt
select o;
//Never returns anything!
Здесь есть отчет об ошибке для LINQ-to-Entites , хотя они, похоже, не часто проверяют этот форум. Может быть, кому-то следует зарегистрировать его и для LINQ-to-SQL?
VisibleChanged обычно не вызывается при изменении Visible.
Ключевое слово base
не работает должным образом при оценке в среде отладки: вызов метода по-прежнему использует виртуальную диспетчеризацию.
Это отняло у меня много времени, когда я наткнулся на нее и подумал, что натолкнулся на какую-то трещину в пространстве-времени CLR, но затем я понял, что это известная (и даже несколько преднамеренная) ошибка:
http://blogs.msdn.com/jmstall/archive/2006/06/29/funceval-does-virtual-dispatch.aspx
Свойство DesignMode во всех UserControls фактически не сообщает вам , если вы находитесь в режиме разработки.
Пакеты LinqToSql становятся медленнее с квадратом размера пакета
Вот вопрос (и ответ ), где я исследовал эту проблему.
Вкратце, если вы попытаетесь создать в памяти слишком много объектов перед вызовом DataContext.SubmitChanges ()
, вы начнете испытывать медлительность с геометрической скоростью. Я не подтвердил на 100%, что это так, но мне кажется, что вызов DataContext.GetChangeSet ()
заставляет контекст данных выполнять оценку эквивалентности ( .Equals ()
) для каждой отдельной комбинации двух элементов в наборе изменений, вероятно, чтобы убедиться, что это не двойная вставка или не вызывает других проблем с параллелизмом.Проблема в том, что если у вас очень большие партии, количество сравнений увеличивается пропорционально квадрату n , то есть (n ^ 2 + n) / 2 . 1000 элементов в памяти означают более 500 000 сравнений ... а это может занять чертовски много времени.
Чтобы избежать этого, вы должны гарантировать, что для любых пакетов, в которых вы ожидаете большое количество элементов, вы делаете все в пределах границ транзакции, сохраняя каждый отдельный элемент по мере его создания, а не в одном большом сохранении в конце. .
Некоторый код:
List<int> a = new List<int>();
for (int i = 0; i < 10; i++)
{
a.Add(i);
}
var q1 = (from aa in a
where aa == 2
select aa).Single();
var q2 = (from aa in a
where aa == 2
select aa).First();
q1 - в этом запросе проверяют все целые числа в Список; q2 - целые числа проверки до находят "правильное" целое число.