Экземпляры класса Clarity Labeling для справки

Так что я все еще новичок в C# на практике. Я потратил некоторое время на изучение о нем, но на самом деле использую его на практике.. мда. Итак, вот общая цель:

Мне нужно создать несколько экземпляров «Примера», и каждый из них должен содержать свой собственный индивидуальный список, который отслеживает несколько экземпляров другого класса, называемого «Входы», и может позже ссылаться на них. Я надеялся найти способ более или менее пометить каждый экземпляр, чтобы я мог вызывать отдельные экземпляры по определенной метке.

Мое затруднительное положение: экземпляр моего класса «Пример» будет создаваться несколько раз, и каждый экземпляр должен также несколько раз создавать экземпляр другого класса «Ввод» в зависимости от числа, указанного в переменной «_numInputs». Я буду заставлять класс «Пример» время от времени проверять «_numInputs», чтобы добавлять или удалять «Входы» из списка «Входы». Как я могу отслеживать отдельные экземпляры класса? В частности, чтобы удалить определенные экземпляры, если это необходимо.

примечание: я изучил закрытие и, насколько я понимаю, закрытие в первую очередь ориентировано на «маркировку» уникальных «типов» для методов/функций... но не экземпляров класса... если я Я ошибаюсь, не могли бы вы привести простой пример того, как я мог бы пометить каждый экземпляр класса, чтобы я мог ссылаться на него позже напрямую, не затрагивая другие экземпляры того же класса?

public class Example
{
    public List<Input> inputs = new List<Input>();
    public Example(int numInputs = 1)
    {
        for (int i = 0; i < _numInputs; i++)
        {
            inputs.Add(new Input());
        }
    }
}

person DDeathlonger    schedule 27.11.2017    source источник
comment
правки здесь сильно меняются; не могли бы вы еще раз повторить основной вопрос? есть еще что-то, на что нужно ответить? Если так, то? если это простой пример того, как я мог бы пометить каждый экземпляр класса, чтобы я мог ссылаться на него позже напрямую, не затрагивая другие экземпляры того же класса, тогда ответ прост: сохраните ссылку на экземпляр, который вы заботиться о каждом контексте   -  person Marc Gravell    schedule 27.11.2017
comment
@MarcGravell Да, это вопрос, к которому я стремлюсь, но мне действительно нужен динамический способ хранения ссылок ... когда я говорю, что собираюсь создавать несколько экземпляров, я не просто имею в виду 3 или 4, я Я имею в виду... Я буквально понятия не имею, будет зависеть от некоторой логики, чтобы определить, сколько входных данных на самом деле имеет каждый экземпляр примера, и, возможно, позже потребуется удалить указанные входные данные в зависимости от условий.   -  person DDeathlonger    schedule 27.11.2017
comment
то, по сути, вы спрашиваете, где я должен хранить ссылки на объекты; единственный хороший ответ на это: там, где они вам нужны. Трудно быть более конкретным без очень подробного контекста конкретного сценария. В частности, будьте крайне осторожны при хранении любых ссылок через поле static (например, список static или словарь) — это может показаться удобным, но по сути вы создали утечку памяти: статическое поле теперь вообще не позволяет сборке мусора работать. (для этих объектов)   -  person Marc Gravell    schedule 27.11.2017
comment
@MarcGravell Хм ... понятно .. Я закрою этот вопрос, вы дали мне несколько новых интересных вещей для размышлений. Спасибо! +1   -  person DDeathlonger    schedule 27.11.2017


Ответы (1)


Да, статические поля являются глобальными для домена приложения. Итак... не делайте его статичным? На самом деле это звучит так, как будто это должно быть частью конструктора, возможно, со значением по умолчанию 1, поэтому:

private Input[] _inputs;
public Node(int numInputs = 1) {
    _inputs = new Input[numInputs];
    for(int i = 0 ; i < _inputs.Length ; i++) {
        _inputs[i] = new Input();
    }
}

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

public int InputCount => _inputs.Length;

Обратите внимание, что это работает только в том случае, если количество «входов» фиксировано при создании экземпляра. Если это не так, то откровенно: используйте список:

private List<Input> _inputs = new List<Input>();
public Node() {} // not strictly needed unless there is another constructor somewhere

Изменить на основе комментариев, если проблема связана с порядком инициализации поля:

private int _numInputs;
private Input[] _inputs;

public Example() {
    _numInputs = 1;
    _inputs = new Input[_numInputs];
    for(int i = 0; i < _inputs.Length; i++) {
        _inputs[i] = new Input();
    }
}
person Marc Gravell    schedule 27.11.2017
comment
Я не могу сделать его нестатичным. Лол, я бы не упоминал об этом, если бы мог. Я получаю сообщение об ошибке CS0236. Инициализатор поля не может ссылаться на нестатическое поле, метод или свойство, но я также решил, что, поскольку я буду добавлять входные данные, я бы использовал список вместо массива, поэтому я отредактирую эту часть вне. В любом случае, идея использования числа в конструкторе хороша, так как ему потребуется значение по умолчанию... но это будет не единственный раз, когда я буду использовать число. Я обновлю свой пост, дай мне минутку. - person DDeathlonger; 27.11.2017
comment
@DDeathlonger Инициализатор поля не может ссылаться на нестатическое поле, метод или свойство - если проблема в этом: просто переместите его в .ctor - я добавлю пример; но это будет не единственный раз, когда я использую этот номер. - еще раз - если _numInputs всегда будет равно _inputs.Length, нет смысла его хранить - просто используйте _inputs.Length; - person Marc Gravell; 27.11.2017
comment
также: such that I might be able to reference it later directly without affecting other instances of the same class? статический метод, вызванный извне, не повлияет на экземпляр класса. static, как вы сказали, доступен во всем мире. он не повлияет ни на один экземпляр, если экземпляр не вызывает метод и не использует возвращаемое значение. чтобы делать то, что вы хотите, вы должны создать экземпляр примера, используя конструктор @MarcGravell. И вызовите поля/метод в этом самом экземпляре. - person Arno; 27.11.2017
comment
@ Drag0nvil, когда вы говорите о методах, вы имеете в виду метод конструктора, специфичный для каждого экземпляра класса? - person DDeathlonger; 27.11.2017
comment
Потому что я говорю, что мне нужно позже ссылаться на конкретные экземпляры класса в целом, а не только на метод. т.е. Все определяющие свойства и поля в рамках отдельного экземпляра класса... опять же, не только метод. - person DDeathlonger; 27.11.2017
comment
Извините, я мог неправильно прочитать. Для меня это звучало так, как будто вам интересно, или статический метод может быть вызван каким-то образом. поэтому он изменит данные из одного экземпляра, но не из других экземпляров. Если это не то, что вы имели в виду, мой плохой, извините. - person Arno; 27.11.2017
comment
@ Drag0nvil, все хорошо, чувак. Я переформулировал исходный пост, поэтому, если вы обновите его, он станет намного понятнее. Я удалил все, что касается статических полей.. лол, мне не следовало смешивать два вопроса в один. мой плохой о.о. - person DDeathlonger; 27.11.2017