(1), более внешняя тема, если Вы - новичок, таким образом, вот пример:
#include
void foo()
{
int a = 10;
static int sa = 10;
a += 5;
sa += 5;
printf("a = %d, sa = %d\n", a, sa);
}
int main()
{
int i;
for (i = 0; i < 10; ++i)
foo();
}
Это печатает:
a = 15, sa = 15
a = 15, sa = 20
a = 15, sa = 25
a = 15, sa = 30
a = 15, sa = 35
a = 15, sa = 40
a = 15, sa = 45
a = 15, sa = 50
a = 15, sa = 55
a = 15, sa = 60
Это полезно для случаев, где функция должна сохранить некоторое состояние между вызовами, и Вы не хотите использовать глобальные переменные. Остерегайтесь, однако, эта функция должна быть использована очень экономно - она делает Ваш код не ориентированным на многопотоковое исполнение и более твердым понять.
(2) используется широко в качестве функции "управления доступом". Если у Вас есть.c файл, реализовывая некоторую функциональность, это обычно выставляет только несколько "общедоступных" функций пользователям. Остальная часть его функций должна быть сделана static
, так, чтобы пользователь не мог получить доступ к ним. Это - инкапсуляция, хорошая практика.
Заключение в кавычки Википедия :
На языке программирования C, статичном, используется с глобальными переменными и функциями для установки их объема на содержание файла. В локальных переменных, статичных, используется для хранения переменной в статически выделенной памяти вместо автоматически выделенной памяти. В то время как язык не диктует реализацию ни одного типа памяти, статически выделенная память обычно резервируется в сегменте данных программы во время компиляции, в то время как автоматически выделенная память обычно реализуется как стопка устанавливающегося вызова.
См. здесь и здесь для получения дополнительной информации.
И отвечать на Ваш второй вопрос, это не похоже в C#.
В C++, однако, static
также используется для определения атрибутов класса (совместно использованный всеми объектами того же класса) и методы. В C нет никаких классов, таким образом, эта функция не важна.
Может появилось из-за разных названий компонентов? например, Button1 и button1, он компилируется с учетом регистра, но выполняется без учета регистра.
В вашем ASCX-файле просмотрите каждый элемент управления и измените его идентификатор. Например,
<asp:TextBox id="foo" />
измените его на
<asp:TextBox id="foo1" >
. Вероятно, у вас есть элемент управления с идентификатором, который соответствует свойству в вашем ascx-файле, поэтому, когда компилятор пытается заставить переменные экземпляра конфликтовать.
Я бы просмотрел ваш web.config на предмет ссылок 1.1 и 2.0 на одну и ту же DLL. В большинстве случаев, когда я получал это, это был System.Web.Extensions.
Также проверьте @registers в Pages, если это не удается.
Удачи (найти эту ошибку не очень весело!)
Дэн
This is due to what can only be described as a defect in System.Web.UI.Util.GetNonPrivateFieldType(Type classType, String fieldName) that allows UI (.aspx/.ascx) fields to compile as case-insensitive but attempts to retrieve them as case-sensitive during the intial parse.
A potential remedy for the time being is to catch it at compile-time with an ms-build task.