Мой брандмауэр блокировал сообщение 3307, которое прослушивает мой MySQL. Поэтому я изменил порт с 3307 на 3306. Затем я могу успешно подключиться к базе данных.
Я посмотрел на IL (используя ildasm), и это правда, что только int, установленный в 0, действительно установлен в 0 в конструкторе.
public class Class1
{
int setToZero = 0;
int notSet;
}
Генерирует:
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 15 (0xf)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldc.i4.0
IL_0002: stfld int32 ClassLibrary1.Class1::setToZero
IL_0007: ldarg.0
IL_0008: call instance void [mscorlib]System.Object::.ctor()
IL_000d: nop
IL_000e: ret
} // end of method Class1::.ctor
Если переменная i является переменной экземпляра, ей автоматически будет присвоено значение 0. Если это локальная переменная в методе, она не определена, поэтому вам нужно будет присвоить ей значение перед ее использованием.
Например:
class Program
{
static void Main(string[] args)
{
intTest it;
it = new intTest();
Console.ReadLine();
}
class intTest
{
int i;
public intTest()
{
int i2;
Console.WriteLine("i = " + i);
Console.WriteLine("i2 = " + i2);
}
}
}
Вышеупомянутое не будет компилироваться, потому что i2 не назначен. Однако присвоение 0 параметру i2, то есть
int i2 = 0;
и последующая компиляция, покажет, что обоим теперь присвоено значение 0.
Да, это почти то же самое.
Вы можете обратиться к этой статье о Coding Horror
Во всем этом выступлении стоит упомянуть ключевое слово "default" в C #.
Т.е. int i;
эквивалентно int i = default (int);
, что эквивалентно int i = 0;
и MyClass o = default (MyClass);
эквивалентен MyClass o = null;
Это особенно актуально при использовании таких методов linq, как .SingleOrDefault ()
, потому что вы всегда можете использовать следующее, чтобы сделать ваш код более читаемым:
int someValue = collection.<various linq methods>.SingleOrDefault();
if (someValue == default(int))
{
//Code for the default case
}
и
MyClass someValue = collection.<various linq methods>.SingleOrDefault();
if (someValue == default(MyClass))
{
//Code for the default case
}
Как следующие состояния ссылок, они точно такие же:
http://msdn.microsoft.com/en-us/library/aa664742%28VS.71%29.aspx
Каждый раз, когда вы создаете тип на C #, он автоматически заполняется нулями. В случае класса (ссылочного типа) это приравнивается к нулевому указателю. Таким образом, технически каждый раз, когда вы работаете с классами, следующие элементы идентичны:
MyClass class;
MyClass class2 = null;
Для типов значений (любой структуры, включая int / float / double / и т. Д.) Тип передается с нулями, поэтому следующие значения эквивалентны :
int i;
int j = 0;
Однако в методе компилятор проверяет, присвоили ли вы значение вашим типам перед его использованием. Если вы сделаете следующее, компилятор будет жаловаться:
int i;
Console.WriteLine{"{0}",i);
Технически все вышеперечисленное должно быть в порядке, но, поскольку это частый источник ошибок программистов, компилятор специально проверяет неназначенные локальные переменные и жалуется. Однако это жалоба во время компиляции, а не проблема CLR. Вы можете сделать IL, который делает это,
Они эквивалентны только для полей (переменных класса). Полям автоматически присваиваются значения по умолчанию при инициализации класса. В методе или свойстве неназначенная переменная остается неназначенной и вызовет ошибку компилятора, если вы попытаетесь получить доступ к ее значению.