Добавление случая, когда имя класса для объекта, используемого в структуре сущности, такое же, как имя класса для файла с кодировкой веб-формы.
Предположим, у вас есть веб-форма Contact.aspx, чей класс codebehind Свяжитесь с вами, и у вас есть имя объекта Contact.
Затем следующий код вызовет исключение NullReferenceException при вызове context.SaveChanges ()
Contact contact = new Contact { Name = "Abhinav"};
var context = new DataContext();
context.Contacts.Add(contact);
context.SaveChanges(); // NullReferenceException at this line
Ради полноты класса DataContext
public class DataContext : DbContext
{
public DbSet Contacts {get; set;}
}
и класс сущности контакта. Иногда классы сущностей являются частичными классами, так что вы можете распространять их и в других файлах.
public partial class Contact
{
public string Name {get; set;}
}
Ошибка возникает, когда оба класса entity и codebehind находятся в одном и том же пространстве имен. Чтобы исправить это, переименуйте класс сущности или класс codebehind для Contact.aspx.
Причина. Я все еще не уверен в причине. Но всякий раз, когда какой-либо из классов сущностей расширяет System.Web.UI.Page, возникает эта ошибка.
Для обсуждения рассмотрим NullReferenceException в DbContext.saveChanges ()
Он вводит тип указателя функции, указывая на функцию, которая ничего не возвращает (void), не принимает никаких параметров и не называет новый тип MCB .
typedef определяет MCB
как тип указателя на функцию, которая не принимает никаких аргументов, и возвращает void
.
Обратите внимание, что MCB Modes::m_process = NULL;
является C ++, а не C. Кроме того, в C, typedef действительно должен быть typedef void (*MCB)(void);
.
Я не уверен, что вы подразумеваете под «память была освобождена». У вас есть статический указатель на функцию; функция не может быть освобождена. В лучшем случае ваш указатель был сброшен где-то. Просто отлаживайтесь с памятью на m_process
.
Это указатель на функцию. Вы получаете сообщение SEGMENTATION FAULT, потому что пытаетесь сделать вызов функции, адрес которой недействителен (NULL
).
В соответствии с вашим конкретным образцом функция не должна возвращать значение (void
) и не должен получать никаких параметров ()
.
Это должно работать:
void a()
{
printf("Hello!");
}
int main(int arcg, char** argv)
{
m_process = a;
m_process(); /* indirect call to "a" function, */
// Hello!
}
Указатели функций обычно используются для обработки некоторых форм обработки событий в C. Это не единственное его использование, хотя ...