Что такое худшая ошибка в C # или .NET? [закрыто]

Другой способ использования Newtonsoft.Json :

dynamic stuff = Newtonsoft.Json.JsonConvert.DeserializeObject("{ color: 'red', value: 5 }");
string color = stuff.color;
int value = stuff.value;

375
задан 9 revs, 9 users 60% 13 August 2015 в 04:30
поделиться

48 ответов

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!"

Да, такое поведение задокументировано, но это определенно не помогает.

10
ответ дан 22 November 2019 в 23:57
поделиться

Возможно, не самое худшее, но некоторые части среды .net используют градусы , в то время как другие используют радиан (и документация, которая появляется с Intellisense, никогда не говорит вам, какие именно, вы должны посетите MSDN, чтобы узнать)

Всего этого можно было избежать, если вместо этого использовать класс Angle ...

25
ответ дан 22 November 2019 в 23:57
поделиться

Использование параметров по умолчанию с виртуальными методами

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();

Выход:
производная база

29
ответ дан 22 November 2019 в 23:57
поделиться

Массивы реализуют IList

, но не реализуют его. Когда вы вызываете Add, он сообщает вам, что это не работает. Так почему же класс реализует интерфейс, если он не может его поддерживать?

Компилируется, но не работает:

IList<int> myList = new int[] { 1, 2, 4 };
myList.Add(5);

У нас часто возникает эта проблема, потому что сериализатор (WCF) превращает все списки IList в массивы и мы получаем ошибки времени выполнения.

18
ответ дан 22 November 2019 в 23:57
поделиться

События

Я никогда не понимал, почему события языковая функция. Их сложно использовать: вам нужно проверить наличие null перед вызовом, вам нужно отменить регистрацию (себя), вы не можете узнать, кто зарегистрирован (например: я зарегистрировался?). Почему событие - это не просто класс в библиотеке? В основном специализированный Список ?

14
ответ дан 22 November 2019 в 23:57
поделиться

Dictionary <,>: «Порядок, в котором возвращаются элементы, не определен». Это ужасно, потому что иногда он может вас укусить, но работать с другими, и если вы просто слепо предположили, что Dictionary будет вести себя хорошо («почему бы и нет? Я подумал, что List умеет»), вам действительно нужно вникнуть в это, прежде чем вы наконец начнете подвергать сомнению свое предположение.

(Аналогичный вопрос здесь .)

8
ответ дан 22 November 2019 в 23:57
поделиться

Худшее, что со мной случилось, - проблема с документом webBrowser:

http://geekswithblogs.net/paulwhitblog/archive/2005/12/12/62961.aspx#107062

решения AllowNavigation работают в формах Windows ...

но в компактной структуре это свойство не существует ...

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

http://social.msdn.microsoft.com/Forums/it-IT/netfxcompact/thread/5637037f-96fa-48e7-8ddb-6d4b1e9d7db9

Но для этого вам нужно держать историю браузера под рукой .. .: P

3
ответ дан 22 November 2019 в 23:57
поделиться

ASP.NET:

Если вы используете Linq-To-SQL, вы вызываете SubmitChanges () в контексте данных, и это вызывает исключение (например, дубликат key или другое нарушение ограничения), значения объекта-нарушителя остаются в вашей памяти во время отладки и будут повторно отправляться каждый раз, когда вы впоследствии вызываете SubmitChanges () .

Теперь вот реальный kicker: неверные значения останутся в памяти , даже если вы нажмете кнопку «стоп» в своей среде IDE и перезапустите! Я не понимаю, почему кто-то подумал, что это хорошая идея - но этот маленький ASP Значок .NET, который появляется на панели задач, остается работающим и, похоже, сохраняет кэш объектов. Если вы хотите очистить память, щелкните этот значок правой кнопкой мыши и принудительно выключите его! GOTCHA!

6
ответ дан 22 November 2019 в 23:57
поделиться

Linq-To-Sql и неоднозначность базы данных / локального кода

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

См. здесь и здесь для постановки задачи и решения.

3
ответ дан 22 November 2019 в 23:57
поделиться

LINQ to SQL и отношения «один-ко-многим»

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

2
ответ дан 22 November 2019 в 23:57
поделиться

Не забывайте изолированное хранение . Это дает вам место для чтения и записи файлов без необходимости указать местоположение. Иногда это единственный способ песочковых приложений (например, 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!

2
ответ дан 22 November 2019 в 23:57
поделиться

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!

1
ответ дан 22 November 2019 в 23:57
поделиться

И для 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?

5
ответ дан 22 November 2019 в 23:57
поделиться
3
ответ дан 22 November 2019 в 23:57
поделиться

Ключевое слово base не работает должным образом при оценке в среде отладки: вызов метода по-прежнему использует виртуальную диспетчеризацию.

Это отняло у меня много времени, когда я наткнулся на нее и подумал, что натолкнулся на какую-то трещину в пространстве-времени CLR, но затем я понял, что это известная (и даже несколько преднамеренная) ошибка:

http://blogs.msdn.com/jmstall/archive/2006/06/29/funceval-does-virtual-dispatch.aspx

7
ответ дан 22 November 2019 в 23:57
поделиться

Свойство DesignMode во всех UserControls фактически не сообщает вам , если вы находитесь в режиме разработки.

7
ответ дан 22 November 2019 в 23:57
поделиться

Пакеты LinqToSql становятся медленнее с квадратом размера пакета

Вот вопрос ответ ), где я исследовал эту проблему.

Вкратце, если вы попытаетесь создать в памяти слишком много объектов перед вызовом DataContext.SubmitChanges () , вы начнете испытывать медлительность с геометрической скоростью. Я не подтвердил на 100%, что это так, но мне кажется, что вызов DataContext.GetChangeSet () заставляет контекст данных выполнять оценку эквивалентности ( .Equals () ) для каждой отдельной комбинации двух элементов в наборе изменений, вероятно, чтобы убедиться, что это не двойная вставка или не вызывает других проблем с параллелизмом.Проблема в том, что если у вас очень большие партии, количество сравнений увеличивается пропорционально квадрату n , то есть (n ^ 2 + n) / 2 . 1000 элементов в памяти означают более 500 000 сравнений ... а это может занять чертовски много времени.

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

0
ответ дан 22 November 2019 в 23:57
поделиться

Некоторый код:

        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 - целые числа проверки до находят "правильное" целое число.

-1
ответ дан 22 November 2019 в 23:57
поделиться