Вопрос инициализации переменной C #

Мой брандмауэр блокировал сообщение 3307, которое прослушивает мой MySQL. Поэтому я изменил порт с 3307 на 3306. Затем я могу успешно подключиться к базе данных.

14
задан Tim Cooper 25 September 2011 в 01:54
поделиться

7 ответов

Я посмотрел на 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
7
ответ дан 1 December 2019 в 09:33
поделиться

Если переменная 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.

14
ответ дан 1 December 2019 в 09:33
поделиться

Да, это почти то же самое.

Вы можете обратиться к этой статье о Coding Horror

4
ответ дан 1 December 2019 в 09:33
поделиться

Во всем этом выступлении стоит упомянуть ключевое слово "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
}
1
ответ дан 1 December 2019 в 09:33
поделиться

Как следующие состояния ссылок, они точно такие же:

http://msdn.microsoft.com/en-us/library/aa664742%28VS.71%29.aspx

1
ответ дан 1 December 2019 в 09:33
поделиться

Каждый раз, когда вы создаете тип на C #, он автоматически заполняется нулями. В случае класса (ссылочного типа) это приравнивается к нулевому указателю. Таким образом, технически каждый раз, когда вы работаете с классами, следующие элементы идентичны:

MyClass class;
MyClass class2 = null;

Для типов значений (любой структуры, включая int / float / double / и т. Д.) Тип передается с нулями, поэтому следующие значения эквивалентны :

int i;
int j = 0;

Однако в методе компилятор проверяет, присвоили ли вы значение вашим типам перед его использованием. Если вы сделаете следующее, компилятор будет жаловаться:

int i;
Console.WriteLine{"{0}",i);

Технически все вышеперечисленное должно быть в порядке, но, поскольку это частый источник ошибок программистов, компилятор специально проверяет неназначенные локальные переменные и жалуется. Однако это жалоба во время компиляции, а не проблема CLR. Вы можете сделать IL, который делает это,

0
ответ дан 1 December 2019 в 09:33
поделиться

Они эквивалентны только для полей (переменных класса). Полям автоматически присваиваются значения по умолчанию при инициализации класса. В методе или свойстве неназначенная переменная остается неназначенной и вызовет ошибку компилятора, если вы попытаетесь получить доступ к ее значению.

0
ответ дан 1 December 2019 в 09:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: