как это может повторная функция конкатенации строк - PullRequest
0 голосов
/ 29 марта 2020

using UnityEngine;
using System.Collections;

public class NewMonoBehaviour1 : MonoBehaviour
{
    void ConcatExample(int[] intArray)
    {
        string line = intArray[0].ToString(); // the line is the var of the first in array 
        for(i =1;i <intArray.Length; i++)     // the length is unknown ?
        {
            line += ", " + intArray[i].ToString(); //
        }
        return line;
        //each time  allocate new in original place
    }

}

Как может работать эта функция? длина массива неизвестна, так как работает for l oop Кроме того, это void-функция, но она не должна возвращать что-либо правильно, или есть какой-то исключительный случай, наконец, согласно руководству по единству, сказано, что функция будет продолжать создавать строку, но с новым содержимым в том же месте, что приведет к потреблению большого объема памяти. Почему? thx

Ответы [ 3 ]

0 голосов
/ 29 марта 2020

Эта функция НЕ МОЖЕТ работать, если не получает ожидаемые данные. Например, NULL, переданный этой функции, сгенерирует исключение нулевой ссылки во время выполнения. Передача допустимого целочисленного массива нулевой длины вызовет недопустимую ошибку индекса в первой строке.

Вы правы, функция ничего не возвращает и выглядит бессмысленной. Фактически, я ожидал, что return line; сгенерирует ошибку компилятора.

Строковый тип выглядит как «dynamici c», то есть он действительно будет выделять все больше и больше памяти по мере необходимости. Технически, это фактически строковый оператор «+» (функция, которая принимает две строки в качестве параметров), который выделяет это пространство. Эта функция возвращает новую строку соответствующего размера. Сборщик мусора будет ДЕЙСТВОВАТЬ «старые» строки, когда на них больше не ссылаются никакие переменные.

0 голосов
/ 30 марта 2020

С чего вы взяли, что Length должны быть неизвестны? Это свойство, что любой массив просто имеет

Получает общее количество элементов во всех измерениях массива.

Конечно, это не неизвестно в тот момент, когда вы вызываете свой метод с соответствующим параметром!


return line; даже не скомпилируется, поскольку, как вы говорите, метод имеет тип void, поэтому может ничего не возвращать. Вероятно, это должно быть private string ConcatExample


Тогда, что означает руководство по единству (не знаю, где именно вы читаете это), лежит в

line += ", " + intArray[i].ToString();

под капотом каждые string в c# является неизменным char[]. Таким образом, каждый раз, когда вы выполняете конкатенацию строк через stringC = stringA + stringB, то, что происходит внутри, в основном напоминает

char[] stringC = new char[stringA.Length + stringB.Length];
for(var iA = 0; iA < stringA.Length; iA++)
{
    stringC[i] = stringA[i];
}
for(var iB = 0; iB < stringB.Length; iB++)
{
    stringC[iB + stringA.Length] = stringB[iB];
}

, поэтому при работе с циклами, особенно с большими данными, настоятельно рекомендуется использовать StringBuilder как

private string ConcatExample(int[] intArray)
{
    var builder = new StringBuilder(intArray[0]);        

    for(i =1; i < intArray.Length; i++)
    {
        builder.Append(", ").Append(intArray[i].ToString());
    }

    return builder.ToString();
}
0 голосов
/ 29 марта 2020

Длина массива будет равна длине массива целых чисел, которые вы передаете в функцию в качестве аргумента.

говорят, что вы передаете его

Int[] ints = {1,2,3}
ConcatExample(ints); //the length of the array is now 3

добавьте debug.log Функция () для метода ConcatExample

void ConcatExample(int[] intArray)
    {
        string line = intArray[0].ToString(); 
        for (int i = 1; i < intArray.Length; i++) 
        {
            line += ", " + intArray[i].ToString(); //
            Debug.Log(line);
        }
    }

debug.log выдаст в консоли следующее:

1, 2
1, 2, 3

и, наконец, строку возврата; в конце просто приведет к ошибке, потому что да, вы правы, void ничего не возвращает

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