Разница между объявлением и инициализацией - PullRequest
0 голосов
/ 15 мая 2018

Я очень новичок в C # и в программировании в целом, и есть кое-что, что меня интересует, в отличие от простого объявления чего-то против инициализации.Например, если я использую метод String.Split(), в документации говорится, что он возвращает массив с символами с разделителями, но почему я не могу получить доступ к этому массиву?Я должен сделать что-то вроде:

string [] array = mystring.Split()

Есть ли способ работать с чем-то, что было только объявлено, но не инициализировано?Что происходит во время выполнения с вещами, которые были только объявлены (переменные, массивы и т. Д.)?Спасибо.

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

почему я не могу получить доступ к этому массиву?

Вы можете, вам не нужно помещать результат в переменную:

System.Diagnostics.Debug.Print(mystring.Split()[0]); //will print the value of index 0. This is dangerous.

Есть ли способ работать с чем-то, что было только объявлено, но не инициализировано?

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

int four; //0
double two; //0
string[] fizbo; //null
object food; //null

Что происходит во время выполнения с вещами, которые были только объявлены?

Вам следует прочитать о том, что происходит, когда вы объявляете объект, и что происходит, когда вы объявляете ссылочный тип.

См .: https://www.codeproject.com/Articles/76153/Six-important-NET-concepts-Stack-heap-value-types

0 голосов
/ 15 мая 2018

Вы объявляете переменную, указав ее тип и имя:

string[] array;

Вы инициализируете ее, задав ей начальное значение:

string[] array; // declare
array = mystring.Split(); // initialize

В c #, как и во многих других программахязыки, вы можете объединить оба действия в одну строку кода:

string[] array = mystring.Split();

Когда вы делаете это с локальными переменными, рассмотрите возможность использования var вместо явного использования типа переменнойв объявлении, но только в тех случаях, когда тип переменной может быть легко выведен из правой части оператора присваивания:

var list = new List<int>(); // best.

var array = mystring.Split(); // still quite good.

var myVar = SomeClass.SomeMethodThatWeDoNotKnow(); // not so good...

Причина этого в том, что это очевидно для всех, кто читает кодэто list из List<int>, в то время как вы должны знать, какая строка. Split возвращается, чтобы узнать, что array является массивом строк, и вам нужно навести курсор мыши на ключевое слово var, чтобы узнать, какой типis myVar.

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

int a;
Console.Write(a);

приведет к ошибке компиляции:

Использование неназначенной локальной переменной 'a'

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

if(myString.Split()[0] == someSubString) // use a value from the array
{ /* do some stuff here */ }

var result = SomeClass.Method().ToString(); // use ToString on the return value of Method

или просто игнорировать возвращаемое значение, если вы неэто не нужно:

// Just an example, don't do that with TryParse!
int i;
int.TryParse(s, out i); // if fails, i will be initialized to it's default value - 0

// do some other stuff
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...